Sous-vide: Mad og elektronik i én skøn forening

image_pdfimage_print

Sous-vide: Mad og elektronik i én skøn forening…

Sous-vide er lige som “low and slow” med grillen en teknik der fascinerer mig. Det går helt enkelt ud på at vacumpakke det og så tilberede det i varmt vand i mage timer. Vandtemperaturen vælges efter hvilken temperatur kødet skal ende på. Som med low and slow giver man med langtidstilberedning kødet mulighed for at nedbryde fibrene så kødet bliver utroligt mørt.

Såe… sår’n en dims må jeg da ha’ 🙂

Man kan selvfølgelig bare købe den færdig (se eks. her: link). For omkring 2500 kr er man i gang. Men nu er jeg jo både nørdet og nærig :-). Jeg har nu godt nok købt en vacuumpakker. Så fokus for denne blog er at bygge en Arduino-baseret temperaturstyring.
Der er følgende elementer i min sous-vide gryde:

  • sous-videTemperaturmåling
  • Styring af varmelegeme
  • Cirkulation
  • Temperaturregulering
  • Display / setpoint-justering
  • Kar

Denne blog handler om elektronik og firmware – senere kommer en anden om mekanikken.

Temperaturmåling

20160305_165649Jeg har købt en vandtæt temperaturføler. Den indeholder en DS18B20 (link) Maxim 1-wire temperaturføler – altså et digitalt serielt interface. Jeg lavede i sidste indlæg en gennemgang af sensoren og dens interface – så derfor se her: link.

Der viste sig dog nogle problemer med sensoren da jeg byggede den første mockup… 230V delen af projektet smadrede simpelthen one-wire bussen fra tid til anden. Jeg lavede derfor et simpelt filter der kasserer målinger der afviger mere end 5 grader fra den forrige måling. Det virker hæderligt omend der stadig slipper en ukorrekt måling igennem fra tid til anden. Der er absolut plads til forbedring.

Styring af varmelegeme

solid-state-relayVarmelegemet er faktisk bare en dyppekoger der er forbundet til et relæ. Eller faktisk er det ikke et relæ men et solid-state relæ. Et solid state relæ er en switch baseret på enten thyristorer eller FET-transistorer.

 

20160227_195153Så – faktisk bare et relæ med mindre strøm til trækspolen og mindre larm :-).

Denne her kan styre 230V / 2A load med et 5V styresignal. Da varmelegemet jeg skal styre er på 300W (~300W/240V=1.25A) er det helt fint.

Søg efter “Solid-State Relay 2A” – den koster omkring 0,99 GBP.

Signalet er active low – så 0V er tændt og 5V er off. Og i softwaren er det eneste jeg skal tænke på at sætte den port jeg vælger til et output og så ellers sætte den on/off:


pinMode(13, OUTPUT); //define pin as output

digitalWrite(13, LOW); //turn heater on

digitalWrite(13, HIGH); //turn heater off

…MEN…AAAGRHHH… De solid state relæer jeg havde fået virker ikke… Jeg testede to stk… Heldigvis stoppede jeg der – og blev opmærksom på at min dyppekoger ikke var 300W (1.25A) – men 500W (2.1A)… lidt googling viser også at man ikke kan stole ret meget på de 2A de er rated til… Det er nok ikke Omron der er inden i trods det der står printet uden på…

Jeg testede en ny med en 40W el-pære – og så virkede den pludselig meget bedre…

Men – det løser jo ikke opgaven. Heldigvis havde jeg også købt nogle 10A solid state relæer – så det endte med sådan en i stedet. De er så active high – så high på udgangen give tændt heater.

Styring af cirkulation

6v 30 rpm motor“Rørepinden” drives af en gearmotor jeg har fundet på ebay. Det er en 6V DC-motor der kører med 60 omdr/min. Arduino’ens ben kan ikke trække strøm nok så jeg har brug for et eller andet til at drive motoren.

Rørepinden skal egentligt køre hele tiden – så måske skulle jeg bare sætte den direkte på strømforsyningen… Meeen omvendt vil jeg egentligt gerne kunne starte og stoppe den langsomt så det ikke skvulper så meget… Og til det formål vil det være smart med en PWM udgang.

fetOg – hov! Nederst i bunken af stumper fandt jeg et IRF520 baseret modul – det er godt nok en 9.2A fet… men det er vist fint nok :-)… Man skal dog lige huske at sætte en diode over motorterminalerne så man ikke risikerer at motoren “sparker igen” når man slukker FET’en. Årsagen til at en motor gør det er dels at der er en spolevirkning  i viklingerne der forsøger på at holde strømmen konstant – og med open circuit så øger den spændingen for at forsøge at få strømmen til at løbe. Desuden “vender” motoren om og bliver en generator når man afbryder den og den bremser op. Den strøm motoren genererer skal kunne  løbe et eller andet sted hen – ellers får man samme effekt med høje spændinger. Og har man høje spændinger så er det bare et spørgsmål om hvad der går i stykker først… 🙂

