Sous-vide cooking is a great new way of cooking food. I will not explain why and how it works here... for great recipes and explanations, you can check out those guys :


Unfortunately, a good (and I mean precise to the half °C) sous-vide machine is very very expensive (500, 1000$ or more). If you wonder why you need such precision, I suggest you check this out :


Some Arduino-based designs come cheap (50, 60$), but as they are based on PID regulation , they require adequate tuning to perform well. Good PID tuning is very hard to achieve in practice, so those designs don't hold well against reality (at least, in my experience). Also, who needs a 20$+ LCD screen when a cheap 5$ led 8-digits display does a better job in terms of readability.

After weeks of work and tests, I came up with my own design, with the primary goal of useability in mind. Behold the "Adaptative regulation sous-vide cooker"

Features :

  • Works out of the box : no need for tweaking or tuning, the software adapts itself to the characteristics of your cooker : whether it is big, small, full of water, half-full, whether room temperature is low or high, it works.
  • Efficient regulation in the range of 0.5°C
  • Sound alarm warns when target temperature is reached
  • Automatic detection of lid opening and closing : regulation does not get mad when temperature probe is taken out of the water (which is a thing you need to do if you want to actually put food in your cooker)
  • Safety features :
    • automatic cut-off after 5 minutes of continuous heating providing no change in temperature
    • automatic cut-off after 24 hours of operation

    • automatic cut-off when temperature reaches 95 °C

    • allows target temperature only in the safe 50°c to 90°C range

  • Dead cheap and simple : no expensive LCD or Solid State Relay

Step 1: Gather Your Stuff

Parts needed :

  • Arduino board - approx 20$
  • Integrated 8 digits led display with MAX7219 control module (3 wire interface) - 5$
  • Pushbutton x 2
  • Piezo buzzer - 3$ (optional)
  • Waterproof DS18B20 Digital temperature sensor - 10$
  • 4.7K ohm resistor
  • 5V Relay module for Arduino, capable to drive AC125/250V at 10A - 4$
  • Rice Cooker
  • A wood board, plastic box and silicone sealant for protection of the high current part of the circuit
  • Drill

You'll be set for approx 40$, maybe even less. That's not counting the rice cooker.

Step 2: Attach Temperature Sensor to the Lid

  • Drill a hole through your lid to put the sensor. It should be pretty central
  • Find the adequate length of cable to let the sensor sit in the middle of the water when immersed
  • If you can, put the sensor in a "cage" which will isolate it from potentially cold food and let it do its job of measuring water temperature. It should be stainless steel. I used a metallic honey spoon.
  • Stick some silicon to hold together sensor cable and lid
  • Let it set for a night or so

Step 3: Relay Enclosure (updated for Safety!)

Since you'll be having a rice cooker full of water when in operation, you'd better protect the high voltage part of the circuit against spills.

I choose to put the relay under a transparent plastic box and to seal the whole thing with silicon.

  • Rip-open the high voltage cable (please make sure it is not plugged) and cut the Phase wire (not the ground or neutral one). You can check on this page which is the color code you're looking for depending on the part of the world you're in. Many thanks to Sembazuru for pointing that out. You can notice that I choose wrongly to cut the blue wire which is the Neutral. As I live in europe, I should have picked the brown wire.
  • Connect the two parts of the wire to the high voltage part of your relay. Make sure the relay is Open by default.
  • Use screws and cable holders to solidly maintain the relay and cable
  • Put your plastic box over it and seal with silicon
  • Let it set for one night

Step 4: The Circuit

Wiring is pretty easy :

Inputs :

Pushbutton 1 :

  • one end on pin 6 , the other to ground

Pushbutton 2 :

  • one end on pin 5 , the other to ground

Temperature sensor :

  • red wire to 5V
  • black wire to ground
  • other wire (yellow or white) on pin 9 (data pin of OneWire sensor). Also linked on pin 9 is a 4.7K ohm resistor whose other end goes to 5V.

Outputs :

Piezo buzzer :
  • one end on pin 13 , the other to ground

Relay :

  • VCC to 5V and GND to ground
  • Command wire on pin 8

8-digit LED display :

  • VCC to 5V and GND to ground
  • DataIn on pin 12
  • CLK on pin 11
  • LOAD on pin 10

Step 5: Code

