YoBot
- What is it? Example of using millis() on Arduino. This started as an ME310 Arduino thing.
- Why? There are yogurt maker appliances, but they don't do the really important part for me, which is to bring milk almost to a boil, without it boiling over and making a mess.
- What's it made of?: RBBB Arduino kit + power relay + temperature probe + LED + rice cooker
- How does it work?
- Add a quart (or a liter) of milk. I use 2%.
- YoBot heats it to just below boiling, holds it there a bit, lets it cool down. Then it starts beeping when it reaches "brew temperature" (warm, but not too hot).
- Add a spoonful of yogurt (I like Greek) and flip the switch.
- After ~6 hours, it will be done. If you let it go longer the yogurt gets a little tarter and denser.
- Recommended recipes and temperatures from Oregon State
Summer 2024: YoBot 2.0 -- the thermal fuse on the original YoBot burned out and the teflon-coated pot was getting scratched and hard to clean, so I got a new rice cooker. This one is just 250W and it has no thermal fuse. It's also a bit smaller (barely 1 quart) -- and I wish it were just a bit bigger. New Arduino code: (BrewTimer v8).
- added a small 5 volt fan in the base to expedite the cool-down phase after milk gets brought to a little below boiling
- redid the wiring with a nicer connector
- added the power duty-cycle feature to the final stages of initial heat-up (T>70deg C), to reduce tendency to over-cook the milk at bottom of the pot
- retained the duty cycle for the incubation phase when time > 4 hours.
Sept 2023 Finally getting around to the duty cycle idea from May 2022.
- On Ubuntu 22 need to do a couple of things to get the FTDI usb/serial port working
- sudo apt remove brltty - removes a driver that conflicts with port
- sudo usermod -a -G dialout <username> - gives permission to the port for your jobs
- reboot (not just login)
- Uses OneWire and DallasTemperature libraries (in IDE: Sketch/Libraries and Manage libraries to add them)
- Currently set to print temperature probe (deg C) to serial monitor every ~10s
- This version uses duty cycle when time beyond 4 hours: Attach:BrewTimerv7.zip
May 2022: As the yogurt thickens, the heat transfer inside the pot drops considerably. Thus a better "slow brew" solution would be to reduce the heating rate.
- I should do a software PWM emulator where, after a couple hours, when the heater is "on" it is actually power cycled to heat at reduced power like a few seconds on, a few seconds off.
- This is based partly on a Yobot Thermal Analysis example created for ME1
1Oct2019 Two software updates:
- If the initial heating period is over (it's cooling down) and nobody has thrown the switch to put in "brew" mode then just let it continue to cool -- all the way to room temperature if it comes to that. This is the safest "lack of attention" solution.
- After being in brew mode for several hours the brew temp range should reduce to brew at lower temperature (and more slowly) so that if left, for example, overnight it doesn't get overdone.
- Also, if the yogurt goes a long time, it gets denser and convective heat transfer in the pot is poorer, so the bottom can get overcooked. Reducing the temperature mitigates this issue.
4Oct2017 update: The thermistor may have corroded. Need either a better solution for waterproofing (yogurt-proofing) or, thanks to George Toye, a better temperature solution altogether:
- DS18B20 digital temperature probe.
- This device is already waterproof and provides a direct digital output
- Adafruit: If your sensor has three wires - Red connects to 3-5V, Blue/Black connects to ground and Yellow/White is data
- One wire communication: http://www.hobbytronics.co.uk/ds18b20-arduino
- more: https://create.arduino.cc/projecthub/TheGadgetBoy/ds18b20-digital-temperature-sensor-and-arduino-9cc806
- https://www.milesburton.com/Dallas_Temperature_Control_Library
Works nicely, with a bit more time lag than the previous thermistor.
End result: Attach:TemperatureProbePlusYobot.zip
Links
Arduino timer tutorial
- http://tronixstuff.com/2011/06/22/tutorial-arduino-timing-methods-with-millis/
- http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Thermistor 10K
https://www.sparkfun.com/products/250
Looks like ~5k resistor for voltage divider would be good.
Relay:
Also need ~5V power supply, switch, LEDs & resistors, buzzer
Yobot Circuit: https://drive.google.com/file/d/0B58l_8LQWpQgSE55ODgtdHJpX00/view?usp=sharing
Latest version of the program V3
Basic Program
(There are some additional checks, diagnostics etc.)
Initialize
- set pin names
- inputs: analogPin for thermistor; yogPin for switch "yogurt added"
- outputs: relaypin; yellowLED; buzzer
- define constants
- thermistor readings (maxboil ~95C: heater off; minbrew ~40C: heater on; maxbrew ~45C: heater off; cooled; disconnected)
- logical: neverboiled; switchval; temperature; heattime; startup;
Startup
- assign pin numbers for input, output
Main loop
- Get milliseconds (1 minute = 60000 ms)
- Read temperature on analogPin
Startup
if (time < startup time)
- check if temperature status = thermistor disconnected (complain if so)
- check if "yogurt added" switch on (complain if so)
Heating Phase
if(time < maximum heating time && never-boiled)
- yellow LED on
- if temp < maxboil
- heater relay => on;
- if temp > maxboil
- heater relay => off; never-boiled = false
Cool-down and Brewing
- Yellow LED => off
if (temp < minbrew && yogurt not added)
- Complain (Beep) to add yogurt
- If(temp< minbrew) => heater relay on
- If (temp>maxbrew) => heater relay off