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
Pingback: Display de 4 dígitos de 7 segmentos en la Raspberry Pi | Carlini's Blog
Pingback: Sensores de humedad y temperatura DHT11 y DTH22 en la Raspberry Pi | Carlini's Blog
Buenas tarde Carlini:
Si ya tengo ocupado el GPIO 4 con el modulo «Real time Clock» DS3231. ¿Qué GPIO puedo utilizar para conectar este sensor de temperstura?
Gracias. Un Saludo
Hola, Mariano:
Creo que sólo puedes utilizar el GPIO 4… Es posible que mientras no hagas lecturas de los dos módulos al mismo tiempo puedan compartir el GPIO 4 sin problemas. ¿Has probado a ver si funciona?
Gracias por interesarte Carlini:
Manteniendo conectado el modulo “Real time Clock” DS32312 probé, utilizando para el sensor DS18B20 el GPIO 27, logicamente cambiando en el fichero «/boot/config.txt» lo que tu habías escrito por:
# 1-wire settings
dtoverlay=w1-gpio,gpiopin=27
y funciona perfectamente.
Un Saludo. Gracias de nuevo.
Buena idea. ¡Gracias por compartir la solución!
Pingback: Sensor temperatura DS18B20 | Balbino
Hola, y como se podría hacer si quisiesemos conectar sensores con diferentes longitudes ? La resistencia de 4.7k es válida hasta 5metros pero si quisiesemos desplegar un cable de 20metros o más habría que reducir la restistencia hasta 1.2k.
Y si quiero que segun la lectura encienda o apague un relay como por ej. ante una temp. elevada encender ventilador. como podria hacer esto?
Gracias..
Pingback: Monitorización temperatura hormigón con Raspberry Pi | Carlini's Blog
ayudenme y si me sale fichero no existe — soy nueva y ya intente crear pero no sale
Hola!
Ojeando tu post en busca de información sobre sensores para la RaspB 3,1416 veo que dices:
«y, aunque sorprenda, en bash no se puede dividir…»
No es cierto. (en versiones viejas sólo se acepta la sintaxis de doble paréntesis)
La orden:
echo $((4/2))
Devuelve «2»
Así mismo, en versiones más recientes de bash, también se admite:
echo $[4/2]
Gracias por la observación, linuxin. Las pruebas que hice en su momento, y que investigué, no me funcionó… De la forma que indico funciona, de todas maneras.
Hola, hace tiempo que uso bash con el módulo, el problema es que de vez en cuando en la lectura me sale error, marcando 0. ¿Cómo se podría modificar el bash para en caso de error mostrara una «E» por ejemplo? Y ¿cómo se podría indicar que solo en caso de error volver a tomar la temperatura tras sleep 5 por ejemplo?