I want to build a project where I use my RPi to measure the temperature of both the wort and the swamp cooler I use to ferment beer, and alert me to whenever I need to add ice packs (i.e., the temperature rises above 74*F for a certain yeast strain).
There are multiple ways to read temperature from the RPi. The most common, and effective, that I have come across is through the use of Arduino. However I have already spent so much money on the RPi that I decided to find another way, and Adafruit comes through with the answer.
I bought all the necessary parts from Adafruit: the DS18B20 temperature sensors, a half-sized breadboard, a jumper wire pack, and a Pi Cobbler, the last of which is Adafruit specific.
The following was performed by following Adafruit's fourth lesson, GPIO Setup.
Adafruit has "produced an extensive and extremely useful collection of code to make life easy for those wishing to experiment with attaching electronics to their Pi."
If you don't have git, run the following:
sudo apt-get update
sudo apt-get install git
Clone the Adafruit repository:
git clone http://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git
cd Adafruit-Raspberry-Pi-Python-Code
ls
Execute the following
sudo apt-get update
sudo apt-get install python-dev
sudo apt-get install python-rpi.gpio
I already had python-rpi.gpio installed.
Hook up a DS18B20 probe to the breadboard according to Adafruit's instructions.
If you are using a Raspbian after 2015 you will need to edit /boot/config.txt with the following lines. Please refer to this post and this post for the reason. If you don't do this, your /sys/bus/w1/devices directory will be empty.
dtparam=i2c0=on
dtparam=spi=on
dtparam=is2=on
dtoverlay=w1-gpio
execute the following
sudo modprobe w1-gpio
sudo modprobe w1-therm
cd /sys/bus/w1/devices
ls
cd 28-xxxxxxxxxxxx ## From the ls command, find the directory starting with 28 and cd to it
ls
cat w1_slave
It appears to me that the first two lines (sudo modprobe w1-gpio ; sudo modprobe w1-therm) must be run every time the raspberry pi is turned on in order for the RPi to read the sensors.
Each DS18B20 you plug in will have its own directory in the format of 28-xxxxxxxxxxxx.
If all is well, it will display two lines of text. The first line will either have a YES or NO at the very end; if you receive a NO, there was a temporary error, so try again; if you receive a YES, the second line will display the temperature in Celcius.
Here was my result:
af 01 4b 46 7f ff 01 10 bc : crc=bc YES
af 01 4b 46 7f ff 01 10 bc t=26937
Dividing the temperature by 1000 gets you the Celsius, in my case 26.937*C.
Set the correct timezone for your raspberry pi by issuing:
sudo dpkg-reconfigure tzdata
This is copy and pasted form the Adafruit page
import os
import glob
import time
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'
def read_temp_raw():
f = open(device_file, 'r')
lines = f.readlines()
f.close()
return lines
def read_temp():
lines = read_temp_raw()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
temp_f = temp_c * 9.0 / 5.0 + 32.0
return temp_c, temp_f
while True:
print(read_temp())
time.sleep(1)
outage)
I want my RPi to be recording the temperature 24/7, and to resume recording the temperature after a power outage. The /etc/rvc.local file is one way of controlling what script executes on start up. Edit the file by issuing:
sudo nano /etc/rc.local
and write the following lines before the "exit 0":
# Allow RPi to See Sensors
sudo modprobe w1-gpio
sudo modprobe w1-therm
# Run Python Script
/home/pi/thermometer.py
My entire /etc/rc.local file looked like this afterwards:
Download MySQL and install it. Change the password to something simple, like pi.
sudo apt-get install mysql-server
Loggin to mysql and create a new database:
mysql -u root -p
create database brew;
use brew;
Create a temperature table.
CREATE TABLE temperature (
dt datetime DEFAULT NULL,
temperature decimal(4,1) DEFAULT NULL,
temperature1 decimal(4,1) DEFAULT NULL,
temperature2 decimal(4,2) DEFAULT NULL,
notes VARCHAR(200) DEFAULT NULL,
KEY temperature_dt_ind (dt),
KEY temperature_notes_ind (notes)
);
Create a Batch table:
CREATE TABLE batch (
name VARCHAR(50) DEFAULT NULL,
material VARCHAR(10) DEFAULT NULL,
start_date DATE DEFAULT NULL,
active CHAR(1) DEFAULT 'Y',
end_begin_date DATE DEFAULT NULL,
end_end_date DATE DEFAULT NULL,
min_temp DOUBLE DEFAULT NULL,
max_temp DOUBLE DEFAULT NULL
);
Create a Water table:
CREATE TABLE water (
dt DATETIME DEFAULT NULL,
bottle_n int(11) DEFAULT NULL,
notes VARCHAR(50) DEFAULT NULL,
KEY water_ind (dt)
);
I created a water table because I use a swamp cooler and wish to correlate the number of water bottles necessary to cool a batch, given a starting temperature.
The batch table records the name, start date, a range of end dates (I use 4-6 weeks), and a range of temperatures for the optimum temperature of the batch's yeast.
Make sure MySQL boots on startup in case of a power failure:
<code>sudo update-rc.d mysql enable</code>
I created a python script to handle everything. Here it is:
TODO ADD LATER
You may notice that some of my batches don't have a probe for the "temperature" column, which is the swamp cooler. For some yeast strains, and during certain parts of the year, I don't need a swamp cooler.
...
Python and MySQL
Issue the following to download the module:
<code>sudo apt-get install python-mysqldb</code>
Issue python to get into the interpreter, and then issue:
import MySQLdb
If you see no error, then it is good.
Python and MongoDB
If you plan to use MongoDB instead of, or in conjunction (as I do) with MySQL, issue the following:
sudo apt-get install python-pymongo
Go into python and issue import pymongo to test the installation.
Download and use Screen
sudo apt-get install screen
When you are ready to run your script, issue the following:
screen -S brew
cd /home/pi
python ./ temperature.py