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

14 comentarios en “Sensor de temperatura DS18B20 en la Raspberry Pi

  1. Pingback: Display de 4 dígitos de 7 segmentos en la Raspberry Pi | Carlini's Blog

  2. Pingback: Sensores de humedad y temperatura DHT11 y DTH22 en la Raspberry Pi | Carlini's Blog

  3. 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?

  4. 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.

  5. Pingback: Sensor temperatura DS18B20 | Balbino

  6. 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.

  7. 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..

  8. Pingback: Monitorización temperatura hormigón con Raspberry Pi | Carlini's Blog

  9. 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.

  10. 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?

Responder a Manuel Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.