Introduction: YASS - Yet Another Sous Vide Solution
Living well is the best revenge. Eating good tasting and healthy food is part of the path to living well. Sous Vide cooking allows you to cook almost anything to a precise point of done-ness. Plating a well cooked filet of salmon is a healthy choice which can be have as much eye appeal as taste appeal. Vegetables also fare very well when cooked in this method.
Lately, I have become interested (my wife has used the term "obsessed") with Sous Vide cooking. Sous Vide is French, meaning under vacuum. In its simplest form, it is sealing up whatever you are cooking in a plastic bag, having evacuated the air from it, placing the sealed bag in a tub of water, kept at the target temperature of the food, and maintaining the water bath for a long time. The food cannot overcook because the cooking process does not proceed further, once the internal temperature has reached the target.
You can achieve the results with a picnic cooler and Zip-Lock Freezer bags and a good thermometer. Buy a commercially built device to achieve the same results will set you back three hundred dollars and up (way up!). This Instructable documents my journey into building building my own device at substantially less than the commercially built models. How much less, you ask? I don't really know, yet, but I will be working on the actual cost and will update the ible as soon as I can figure it out.
There are many fine approaches to a DIY Sous Vide device, some straightforward and some rather sophisticated using PID (Proportional/Integral/Derivative) algorithms (see http://en.wikipedia.org/wiki/PID_controller). This one is definitely at the simple end.
I have found that there is some voltage swing in the temperature sensors, but I have not noticed significant overshooting in the water temperature, using my approach. To address the voltage swing, I use a simple smoothing algorithm, averaging previous samples, limiting the number with the definition of MAX_SAMPLES. Next I set the default target temperature to a value which is medium rare for beef. If no further adjustments are necessary, it will function without an LCD display, serial input or adjusting buttons. Otherwise, adjustments may be made through a USB connection to a computer or through up and down adjusting buttons. Monitoring temperatures may be done through a USB connection to a computer or through an 16x2 LCD screen attached to the Arduino.
Lately, I have become interested (my wife has used the term "obsessed") with Sous Vide cooking. Sous Vide is French, meaning under vacuum. In its simplest form, it is sealing up whatever you are cooking in a plastic bag, having evacuated the air from it, placing the sealed bag in a tub of water, kept at the target temperature of the food, and maintaining the water bath for a long time. The food cannot overcook because the cooking process does not proceed further, once the internal temperature has reached the target.
You can achieve the results with a picnic cooler and Zip-Lock Freezer bags and a good thermometer. Buy a commercially built device to achieve the same results will set you back three hundred dollars and up (way up!). This Instructable documents my journey into building building my own device at substantially less than the commercially built models. How much less, you ask? I don't really know, yet, but I will be working on the actual cost and will update the ible as soon as I can figure it out.
There are many fine approaches to a DIY Sous Vide device, some straightforward and some rather sophisticated using PID (Proportional/Integral/Derivative) algorithms (see http://en.wikipedia.org/wiki/PID_controller). This one is definitely at the simple end.
I have found that there is some voltage swing in the temperature sensors, but I have not noticed significant overshooting in the water temperature, using my approach. To address the voltage swing, I use a simple smoothing algorithm, averaging previous samples, limiting the number with the definition of MAX_SAMPLES. Next I set the default target temperature to a value which is medium rare for beef. If no further adjustments are necessary, it will function without an LCD display, serial input or adjusting buttons. Otherwise, adjustments may be made through a USB connection to a computer or through up and down adjusting buttons. Monitoring temperatures may be done through a USB connection to a computer or through an 16x2 LCD screen attached to the Arduino.
Step 1: Gather Materials
The device consists of two boxes, one for the Controller and one for the Power Switch Tail.
For the Controller:
1 LM34 or LM35 Temperature sensor (LM34 is the Fahrenheit version, LM35 is the Celsius version)
2 SPST momentary contact switches
1 16x2 LCD Display
1 Voice Grade Keystone Jack - RJ11/RJ12 type (such as Leviton 41106-RW6)
1 Electrical Wall Plate, QuickPort Single-Port, 1-Gang (such as Leviton 41080-1WP)
1 Voice Grade RJ11 Plug (if you have a modular telephone with four wires connected at the RJ11 plug, you can use one end of that and won't need a crimping tool)
1 9/32x0.014 (7.14mm x 0.355mm) red brass tube (I found this at a local hobby/model train store)
1 T-1 3/4 (5mm) LED
1 “SNAP-IN” T-1 3/4 LED HOLDER
For the Controller:
1 LM34 or LM35 Temperature sensor (LM34 is the Fahrenheit version, LM35 is the Celsius version)
LM34 - Mouser Electronicss
LM34 - Jameco Electronics
LM34 - Ebay
LM35 - Mouser Electronics
LM35 - Newark Electronics
LM35 - Ebay
1 Arduino Uno R3 or otherLM34 - Jameco Electronics
LM34 - Ebay
LM35 - Mouser Electronics
LM35 - Newark Electronics
LM35 - Ebay
2 SPST momentary contact switches
1 16x2 LCD Display
1 Voice Grade Keystone Jack - RJ11/RJ12 type (such as Leviton 41106-RW6)
1 Electrical Wall Plate, QuickPort Single-Port, 1-Gang (such as Leviton 41080-1WP)
1 Voice Grade RJ11 Plug (if you have a modular telephone with four wires connected at the RJ11 plug, you can use one end of that and won't need a crimping tool)
1 9/32x0.014 (7.14mm x 0.355mm) red brass tube (I found this at a local hobby/model train store)
1 T-1 3/4 (5mm) LED
1 “SNAP-IN” T-1 3/4 LED HOLDER
2 3.5mm 3 pole stereo phone connectors (one for controller, one for Power Switch Tail)
1 3.5mm Stereo Male To Male Cable
1 rubber grommet
1 rubber grommet
Radio Shack has a 31 piece assortment for about $2.50. I used one with a 3/8" mounting hole. Use common sense and choose one to fit the power supply cord.
1 small Aquarium Filter Pump
For Power Switch Tail:
5' 18 guage, 3-wire electrical cord
1 120v male 3-prong plug (if you have a leftover PC power cord, cut off the female end and you have the wire/plug already connected)
1 5v relay
For Power Switch Tail:
5' 18 guage, 3-wire electrical cord
1 120v male 3-prong plug (if you have a leftover PC power cord, cut off the female end and you have the wire/plug already connected)
1 5v relay
1 rubber grommet
Radio Shack has a 31 piece assortment for about $2.50. I probably used one with a 3/8" mounting hole. Here again, use common sense and choose one to fit the power cord.
1 4-pin AT/ATX/IDE power cable - AdaFruit sells one for about $2.00 or you may be able to find one in your junk box.
1 120v Duplex outlet
1 Duplex outlet cover
1 1-Gang Non-Metallic New Work Box with Bracket
If you want to avoid building the Power Switch Tail, Sparkfun sells one at http://www.sparkfun.com/products/10747. I do not have one, so I have no experience with it. It looks like a two wire hookup (do not use their ground terminal 3), but you are on your own.
The Cooking Vessel
1 Dumb Slow Cooker - This is the most important piece of the system since you can't cook anything without it. The feature it must have is a simple mechanicalspeed heat level switch, specifically, it has to have a HIGH setting which will not reset if you pull the power and then re-power. My first was a Crock Pot which my wife and I bought many years ago. The capacity was small, but it worked. Recently, we purchased a new slow cooker with an eight quart capacity. We have also been given a slow cooker when the owner upgraded to a micro-processor controlled unit. I have seen them available at yard sales and I am sure that you can find a bargain at a local thrift store. Another thought is to put a request on Freecycle.com. Happy hunting!
1 120v Duplex outlet
1 Duplex outlet cover
1 1-Gang Non-Metallic New Work Box with Bracket
If you want to avoid building the Power Switch Tail, Sparkfun sells one at http://www.sparkfun.com/products/10747. I do not have one, so I have no experience with it. It looks like a two wire hookup (do not use their ground terminal 3), but you are on your own.
The Cooking Vessel
1 Dumb Slow Cooker - This is the most important piece of the system since you can't cook anything without it. The feature it must have is a simple mechanical
Step 2: Preparing the Project Box
The Project Box I used comes with two covers, one plastic and one aluminum. This is good because I messed up my first attempt using the plastic cover.
In my first attempt, I used blue painter's tape and drew on it where I wanted the various holes.
I cut down the modular outlet cover to a reasonable size with a bandsaw.
I used a Forstner bit to drill the recess for the back of the modular outlet cover and used a Dremel tool to cut the opening for the LCD panel. I don't have enough skill with the Dremel and the rectangle I cut was very sloppy. The layout was bad, too. The rectangle cramped the wire path for the LCD and the placement of the cut-down modular outlet cover had one corner of the cover obscuring one of the box cover screws.
I discarded the plastic cover and used a CAD program (DoubleCAD) to create a layout to print and glue to the aluminum cover, with spray adhesive. I used a nibbling tool (Jameco, Radio Shack, Newark) to cut the rectangles for both the LCD panel and the recess for the modular outlet cover.
Next, I drilled the 1/4" hole for the LED mount and the other holes to fit the UP/DOWN momentary contact switches I used.
The hole for the grommet was drilled in one end of the box. The hole was centered in the end and offset from the top to allow for the full width of the grommet to just fit below the cover. Cuts (approximately) tangent to the hole were made with a hacksaw, making a "U"-shape, to allow the grommet to be slid up to the hole. The grommet was cut so that it could be fitted around the power cord, in this case a USB cable.
Holes for mounting the LCD panel must be laid out very carefully. Put some painter's tape on the back of the cover, where the holes are expected to be, place the LCD panel in position and mark the hole location with a long thin Sharpie marker or a thin pencil lead. Remove the LCD panel (of course) and finish by center punching and drilling the holes. I found it best to use 4-40 3/4" machine screws with a hex nut between the cover and LCD panel, as well as the hex nut to secure the panel. The extra nut acts as a standoff for the right amount of spacing between the panel and the cover.
In my first attempt, I used blue painter's tape and drew on it where I wanted the various holes.
I cut down the modular outlet cover to a reasonable size with a bandsaw.
I used a Forstner bit to drill the recess for the back of the modular outlet cover and used a Dremel tool to cut the opening for the LCD panel. I don't have enough skill with the Dremel and the rectangle I cut was very sloppy. The layout was bad, too. The rectangle cramped the wire path for the LCD and the placement of the cut-down modular outlet cover had one corner of the cover obscuring one of the box cover screws.
I discarded the plastic cover and used a CAD program (DoubleCAD) to create a layout to print and glue to the aluminum cover, with spray adhesive. I used a nibbling tool (Jameco, Radio Shack, Newark) to cut the rectangles for both the LCD panel and the recess for the modular outlet cover.
Next, I drilled the 1/4" hole for the LED mount and the other holes to fit the UP/DOWN momentary contact switches I used.
The hole for the grommet was drilled in one end of the box. The hole was centered in the end and offset from the top to allow for the full width of the grommet to just fit below the cover. Cuts (approximately) tangent to the hole were made with a hacksaw, making a "U"-shape, to allow the grommet to be slid up to the hole. The grommet was cut so that it could be fitted around the power cord, in this case a USB cable.
Holes for mounting the LCD panel must be laid out very carefully. Put some painter's tape on the back of the cover, where the holes are expected to be, place the LCD panel in position and mark the hole location with a long thin Sharpie marker or a thin pencil lead. Remove the LCD panel (of course) and finish by center punching and drilling the holes. I found it best to use 4-40 3/4" machine screws with a hex nut between the cover and LCD panel, as well as the hex nut to secure the panel. The extra nut acts as a standoff for the right amount of spacing between the panel and the cover.
Step 3: Controller Electronics
If you look at the images, you will notice that there is no breadboard or circuit board used. I may rethink this if I update the design. Also notice that I use labels to identify connections. This allows me to disconnect the Arduino and reconnect it without having to refer to the wiring diagram. I experimented with various wire gauges, looking for flexibility, yet enough stiffness to serve as pins for connections to the Arduino. I tried four conductor telephone cable, which is either 22 or 24 gauge, but it was too stiff and pulled from the connectors with very slight movements. My compromise was to use male/female jumpers to connect between the stiffer wires and the Arduino. [It would probably be easier just to have used the jumper wires, themselves.]
Collect two groups of wires, namely all connections to +5v, and all connections to ground, solder each group together and protect the connection with heat shrink tubing or electrical tape. Alternatively, you could use small wire nuts. Make the wires about three inches each and use the color code red, for +5v, and black for circuit ground. There should be six black and four red.
Solder one black wire to one contact of each of the push button switch contacts. The other contact of each of the switches will connect to either pin D4 or D5 of the Arduino.
Solder the cathode of the status LED to a black wire. Solder a wire to the anode of the LED. This will connect to pin D13 of the Arduino.
For connections to the LCD driver, I used female/female jumper wires, which are connected in pairs. Two pairs make a very nice socket to slide onto the driver's pins. A red and a black wire are each connected to the f/f jumpers to supply +5v and ground to the LCD driver. Two male/male jumpers connect the TX and DX data f/f connectors to Arduino pins A0 and A1. [As an afterthought, I might have used another of the PC power cable connectors, as I did in the Power Switch Tail step.]
The RJ11 jack has a two color codes printed on it. Follow the one with the black/red/green/yellow. For the plug that goes into it, which will connect to the temperature sensor, use the black/red/green/yellow order (hook on the bottom) found at http://www.westernet.net/Help/RJ45.htm
The connection to the power switch tail uses a 3.5 mm stereo jack. The three terminals of the jack are called Ring, Tip and Sleeve. Connect a black wire to the sleeve, a yellow wire to the ring and a red wire to the tip.
Collect two groups of wires, namely all connections to +5v, and all connections to ground, solder each group together and protect the connection with heat shrink tubing or electrical tape. Alternatively, you could use small wire nuts. Make the wires about three inches each and use the color code red, for +5v, and black for circuit ground. There should be six black and four red.
Solder one black wire to one contact of each of the push button switch contacts. The other contact of each of the switches will connect to either pin D4 or D5 of the Arduino.
Solder the cathode of the status LED to a black wire. Solder a wire to the anode of the LED. This will connect to pin D13 of the Arduino.
For connections to the LCD driver, I used female/female jumper wires, which are connected in pairs. Two pairs make a very nice socket to slide onto the driver's pins. A red and a black wire are each connected to the f/f jumpers to supply +5v and ground to the LCD driver. Two male/male jumpers connect the TX and DX data f/f connectors to Arduino pins A0 and A1. [As an afterthought, I might have used another of the PC power cable connectors, as I did in the Power Switch Tail step.]
The RJ11 jack has a two color codes printed on it. Follow the one with the black/red/green/yellow. For the plug that goes into it, which will connect to the temperature sensor, use the black/red/green/yellow order (hook on the bottom) found at http://www.westernet.net/Help/RJ45.htm
The connection to the power switch tail uses a 3.5 mm stereo jack. The three terminals of the jack are called Ring, Tip and Sleeve. Connect a black wire to the sleeve, a yellow wire to the ring and a red wire to the tip.
Step 4: The Temperature Sensor
The temperature probe uses the LM35 or LM34 temperature sensor. The LM34 will produce readings in Fahrenheit while the LM35 produces readings in Celsius. Initially, I had trouble finding the LM34 and, being more comfortable with Fahrenheit, I put algorithms in the code to convert the Celsius to Fahrenheit. I also added code so that either sensor may be used for either Fahrenheit or Celsius.
The probe will be connected to the project box using an RJ11 plug. Follow the color order shown when making your own cable connection. If you are using a pre-made telephone cable, be sure that the wiring is in the order shown in the diagram, black, red, green and yellow, viewed from the top, the hook being on the bottom. Be aware that, in commercially made cables, the color order of one end is the reverse of the other end.
In making connections to the LM35 or LM34, the bare wires and solder joints should be covered with heat shrink tubing or electrical tape. Using four conductor telephone, solder the red wire to the +Vs, the black wire to GND and the yellow to Vout. The green wire will not be used and should be snipped.
The temperature sensor needs to be waterproofed. I used a 9/32x0.014 (7.14mm x 0.355mm) red brass tube, which I bought at a local hobby/model train store. It was just large enough to contain my sensor and the tubing insulation. Cut off a section which will cover the sensor and wires beyond the point that the cable cover was stripped.
The next step has the potential to be extremely messy, so take the necessary precautions to cover any work surface you don't want smeared with silicon.
Begin with a hefty squirt of silicon into the empty tube. Coat the sensor and uncovered wires up to and just past where the cover begins. Insert the sensor into the tube, twisting as it goes in. Withdraw, slightly, and recoat with silicon. Reinsert and repeat until you are satisfied that the sensor and uncovered wires are thoroughly encased. Put aside and allow to set.
The probe will be connected to the project box using an RJ11 plug. Follow the color order shown when making your own cable connection. If you are using a pre-made telephone cable, be sure that the wiring is in the order shown in the diagram, black, red, green and yellow, viewed from the top, the hook being on the bottom. Be aware that, in commercially made cables, the color order of one end is the reverse of the other end.
In making connections to the LM35 or LM34, the bare wires and solder joints should be covered with heat shrink tubing or electrical tape. Using four conductor telephone, solder the red wire to the +Vs, the black wire to GND and the yellow to Vout. The green wire will not be used and should be snipped.
The temperature sensor needs to be waterproofed. I used a 9/32x0.014 (7.14mm x 0.355mm) red brass tube, which I bought at a local hobby/model train store. It was just large enough to contain my sensor and the tubing insulation. Cut off a section which will cover the sensor and wires beyond the point that the cable cover was stripped.
The next step has the potential to be extremely messy, so take the necessary precautions to cover any work surface you don't want smeared with silicon.
Begin with a hefty squirt of silicon into the empty tube. Coat the sensor and uncovered wires up to and just past where the cover begins. Insert the sensor into the tube, twisting as it goes in. Withdraw, slightly, and recoat with silicon. Reinsert and repeat until you are satisfied that the sensor and uncovered wires are thoroughly encased. Put aside and allow to set.
Step 5: The Power Switch Tail
The relay used has connector pins to attach the low voltage control wires. These can be soldered, but an easier way is to use a connector modified from a PC 4-pin AT/ATX/IDE power cable. Modify the power cable by cutting off the large connector. Cut the wires as close to the connector as possible. Remove the yellow conductor and the black conductor, which is next to the red conductor, by using a pointed instrument, such as the awl on my pocket knife to press on their respective retaining clips until the wires can be removed. Insert the yellow conductor into the hole next to the red and push into the hole until the retaining clip clicks.
Using the wires from the connector, take the 3.5mm stereo jack and connect a black wire to the sleeve, a yellow wire to the ring and a red wire to the tip.
The housing is a "New Work" single gang outlet box. It is a lot cheaper than a project box and easier to work with, since it is made to accept a power outlet. Cut the mounting off. Drill holes for the power cord grommet and the stereo jack. Mount the jack with its associated connector for the relay. Press the grommet into its hole and feed the power cord through the grommet. The hot side of a power cord without colors will be smooth. The neutral wire will have ribs. If there are colors, the black will be hot and the white will be neutral. Connect the hot wire to the common terminal of the relay. Connect a wire from the NO (normally open) relay terminal to the hot side (brass colored screws) of the power outlet receptacle. Connect the neutral wire to the neutral side of the power outlet receptacle (silver colored screws). Connect the power cord green wire to the green screw (ground).
Connect the modified connector to the relay so that the red wire connects to the VCC pin. At this point the Power Switch Tail wiring is done.
Using the wires from the connector, take the 3.5mm stereo jack and connect a black wire to the sleeve, a yellow wire to the ring and a red wire to the tip.
The housing is a "New Work" single gang outlet box. It is a lot cheaper than a project box and easier to work with, since it is made to accept a power outlet. Cut the mounting off. Drill holes for the power cord grommet and the stereo jack. Mount the jack with its associated connector for the relay. Press the grommet into its hole and feed the power cord through the grommet. The hot side of a power cord without colors will be smooth. The neutral wire will have ribs. If there are colors, the black will be hot and the white will be neutral. Connect the hot wire to the common terminal of the relay. Connect a wire from the NO (normally open) relay terminal to the hot side (brass colored screws) of the power outlet receptacle. Connect the neutral wire to the neutral side of the power outlet receptacle (silver colored screws). Connect the power cord green wire to the green screw (ground).
Connect the modified connector to the relay so that the red wire connects to the VCC pin. At this point the Power Switch Tail wiring is done.
Step 6: The Code
Beyond the temperature control, I tried to keep other functions as simple as possible.
During setup, the hardware is initialized, then the temperature sensor is read. The reading is used to populate a circular array used for smoothing. A splash screen is displayed on the LCD and, after a delay, the current temperature and set point are displayed.
The main loop period is 100 ms.
In the main loop, the serial input is read. If a byte is present, it is processed. If it is not a digit, CARRIAGE RETURN or LINe FEED, it is ignored. If it is a digit, its value is accumulated in a temporary variable and control returned to the loop. If it is a CARRIAGE RETURN or LINE FEED, the accumulated digits are treated as the new set point. Note that there is no reasonability check on the set point range. Take some personal responsibility and pay attention to your typing. You should not be able to damage anything by typing bad numbers.
Next, the UP/DOWN switches are queried and, if either is pressed, an internal loop is used to increase or decrease the set point for as long as the switch is pressed. The initial update time is 500 ms, but after five iterations, the update time is halved, to speed up processing.
The temperature is read on every fifteenth loop or 1.5 seconds. The macro definition
Temperature and set point are sent to the serial line as simple text, by default, when either changes. To produce XML to be sent on the serial port, uncomment the macro definition
During setup, the hardware is initialized, then the temperature sensor is read. The reading is used to populate a circular array used for smoothing. A splash screen is displayed on the LCD and, after a delay, the current temperature and set point are displayed.
The main loop period is 100 ms.
In the main loop, the serial input is read. If a byte is present, it is processed. If it is not a digit, CARRIAGE RETURN or LINe FEED, it is ignored. If it is a digit, its value is accumulated in a temporary variable and control returned to the loop. If it is a CARRIAGE RETURN or LINE FEED, the accumulated digits are treated as the new set point. Note that there is no reasonability check on the set point range. Take some personal responsibility and pay attention to your typing. You should not be able to damage anything by typing bad numbers.
Next, the UP/DOWN switches are queried and, if either is pressed, an internal loop is used to increase or decrease the set point for as long as the switch is pressed. The initial update time is 500 ms, but after five iterations, the update time is halved, to speed up processing.
The temperature is read on every fifteenth loop or 1.5 seconds. The macro definition
#define FAHRENHEIT_UNITS
is the default unit selection. To produce displays of Celsius units, comment that line by adding double forward slashes in front of it.Temperature and set point are sent to the serial line as simple text, by default, when either changes. To produce XML to be sent on the serial port, uncomment the macro definition
// #define PRODUCE_XML
by removing the double slashes. If you don't know what XML is, leave it alone.Step 7: Putting It All Together
Assembling the system is straightforward. The order of assembly is not critical. Plug the sensor cable into the RJ-11 jack. Plug the stereo cable between the project box and the power tail. Plug the power tail into the wall outlet. Plug the USB cable from the into the computer/laptop or USB phone charger. Put enough water into the slow cooker to submerge your sealed food. It helps to use hot water to start with. Put in the small aquarium filter pump and plug in. Plug in the slow cooker and set the power to HIGH. Submerge your food packet. You may need to place a dish on top to weight down the package.
Step 8: Results
The results are outstanding. The steak shown was in the bath for an hour and a half. It takes longer than grilling, but the results are predictable. I am tempted to say that I will never grill another steak, but I know that, if there is a time constraint, I will have to compromise.
Well, that's it for now. Bon appétit!
Have fun and share.
Well, that's it for now. Bon appétit!
Have fun and share.