A partir del 2012 en la distribución de raspbian se le agregó soporte al sensor DS18B20, con éste se puede leer la temperatura de una forma fácil y precisa. Con motivos de la elaboración de cerveza y control de temperatura en la fermentación vamos a iniciar este proyecto.





El esquema de montaje es muy sencillo, se va a utilizar la alimentación de 3.3v del 1er pin al rojo del sensor, la tierra lo sacamos del 6to pin y es conectado al negro del sensor, salida del sensor (el amarillo) lo conectaremos al 4to GPIO del raspberry y por último vamos a situar la resistencia de 4.7k entre la alimentación y la salida del sensor.


El sensor viene equipado el protocolo de comunicación 1-Wire lo cual permite conectar n cantidad de sensores en serial a un sólo GPIO y esto se verá reflejado en el raspberry como una carpeta y archivo independiente.
Iniciemos por agregar la siguiente linea a /boot/config.txt
Para editar este archivo se puede usar sudo vi /boot/config.txt y al final del archivo agregar:
dtoverlay=w1-gpio
Ahora reiniciar con sudo reboot y una vez el raspberry inicie ejecutaremos los siguientes comandos:
sudo modprobe w1-gpio
sudo modprobe w1-therm
cd /sys/bus/w1/devices
ls
cd 28-xxxx # cambiamos xxxx con el serial que nos aparece
cat w1_slave

La respuesta del sensor va a tener YES o NO al final de la primera linea. Si es sí, entonces la temperatura va a estar al final de la segunda linea, en 1⁄1000 grados C. Por ejemplo en la foto anterior tenemos una temperatura de 28.125 C˚.
Para leer usaré el siguiente script de python:
import os
import glob
import time
# Cargar los módulos del kernel necesarios
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
# Buscar el archivo para leer la temperatura
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'
# Leer todo el archivo para procesarlo luego
def read_temp_raw():
f = open(device_file, 'r')
lines = f.readlines()
f.close()
return lines
# Lee la temperatura verificando que este disponible
def read_temp():
lines = read_temp_raw()
# Verificar que al final de la primera linea se encuentre una lectura exitosa.
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
# Leer por siempre haciendo una breve pausa cada 1 segundo
while True:
print(read_temp())
time.sleep(1)
Luego de subir el script al raspberry podemos probar como funciona corriendo sudo python leer.py

Hemos visto que leer la temperatura con nuestro raspberry pi ha sido muy fácil, es un proyecto muy rápido y que nos va ser muy útil cuando tengamos que hacer el control de la temperatura.