ZonCoffee is a full-featured PID controller package for Arduino, customized for use with espresso machines. ZonCoffee is written in Processing/Wiring, and includes some code from Tim Hirzel‘s BBCC project.
- Displays set point and current temperature information on LCD
- Rotary encoder adjusts temperature targets without a computer
- Intuitive serial interface, compatible with the BBBC grapher
- Steam and extraction modes with separate temperature targets
- Simple configuration in “Options.h”
Supported Hardware (Version .2)
- 1 rotary encoder with pushbutton (software debounced)
- 1 SparkFun serial LCD
- 1 piezo buzzer (beeps when preheated)
- 1 zero-crossing solid-state relay
- 1 MAX6675 thermocouple chip (free samples available from Maxim IC)
- Additional Details
Average Hardware Cost
The entire project can be built for around $40 (not including an Arduino) assuming you acquire a free sample of the MAX6675 chip. ZonCoffee (as of .2) requires an ATMega168 or higher. The sketch is around 14kB compiled.
Plans for future versions:
- Support for additional thermocouple chips (have defines in options.h to choose which to compile)
- Support for additional display types. Possibly abstract display output functions.
- “No LCD” mode (use LED for indication).
- Release version tailored to PID for popper coffee roasting
I have been working on a similar project, but would love to download your code and mimic yours. However, the download link is not working? Any plans on getting that back up?
I switched over the download links right to a (hopefully) stable changeset in the repository, the links should work now. The code is under a creative commons license, so feel free to borrow and hack!
This looks really great! Thanks for sharing all your work. I’m looking to implement something similar for a more modular system – inputs for a power outlet and a thermocouple (usable for sous vide, making bread rise, homemade smoker, etc).
It looks like your heater code might be pretty useful here, but I had one small question regarding the function “updateHeater()” in pwm.pde. This seems to turn the heater/relay on every 1000ms (1s) regardless of power level, and then immediately turn it off as needed. Assuming the tank is hot enough (and therefore power level is 0), doesn’t this result in unnecessary writes to the relay (one every second, it would seem)? And does that in turn result in more operations, reducing the relays life? I think perhaps I am understanding the code incorrectly.
On a hardware side note, can I ask where you got the bezel and knob for the control? They look really nice.
Thanks once again!
Yup, that’s the way the function works (as quirky as it is). The period between the turn-on and turn-off (if an immediate turnoff is needed) is incredibly small, and won’t harm SSR’s or even mechanical relays (it shouldn’t be anywhere near long enough to trigger a relay). I actually based my code off of Hirzel’s BBCC code, which is where that function originated. His code might be a good starting point for you if you don’t need any of the additional features / complexity I’ve added in my codebase.
I actually made the bezel myself, just bought a piece of thin aluminum plate, drilled/dremeled it, bent it, and put on some rubber adhesive feet. I used some fine-grit sandpaper to give it a “brushed” aluminum look (which might not be the best method… it’s fairly messy). The knob was off of Mouser, they carry a lot of nice solid aluminum knobs for reasonable prices.
Also, you might want to take a look at my hardware setup, if you haven’t seen the post yet. I’ve also fabbed a PCB, but it’s looking like I screwed up a couple of traces; I’m going to wait until I can confirm my design works before posting it.
Good luck with your project!