Mediante un sensor DS18B20 podemos obtener una lectura de temperatura fácil y precisa. Este sensor puede ser una gran aliado para nuestro montajes. Este sensor de temperatura utiliza el protocolo de comunicación 1-Wire, lo que nos permite una facil comunicación con el, y la posibilidad de crear un red de sensores, sin tener que ocupar muchos de nuestros pines de entradas y salidad de datos de nuestro Raspberry Pi.
Materiales usados
Esquema de montaje DS18B20 y Raspberry Pi
El montaje del sensor en un sencillo, la alimentación del sensor lo haremos mediante el pin de 3,3v del conector GPIO (pin 1), al clave rojo del sensor, en mi caso, si utilizamos la versión como un transistor, la conectaremos al pin más a la izquierda. La masa, la sacaremos el pin 6 del GPIO, y lo conectaremos al cable negro, o al pin de la derecha del sensor. La salida de datos la conectaremos al pin 4, al cable amarillo, o al pin del medio del sensor. Para terminar el montaje, tendremos que situar una resistencia de 4K7 Ohm, entre el pin positivo del sensor y el pin de datos.
Esquema de montaje del sensor DS18B20 con un Raspberry Pi
El sensor DS18B20, permite conectar varios sensores al mismo canal, es decir, que si queremos añadir más sensores DS18B20 a nuestro circuito, no tendremos que ocupar más pines de datos de nuestra raspberry, colo tendremos que conectar cada uno de los pines del sensor al mismo circuito que el primero.
Ejemplo de montaje de varios sensores DS18B20 a una Raspberry Pi.
Montaje de varios sensores DS18B20 a una Raspberry Pi
Comprobando la instalación de los sensores DS18B20
Como todas las comunicaciones que Linux hace con cualquier dispositivo, ya sea puertos serie, USB, comunicaciones I2C, etc. La forma de trabajar la Raspberry Pi con el sensor de temperatura DS18B20 es creando un fichero, donde el sensor escribe los datos devuelto. Esta comunicación la realiza mediante el bus 1-Wire.
Para comprobar que nuestra Raspberry Pi lee todos los sensores que tenemos instalados, solo tendremos que mirar cuantas carpetas con el inicio «28» tenemos dentro del directorio que maneja las comunicaciones con el bus 1-Wire. Cada una de estas carpetas que comienzan por «28» corresponde con el numero de serie del sensor de temperatura.
ls /sys/bus/w1/devices/
Cada una de estas carpetas que comienzan por «28» corresponde con el número de serie del sensor de temperatura. Si faltase alguna carpeta, habría que comprobar la conexión de ese sensor.
Lectura del sensor DS18B20 con una Raspberry Pi
Para leer los datos proporcionados por el sensor de temperatura DS18B20 con nuestra Raspberry Pi solo tendremos que acceder a cada una de las carpetas, y leer los datos que hay dentro del fichero «w1-slave». En este fichero tendremos el valor de la temperatura leída por el sensor * 1000, es decir, para obtener el valor real de la temperatura, dividiremos el valor del parametro «t» / 1000.
Para hacer esto desde Python, haremos los siguiente.
Añadiremos las siguientes librerías, para el manejo de ficheros y directorios del sistema
# Librerias para la lectura de la temperatura
import os
import glob
Cargamos los módulos en el kernel del sistema para manejar el bus 1wire del conector GPIO del Raspberry Pi.
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
Cargamos la ruta donde se encuentra nuestro sensor.
Carpeta_Sensor = glob.glob( '/sys/bus/w1/devices/' + '28*')[0]
Con esta linea cargamos el nombre del primer sensor de la lista disponible, para cargar las demás rutas solo tendremos que cambiar «[0]» por la posición deseada.
Lo siguiente que haremos es leer el fichero «w1_slave», para leer el valor de la temperatura del sensor. Leemos el fichero y cargamos todas las lineas disponibles en una variable.
fSensor = open(Carpeta_Sensor + ',/w1_slave' 'r')
linSensor = fSensor.readlines()
fSensor.close()
Una vez que ya tenemos el contenido del fichero, buscamos el parámetro «t» donde esta la temperatura. Una vez que encontramos la temperatura, la multiplicamos por 1000, par obtener el valor real.
posTemp = linSensor[1].find('t=')
# Si la posicion es valida
if posTemp != -1:
# Anadimos son posiciones mas por t=
strTemp = lines[1][posTemp+2:]
# Calculamos la temperatura real
temperatura = float(strTemp) / 1000.0
Con esto ya tendríamos el valor del sensor, con su valor real, dentro de la variable «temperatura».