Raspberry Pi Temperature Controller for homebrewing and sous vide cooking
Branch: master
Clone or download
steve71 Merge pull request #28 from guysoft/python3_support
Add python 3 support, python2 also works
Latest commit c2c8cbb Oct 9, 2017


Raspberry Pi Temperature Controller

Control a Water Heater Wirelessly over a Web Interface

This program will control an electric heating element in a vessel to set temperatures and regulate boil. All status included temperature is sent back wirelessly approx. every second. The duty cycle and temperature is plotted in real time. A Type C PID algorithm has been successfully implemented to automatically control the heating element when the desired temperature is set.

For bootstrap multi-vessel and GPIO switch control version set template element to raspibrew_bootstrap.html in config.xml. For original version set template to raspibrew.html. The config.xml file explains how to setup for one, two or three vessels. The number of vessels and GPIO switches can easily be expanded in the software. The same raspibrew.py code supports both versions.

Hardware and Software Setup Information:

Bootstrap Web Interface in Firefox Browser

## Original Web Interface in Firefox Browser

Setting to 120 deg F

The temp plot shows temperature in degrees F over time in seconds.
The heat plot shows duty cycle percentage over time in seconds.


A $35 credit card sized Raspberry Pi computer is an inexpensive and very expandable solution to controlling the water temperature. Here it is used for temperature control of one vessel. Used in combination with a jeelabs thermo plug (1-wire and control relay), 1-wire temperature sensors and a usb wifi dongle, a wirelessly controlled temperature controller can be developed. The Raspberry Pi can run a web server to communicate the data to a browser or application on a computer or smartphone.

Electronics used to test: Raspberry Pi, Raspberry Pi Plate kit from Adafruit, Jeelabs Thermo Plug circuit board (1wire and GPIO), Jeelabs Output Plug (I2C) (Optional to drive more relays. This requires software modification.), 1-wire DS18B20 digital thermometer, 20x4 LCD and LCD117 kit (serial interface), 4.7k resistor, 1k resistor, 1N4001 diode, and 2N4401 transistor. For wireless an Edimax EW-7811UN dongle is used.

Information on Raspberry Pi low-level peripherals:


The language for the server side software is Python for rapid development. The web server/framework is web.py. Multiple processes connected with pipes to communicate between them are used. For instance, one process can only get the temperature while another turns a heating element on and off. A third parent temp control process can control the heating process with information from the temp process and relay the information back to the web server.

On the client side jQuery and various plugins can be used to display data such as line charts and gauges. Mouse overs on the temperature plot will show the time and temp for the individual points. It is currently working in a Firefox Browser.

jQuery and two jQuery plugins (jsGauge and Flot) are used in the client:

The PID algorithm was translated from C code to Python. The C code was from "PID Controller Calculus with full C source source code" by Emile van de Logt An explanation on how to tune it is from the following web site:

The PID can be tuned very simply via the Ziegler-Nichols open loop method. Just follow the directions in the controller interface screen, highlight the sloped line in the temperature plot and the parameters are automatically calculated. After tuning with the Ziegler-Nichols method the parameters still needed adjustment because there was an overshoot of about 2 degrees in my system. I did not want the temperature to go past the setpoint since it takes a long time to come back down. Therefore, the parameters were adjusted to eliminate the overshoot. For this particular system the Ti term was more than doubled and the Td parameter was set to about a quarter of the open loop calculated value. Also a simple moving average was used on the temperature data that was fed to the PID controller to help improve performance. Tuning the parameters via the Integral of Time weighted Absolute Error (ITAE-Load) would provide the best results as described on van de Logt's website above.