El sensor DS18B20 es un termómetro digital que se puede utilizar con la Raspberry Pi de forma muy sencilla. Consulta sus especificaciones aquí.
Está disponible en varios formatos: como transistor suelto, como módulo (con la resistencia incorporada, listo para ser usado) o en su versión sumergible.
Vamos a empezar con el transistor suelto. Es necesario que coloquemos una resistencia «pull-up» de 4K7 ohmios, y lo conectemos a la Raspberry Pi según el siguiente esquema:
Una vez conectado, la lectura de la temperatura es muy sencilla; se hace leyendo un fichero. Basta seguir los siguientes pasos (el primer paso es necesario sólo si tienes un Kernel superior al 3.18 que salió para dar soporte a la Raspberry Pi 2). Primero, hay que editar el siguiente fichero:
sudo nano /boot/config.txt
Y añadir al final del mismo:
# 1-wire settings dtoverlay=w1-gpio,gpiopin=4
Salimos del editor nano (pulsando CTRL-X y luego S, y luego ENTER, para salir guardando el fichero).
Tras esto hay que reiniciar la Raspberry Pi. Una vez ha reiniciado, ejecutamos los siguientes comandos:
sudo modprobe w1-gpio sudo modprobe w1-therm
A continuación tenemos que ir al siguiente directorio, y listar su contenido:
cd /sys/bus/w1/devices ls
Aparecerán varios directorios, entre ellos uno (o varios, si tenemos varios termómetros conectados), con el nombre 28-XXXXX
. 28-XXXXX es el número de serie de nuestro termómetro, diferente para cada transistor. Por ejemplo, este termómetro es 28-0000052cd55d
. Entramos en ese directorio (reemplazando XXXXX por nuestro código), y leemos el fichero w1_slave
:
cd 28-XXXXX cat w1_slave
La salida será algo así:
87 01 4b 46 7f ff 09 10 48 : crc=48 YES 87 01 4b 46 7f ff 09 10 48 t=24437
La temperatura viene expresada en mºC. En la salida anterior dice t=24437
, que tenemos que dividir por 1000 para tener la temperatura en ºC, es decir: 24.437 ºC.
Con los otros sensores se procede de la misma manera. El módulo se conecta directamente, sin necesidad de añadir la resistencia (ya la lleva incluida); el sumergible sin embargo sí necesita la resistencia.
Podemos colocar muchos sensores en paralelo, con una sola resistencia para todos ellos. Como cada sensor tiene un código diferente, aparecerán carpetas para cada uno de ellos, y no tendremos más que leer el que queramos.
Este procedimiento para obtener la temperatura es un poco rupestre, así que vamos a optimizarlo, creando un pequeño script bash y luego otro en python.
Tomar la temperatura desde un script bash
Para el script en bash, leer el fichero y quedarnos con la temperatura es fácil. El problema es que ese número tenemos que dividirlo por 1000, y, aunque sorprenda, en bash no se puede dividir… Así que instalamos el pequeño programa bc
:
sudo apt-get install bc
Y ya podemos editar un pequeño bash, que he llamado temp.sh
:
#!/bin/bash tempsenso=$(grep "t=" /sys/bus/w1/devices/28-00000560a4e2/w1_slave | cut -d\= -f2) echo "scale=3; $tempsenso/1000" | bc
Podemos modificar el número de decimales modificando scale=
. Lo he puesto igual a 3 decimales, que es la precisión con la que muestra los resultados el sensor DS18B20.
Tomar la temperatura en pyhton
En python procederíamos de forma muy similar:
# -*- coding: utf-8 -*- def get_temp_sens(): tfile = open("/sys/bus/w1/devices/28-00000560a4e2/w1_slave") text = tfile.read() tfile.close() secondline = text.split("\n")[1] temperaturedata = secondline.split(" ")[9] temperature = float(temperaturedata[2:]) temperature = temperature / 1000 return float(temperature) mensaje = str(get_temp_sens()) + " ºC" print(mensaje)
(La primera línea es para que salga bien el símbolo º).
Un último comentario y es que usar estos termómetros junto con la cámara de la Raspberry Pi puede dar algún problema.
Referencias