I firmwaren er det eneste der er nødvendigt at skrive en analog spænding til den PWM-udgang man vil bruge. Hvis man kan leve med 1kHz pwm-frekvens så er det en nem måde at lave PWM-styring på… Så jeg slipper i denne omgang for at tilpasse det H-bro library jeg lavede til robotbilen (link).

Der viste sig i praksis at være nogle mindre problemer med den opstilling… Nemlig at 60 omdr/min slet ikke er nok til at få vandet til at cirkulere. Jeg satte en strømforsyning i serie med motoren – så den fik omkring 12V i stedet for 5V… Og det hjalp. Så – nu har jeg bestilt en motor med en højere gearing – måske for høj men så kan jeg jo reducere den med PWM’en.

Temperaturregulering

Temperaturreguleringen har jeg i første omgang lavet som en helt simpel bang-bang regulering. Det vil sige at jeg tænde varmelegemet hvis temperaturen er 0,5 grader under setpunktet og slukker det når temperaturen er 0.5 grader over setpunktet. Det har vist sig at virke bedre end forventet – men når jeg får analyseret på opvarmningskurverne så vil jeg vurdere om jeg skal gøre noget ved det.

Display / temperaturjustering

20160402_162310Jeg har købt et 2×16 LDC keypad shield – altså et print med display og knapper der passer lige ned på Arduinoen. Og det er f… fikst 🙂
Det almindelige arduino LCD-library (LiquidCrystal.h – link) virker perfekt. Shielded bruger pin 4-9 – så det eneste man skal gøre er at oprette objectet med benene som parameter på constructoren. Derefter kalde “begin” med størrelsen af displayet – her 2×16 tegn. Endelig er det bare at gå i gang…:


LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //configure pins

lcd.begin(16, 2); //2x16 display

lcd.setCursor(10,1); //pos 10 line 2

lcd.print("Hest"); //print...

 

Nu er der jo også nogle knapper… De er sat på med en spændingsdeler så hver knap repæsenteres af en spænding som kan måles med en analog indgang. Med en 10 bit ADC er der 2^10 mulige værdier – altså fra 0-1023:

Key Voltage ADC
right < 6% <61
up 6 – 20% <205
down 20-40% <410
left 40 – 60% <614
select 60-80% <819
none 80 – 100% >819

så:


enum KEYS {none, right, up, down, left, sel};

int vKey = analogRead(keyPin); //read keyboard input
KEYS key = none; //default to no key pressed
//detect keypad position
if (vKey &lt; 60)
{
key = right;
}
else if (vKey &lt; 200)
{
key = up;
}
else if (vKey &lt; 400)
{
key = down;
}
else if (vKey &lt; 600)
{
key = left;
}
else if (vKey &lt; 800)
{
key = sel;
}

 

Hvis man ikke gør andet vil koden tro at man har trykket på en knap hver gang man kalder funktionen (altså mens man holder knappen nede). Det vil i praksis betyde a knappen repeterer med en ukendt hastighed. For at undgå det har jeg lavet en stump ekstra kode der både sørger for at ét tryk kun giver respons én gang OG sørger for at repetere med en kendt hastighed:


KEYS lastKey; //which key was previously detected (or none)
unsigned long lastKeyTime; //time where key was activated
unsigned long repeatTime=200; //time between repeated keys (configurable)

//detect key released / new key / repeat delay
if ( (key != lastKey) || (millis() - lastKeyTime &gt;= repeatTime) ) //change of key or key repeat time
{
lastKey = key; //save new current key
lastKeyTime = millis(); //reset the last key time
}
else
{
key = none; //key already registered - wait for key release, new key or repeat delay
}

Tilgiv at ovenstående kode er lidt rodet – jeg har lavet det som en klasse der oprettes og kaldes gennem sit interface. Se kode-linket herunder.

Strømforsyning

Jeg har købt nogle små 5V / 2A strømforsyninger. Simpelt og nemt :-).

Diagram

2016-04-23

Firmware

Jeg har ad flere gange optimeret lidt på koden – både UI, struktur og funktionalitet. Konkret er der kommet et ur til, koden er blevet strukturet bedre og jeg fik fikset nogle læsefejl fra temperaturføleren.

Du kan hente arduino-imaget her:  Download

Summary – og test 🙂

20160305_165639Skrue skrue skrue… Og voila blev konstruktionen sat sammen.

20160404_212406Første udgave var som nævnt voldsomt ustabil. Temperatursensoren gav fejlmålinger og koden gik ned med jævne mellemrun :-). Det opdagede jeg på den hårde måde ved første test 🙂 Koden crashede med varmelegemet tændt – og vandet nåede op på 80-90 grader. Det var lidt mere end plastikkarret kunne holde til – så det buler lidt nu… Godt jeg havde stillet den i vasken!!!

20160404_212301Jeg fik så det hele bygget lidt mere permanent sammen – med en mere hensigtsmæssig kabelføring og klar adskillelse af 230V og 5V. Det hjalp. Så forleden lavede jeg første test med en enkelt bøf 2 timer ved 54gr og dagen efter med en tyndsteg 11 timer ved 57gr. Begge var fine resultater – omend stegen var mere gennemstegt end jeg selv foretrækker :-).

20160403_160619

One thought on “Sous-vide: Mad og elektronik i én skøn forening

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.