The Arduino code for this project can be found here :


Upload and enjoy!

Note : you will need the following libraries installed in your Arduino Environment to be able to compile the project :

To install a library in your environment, follow this guide here : http://arduino.cc/en/Guide/Libraries

Step 6: One Last Thing

You'll want to pull away your food from the bottom of the rice cooker so that it is heated by the ambient liquid, not by the heater itself. To do that, I used some stainless steel frame pulled out some cooking utensils.

Voilà. Enjoy ... et bon appétit!

Step 7: Use It!

Use the 2 pushbuttons to set the target temperature (acceptable temperatures are within the 50°C to 90°C range).

The actual temperature can be monitored on the led display.

It is advisable not to open the lid during the initial heating phase, where the characteristics of the rice cooker are monitored.

When the buzzer sounds, you can open the lid and put your bagged food in the water.

If you connect the Arduino to your PC, data is sent to the serial port. Once stripped, this data can be used to plot the temperature over time.

<p>I really liked the concept of this project. The ability to plug into <br> any type of heating device (crock pot, rice cooker, 5 gallon pot with <br>an installed water heater element) and have the software automatically <br>adjust to each is a great idea. I put my build in a 4x6x6 electrical <br>box, swapped the relay for a 25a ssr, and added switches for main power <br>and pump control. Controlling a GFCI outlet with the ssr means I can <br>safely use the unit with a submerged electric element. The led on the <br>top left lights up when the ssr triggers power and there is an led on <br>the GFCI so I will know if the ssr ever goes out. The led in the top <br>middle lights up when the switch below it is on and providing power to <br>the pump. I used an RJ-45 pair to link the temp probe, but I will use a <br>three prong plug next time. The RJ-45 proved a bit difficult. Overall, <br>this was a fun, practical build and I learned a lot in the process of <br>making the controller.</p><p>As an added bonus, it ran for <br>eight hours today connected to our large crock pot (pictured). According <br>to the Kill-a-Watt EZ it is plugged into, it cost $0.30 for the twelve <br>hour run. That cooked two thin pork chops for lunch, two thick pork <br>chops for supper, and three chicken breast for tomorrow.</p><p>A big 'Thank You' to Etienne Giust for the instructable and code.</p>
<p>For safety reasons, when switching AC one should always switch the &quot;line&quot; conductor or both the &quot;line&quot; and &quot;neutral&quot; conductors. In step 3 you have spliced the relay into the wrong conductor. IEC color codes (most of Europe) have blue wire the &quot;neutral&quot; conductor. You should have spliced the relay into the brown wire (this is the IEC &quot;line&quot; or &quot;hot&quot; conductor). If the power cord is made to US NEC or Canadian CEC codes, the wire to splice the relay in would be the black wire.</p><p>See http://www.allaboutcircuits.com/vol_5/chpt_2/2.html</p><p>I'm not sure for the rest of the world. I would suspect Mexico either uses the US NEC (or mirrors it) simply due to proximity and simplicity of product flowing across the boarder, but I'm not sure about the rest of Central America or even South America. Asia and Africa... Nope, I don't know what standards they use for electrical AC wiring color codes. Check your local standards. ;-)</p>
<p>However, turn the cable around in the socket and live becomes neutral. There is no left and right like in US and UK plugs, either or might be live which I find poor design. :) But then again polarity agnosticism is one of the advantages of AC-current so why not make use of it. ;)</p>
<p>Sembazuru, thanks to point that out. I'll update my posting to reflect that.</p>
<p>Small wire cooling racks work well for this too. I do that for baking in my cast iron dutch oven while camping.</p>
<p>Here's mine =)</p>
<p>Excelllent Project. I replaced the LED displays with a 16x2 LCD I had on hand and modified the sketch to add labels for Actual and Set temperature. Also I intend to add a timer to count the time from the moment the food is put in water. I did not have a rice cooker, so I used a very old potato home fryer. Initially the regulation went nuts. After some thought I concluded that the problem was the high wattage of the fryer, which was 1600 Watts. I put a 10Amp, 1000Volts diode in series with the heating element to cut power in half. It worked as advertized. Temperature regulation was within +/- 0,2 degrees C.</p>
<p>Is your display a 16x02 I2C? Can I see your code, please?<br>I can&acute;t config mine... <br>Thanks!</p>
<p>Sorry Luiz for the delayed answer. Yes, the LCD is 16x2 characters and is driven by an I2C board. Please send me your email, so I can send you the .ino file </p>
I've done this project with ssr-NO relay and 16x02 l2c display, small changes at the code and everything works fine, except my temperature sensor. It only measures 0.5&deg;C intervals, can anyone explain why?<br>I'm new to arduino, wish you guys could help!
<p>I&acute;ve just noticed that the code doesn&acute;t set up the Temperature probe resolution.... it asks for the resolution in the beginning, but it doesn&acute;t SET the resolution in the middle of the code.<br><br>Sensor.setResolution([sensor],[resolution]);<br><br>Will do the trick.<br>Thanks again for this project!</p>
<p>Hi Etienne<br><br>I made this project, and its totally awesome. Thank you so much !<br>I have a question though. When using this with a pot on a single &quot;stove&quot; (electrical, 1500W) with 8 liters of water, I have about -3 - +3 degrees in difference most of the time - seems very unstable. But when using a kettle with about 1.5 liters, it works perfect, within 0.1 degrees.<br><br>Do you have any idea to what could be the problem?<br><br>I have a suspicion that it might be because the single stove / hot plate has its own thermostat, thus turning off before the controller 'thinks' it is off. I have tried starting with 50 degrees hot water so it doesnt have to bring it up 40 degrees, thus NOT turning the thermostat off during ramping. But doesnt make any difference.<br><br>Cheers, Jannick</p>
<p>Probably the most simplest build i could find!</p><p>i have an LCD instead of an 8 Digit LED inside my Learning KIT and lacking in just the temperature sensor, so im gonna order just that part . currently,i am still very new to arduino, so learning by following steps is the only thing i could do. At the same time, im also hyper excited to build my own sous vide cooker! (the reason im jumping into this build). can you help a brother out and show me the steps of wiring the LCD and show me how to tweak your code for the LCD replacement? im sooo close into finishing one!</p><p>Cheers!</p>
<p>Hey there, I just built this up (although I made some mods in the code to accomodate the HW I had) and if that's the LCD 1602 driver then you can just use the LiquidCrystal.h library and modify the code as you need. I had to go through and comment out a lot of LED driver stuff and swap for lcd code. I can show you what I did if you like (it's really, REALLY crude. I'm pretty bad at code.)</p>
Do you guys thinking of wifi module? So you can turn it on/of or change temperature?
<p>Made it. I changed the display for a fancy one. But kept the wonderfull work you have made for the command control ! Thanks !</p>
<p>i built one of these controllers. but I'm having a problem with the control routine</p><p>it looks to be working fine. ramps up. catches the temperature and regulates for a bit.or it regulates for a while. (hours) then starts oscillating and eventually just but for no reason the it just Stops heating. and the temperature drops.</p><p> below is the last output from the serialport before it drops.<br>No more serial data. and the display is not updating the temperature.</p><p><br> --- avgTemp3 = 55.1250000000 --- maxRegTEmp = 55.5625000000 --- minRegTEmp = 55.1250000000 --- tMaxReg = 4600798 --- tMinReg = 4173811<br>5905; 55.062<br>d = 0.0000000000<br> --- avgTemp3 = 55.1041679382 --- maxRegTEmp = 55.5625000000 --- minRegTEmp = 55.1041679382 --- tMaxReg = 4600798 --- tMinReg = 5906701<br> --- neededUptimeForCompensate = 56309</p><p>neededUptimeForCompensate = 56309 seems to be where it hangs</p><p>any ideas what could be wrong ? have tried other sensors. the hardware looks to be fine</p><p>Rune</p>
<p>Thank you for this amazing work ! Just finished mine and straight away went to buy a 470g (~1 lbs) steak from the butcher (he put it in a vacuum bag for me). My rice cooker is a bit small but powerful (1.5L - 1000W) and the temperature reached 64&ordm;C (147&ordm;F) in more or less 10min. When I added the steak it overshot the requested temperature by about 4&ordm;C but then went down slowly and maintained it within 0.4&ordm;C.</p><p>I did run into some problems while mounting it :</p><p>1/ First time I wired it on the Arduino Nano the display would only display 0 / 0. I disconnected everything and wired it on the Arduino Uno for easier troubleshooting and it worked straight away (even with the temperature sensor out in the air and the rice cooker disconnected). I wired it back on the Nano and it worked as well, I guess the wiring was incorrect the first time but couldn&rsquo;t figure where.</p><p>Also on my 8 digit display, LOAD (that goes to pin 10) is labelled as CS.</p><p>2/ The Relay would not open once the requested temperature was reached (and neither would it open reaching 95&ordm;C). For some reason that I do not understand, I had to plug the relay on the Normally Closed pins, which made it work the way it should. If anybody has a logical explanation, I&rsquo;m listening.</p><p>I hope this will help those having similar problems.</p><p>I did enjoy my perfectly cooked and tender steak and looking forward try new recipe in my inexpensive sous-vide cooker :-D</p>
<p>the code is written for &quot;active high&quot; relay. meaning a 5v signal on the GPIO clicks the relay. i am using &quot;active low&quot; relays. meaning a low signal clicks the relay.</p><p>you likely have the active low type. i just modified the code.</p>
Just finished it ?<br>I had a Redbot mainboard lying around. Working fine as an Arduino Uno. A0 is pin 14, A1 is 15, and so on. Other pins maps to the same pins. Eg. pin 3 is pin 3. I damaged the temperature sensor because I didn't realise that not all VDC-pins is 5V. Some of them is the same as input voltage. <br><br>Thank you for your work Etienne. <br><br>Best regards, <br>Anders
<p>I was nearly done with my build but I ran into some trouble, as it was expected since this is my first time with an Arduino</p><p>First of all my LED display doesn't show any temperature, it just shows a 0 in each screen. I suspect this may be a problem with the temperature sensor not actually detecting anything. (The sensor wasn't inside the rice cooker, nor was the relay powered)</p><p>2nd. my relay doesn't turn on the LED's in it, is at least one of them always supposed to be on?<br></p><p>3rd I don't have the buzzer in my build, could this be causing any issues?</p><p>Thank you so much for any reply, can't wait to enjoy my sous vide cooker!<br>Cheers</p>
<p>Late reply sorry, you probably have sorted out the problems by now but for anyone else....</p><p>Even if the temp probe is not in your cooker you should still see ambient temp and when you initially power up the set point will be equal to the ambient so you should see number in both segments. Maybe run the LDCdemo sketch just to check that the display is correctly connected and working OK.</p><p>I have a relay with a red LED built it and that turns on fine......I wonder where the LED is powered from.....maybe the voltage is reversed? Can't think of any other reason why the relay would work but not the LED indicator.</p><p>I don't have a buzzer in my build. Works fine. The Buzzer is on an output so the board doesn't know or care if there is anything connected or not.</p><p>Cheers</p>
Hey, <br>thanks for the reply anyway!<br><br>I figured out that one of my jumpers connecting the temp probe was a bit torn and the relay I had bought didn't work at all so I just replaced those and it's been working for months now.<br><br>Cheers!
Well I managed to pack it all into a reasonably sized box. With the glands and seal around the lid it is pretty well splashproof. To make it self contained, I pulled apart a wallwort to provide power and used a 2 channel touch switch wired to the two pads on the top surface. <br><br>The temp regulation works fine and generally seems to be holding it at better than 0.5c.<br><br>Thanks for the code and the instructable Etienne, great job.
<p>I'm trying to make this at the moment but I'm a little confused as I'm new to arduinos. The instructions say to connect to pin 5, pin 6, pin 9 etc but my arduino nano has two sets of pins. I have A pins and D pins. Should I be connecting to pin A5 or D5? A9 or D9, etc? Thanks</p>
<p>well the answer to this question, for the benefit of anyone who finds it in future and who also doesn't know, is the D pins are the correct ones to use </p>
<p>mine is now half-built but working and in functional test phase (which means I couldn't wait to tidy it all up before using it to cook dinner tonight)..! Fantastic project, although I'm new to Arduino stuff it was easy to figure out and I only had one problem which was that I ride to pin 7 instead of pin 9, but a quick edit to the code died that thanks for your efforts Etienne </p>
<p>This bile is what turned me on to Sous Vide cooking. Excellent!</p>
<p>I have a question (hope it doesn't sound too stupid) - the 5V relay can drive AC125/250V at 10A, so would it be safe for 220V in Asia? I do have transformers by the bedside, but just to be sure :s</p>
<p>Made it in April 2014. Converted it to work in and display Fahrenheit temperatures. I use a 40 cup coffee pot with temperature cutoff bypassed.</p>
<p>Thanks so much for these instructions! I had been eyeing my slow cooker for a long time trying to devise a way to get more accurate temp regulation for sous-vide as well as culturing yoghurt. I found some weird old dental tool case that ended up being the perfect size for the various components. This was my first Arduino project and I now see potential for micro controller projects everywhere I look. </p><p>One question though. I've seen a lot of pictures that have the actual temp displayed with 0.1 degree precision as opposed to the 0.5 I have. I have played with the sketch a little, though without any luck. I tried changing the following line to 10, 11, and 12 bit though no changes. </p><p>#define TEMPERATURE_PRECISION 9</p><p>I also tried adding the following line directly after the sensors begin command, though again, no change - </p><p>sensors.setResolution(tempProbeAddress, 12);</p><p>I'm new to the arduino ide and any help would be appreciated. </p><p>Awesome instructable, Thanks Etienne Giust!</p>
<p>Thanks from the instructions! I'm completely new to Arduino and DIY electronics in general and I'm going to get my feet wet this project. A couple of questions I have:</p><p>-The parts I was going to get are these: Arduino Leonardo (<a href="http://www.dx.com/p/diy-eduino-leonardo-module-blue-black-213956" rel="nofollow">http://www.dx.com/p/diy-eduino-leonardo-module-blu...</a>), relay module (http://www.dx.com/p/arduino-5v-relay-module-blue-b... temperature sensor (http://www.dx.com/p/water-proof-ds18b20-temperatur... and LED display (http://www.dx.com/p/max7219-led-dot-matrix-digital... Will these work?</p><p>-What is the accuracy of your cooker? Some high-brow sous vide recipes require accuracy of less than 0.5 degrees.</p><p>-Would it be easy to, instead of LED screen and buttons, monitor and control the cooker with wifi (using for example this: http://www.dx.com/p/elecfreaks-easy-wi-fi-shield-for-arduino-348340)</p>
<p>mmm...though it will be slower to heat up...I should think a slow cooker would work in place of a rice cooker. (why would I want to? Because I have a slow cooker, so does the guy I'm moving in with, but neither of us have a rice cooker, nor the space to have 2 slow cookers and a rice cooker!)</p><p>As long as I gave it ages to settle at a temperature, it should be fine, right?</p>
<p>I made my own too. I tried it with a slow cooker first but they're much lower power and so heat up much more slowly. I found it hard to get my PID values right with a slow cooker as it took 4 hours to heat up each time unlike my rice cooker which only takes 15 minutes. My rice cooker has much better insulation too.</p>
<p>fill it with hot water initially, saves time on the heat up.</p>
<p>Depends on your cooker really. I use a rice cooker but have also used a slow cooker. The temperature in the slow cooker is actually much more stable I think because it doesn't have enough power to overramp. I think my slow cooker is maybe 150-200watts? My rice cooker is about 800 watts. </p><p>Try it and see. If none of your slow cookers works well, donate one to a thrift store and pickup a rice cooker while you're there.</p>
<p>Hi, I'd like to build one of those for myself, too. Would you mind telling me what size the pot is you're using? What's your guess for the minimum volume of water needed?</p>
Hi. I guess the one I have is 1.5 liter or something. But the system should work with any volume of water and any pot form factor. As long as the temp sensor is immerged, you should be fine
<p>Thank you for the quick reply!</p>
<p>Works very well. I had a Nokia 5110 LCD laying around so I modified code to use it instead of the segment LEDs. LCD shows status messages, current and set temperature, SSR relay status, and also graphs the temperature over time so I know what it's doing without having to have a PC connected to serial port.</p><p>Fits nicely in a double gang box.</p>
<p>We built the circuit using an arduino micro and a sainsmart dual relay board. It seemed to work at first but it keeps overshhoting? Also we never see the serialmonitor print on our serial monitor. We see 87; -127.000</p><p>d = NC! but none of the comments about heating and cooling that look like they should appear from the code (if I understand it?) </p><p>case TEMP_RISE:</p><p>// wait for stabilization, then Regulate</p><p>if ( IsStabilizingOrDropping() )</p><p>{</p><p>if (doBackToFirstRampWhenStabilizing)</p><p>{</p><p>Serial.println(&quot; TEMP_RISE : back to initial ramping&quot;);</p><p>opState = FIRST_RAMP;</p><p>} </p><p>else </p><p>{</p><p>Serial.println(&quot; TEMP_RISE : back to normal : reg&quot;);</p><p>EnterRegulateStateOrWaitSmoothLowering();</p><p>}</p><p>Not sure what we did wrong? Should we try and reloading code from github or something? Great idea and thought we were getting it to work. Any help or advice you could give?</p>
<p>It looks pretty cool!</p>
<p>Your unit woks great but I found the crock pot I use seems to suffer uneven hot spots. I resolved this by adding a small 12 vdc CPU pump into the mix to circulate the water. This seems to have eliminated the hot spots. Use flat tubing to reduce lid lift.</p>
<p>Thanks for the instructable. But my unit will shutdown 1 to 2 times before the temperature stablises. I found that the following line:</p><p>tCheckNotHeatingWildly = millis() + 1000 * 60 * MAX_HEATINGTIME_NO_TEMP_CHANGE_MINUTES</p><p>in the &quot;checkShutdownConditions()&quot; function performs integer calculation instead of long integer calculation, making checking time shorter than intended.</p><p>Anyway, thanks so much for giving me a chance to use sous vide, I really enjoy it!</p><p>Below is a photo of the control box I built. Your choice of LED display is very cool and the connection is very easy. I managed to put everything inside a small box (not as easy as I have thought though). The control box is then pluged in series with a 1.8L rice cooker. I am now testing the right interior to get the circulation efficient. I will show you my arrangement after more trial and error.</p><p>Cheers!</p>
<p>Thank you for noting that. I made the correction in the code.</p>
<p>This is great, thanks! I had a look at the code and think I understand it but turned off the 24 hour timeout and no temp change timeout because I was not sure if it was meddling with my code (it would reset to 0.0, 0.0 occasionally, meaning I had to restart). I was using a 550mA 5v power supply on the 5v line on a Nano v3 but the display seemed to go into shutdown mode (all LEDs on) so I tried an 850mA supply on the usb input and it has been working for a few hours so far! I have successfully cooked an egg and am currently cooking a small brisket steak for 24 hours at 59&deg;C.</p><p>I also made a small MDF box to hold the relay, power supply (which is wired to the always-on end of the relay so I only use one wall socket) and circuit, which is currently on a breadboard. The lid is slightly open because I had another USB wire fed in because of my power supply issues.</p>
Working great after finding a problem with the relay, only working in NC mode. Also had some problems with the powersupply to the Arduino. To small... Great job!
<p>Took me a few weeks to get the parts but my GF and I are really happy. I can see the adaptive temperature in action - that's really cool! Since I'm not a programmer, it'll probably take a while for me to figure out how the program works. One thing I observed that looks odd: why is is that when the probe is removed, the program detects the removal (quickly -nice!) but the relay remains on, thus raising the temperature? Similarly, if the relay is off and I remove the probe, the program will: sense the probe removal but enable the relay after a few minutes. The good news is the program does shut down the relay after ~5 minutes being outside in both cases. Thie is so great..thanks again!</p>
<p>Mhh.. The only time the lid should be open (and thus, the temperature probe off-water) is when adding bagged food to the water bath. Then the lid should be quickly put back on. I didn't want to perturbate current regulation when the lid was opened, so if there is heating at this time, it will not stop. However, as you point out, the safety &quot;5 minutes but no temp change&quot; feature still does its work to prevent unwanted overheating.</p>
<p>WOW your code is simply amazing and very well commented. I found a really cheap LCD shield with buttons for a mere $6, so I am altering your code to accommodate the difference as well as adding a red led to go off if the temperature goes to low as well as a green led that will turn on when a button is pushed but if power goes out and the board reboots will not turn back on. I am also adding to the display the up-time and since I live in the United States I am adding the set temp converted to Fahrenheit. Your splendid committing makes it a breeze to alter. THANKS!!!</p>

About This Instructable




More by Etienne Giust:Cheap and effective Sous Vide cooker (Arduino powered) Multi-purpose holder from kitchen whisk 
Add instructable to: