Sensor de temperatura DS18B20 en la Raspberry Pi

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.

Transistor DS18B20

Transistor DS18B20

Sensor DS18B20 como módulo

Sensor DS18B20 como módulo

Sensro DS18B20 sumergible

Sensor DS18B20 sumergible

Sensores DS18B20: transistor suelto, en módulo y sumergible

Sensores DS18B20: transistor suelto, en módulo y 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:

Esquema de conexión de DS18b20 a la Raspberry Pi

Esquema de conexión de DS18b20 a la Raspberry Pi (tomado de REUK.co.uk)

DS18B20 conectado a la Raspberry Pi

DS18B20 conectado a la Raspberry Pi B

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.

Módulo DS18B20 conectado a la Raspberry Pi B

Módulo DS18B20 conectado a la Raspberry Pi B

Sensor DS18B20 sumergible conectado a la Raspberry Pi B

Sensor DS18B20 sumergible conectado a la Raspberry Pi B

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.

Esquema de conexión de varios DS18B20 a la Raspberry Pi (tomado de )

Esquema de conexión de varios DS18B20 a la Raspberry Pi (tomado de REUK.co.uk)

Dos sensores DS18B20 conectados a la Raspberry Pi

Dos sensores DS18B20 conectados a la Raspberry Pi

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