Quiero monitorizar la evolución en el tiempo de la temperatura de una masa de hormigón armado de gran espesor en tres puntos de su volumen durante su fraguado. Para ello, voy a disponer 4 sondas DS18B20 en el interior de la masa (en el centro, y cerca de las caras), y un sensor DHT22 en el exterior para controlar la temperatura y humedad ambientes, conectados todos a una Raspberry Pi que irá registrando los valores cada minuto, archivándolos en un pincho USB, y enviándolos por correo electrónico cada hora.
Materiales
- Raspberry Pi. Vale cualquier modelo. Yo he empleado una Raspberry Pi B+ v1.2 que tenía disponible. Aprox 20€.
- Tarjeta SD 16 GB. Valdría con una de 8 GB, lo suficiente para una instalación de Raspbian.
- Memoria USB. Cualquier pincho USB que tengamos.
- 4x DS18B20 sumergibles. Comprados aquí por 2.59€ la unidad. Total: 7.77€
- Sensor DHT22 de temperatura y humedad, para monitorizar la temperatura y humedad ambientes
- 5m cable CAT5
- Modem 3G USB
- Caja Estanca IP55, o un tupper.
- Batería
Preparo los sensores
Los DS18b20 vienen con 1 m de cable. Como necesito algo más de longitud, empalmo un par de metros más por cada sensor y luego los junto todos a un cable de 5m. El tipo de cable que empleo es RJ45.
Hasta los 10m de longitud aproximadamente me basta con soldar entre dos de los cables una resistencia de 4.7kohm. Para longitudes mayores, en esta página hablan de la resistencia pull-up a disponer en función de la longitud del cable.
Tras soldar todos los cables, los protejo con cola térmica, y luego con cinta aislante.
Código para registrar las temperaturas
En esta entrada ya hablé de cómo usar un sensor DS18B20 con una Raspberry Pi, y esta otra, del sensor DHT22. Antes de la conexión definitiva hago pruebas con cada uno de los sensores por separado para ver que está todo en orden.
Básicamente, sigo los pasos que indiqué en la entrada en la que hablé del DS18B20 para probar que funcionan cada uno de los sensores. Una vez que averiguo el identificador de cada uno de los sensores, preparo este pequeño script en Python que registra la temperatura de los sensores en un fichero:
# -*- coding: utf-8 -*- import os #Para poder pasar comandos al sistema (sudo modprobe...) import time #Para poder sacar la hora del sistema import logging #Para loguear los eventos import Adafruit_DHT #Para poder usar el DHT termo1 = "28-0417838399ff" termo2 = "28-041783898fff" termo3 = "28-04178386dbff" termo4 = "28-04178389e9ff" sensor = Adafruit_DHT.DHT22 pin = 24 #Pin donde está conectado el DHT22 #Cargo los módulos para el termómetro: os.system("sudo modprobe wire") os.system("sudo modprobe w1-gpio") os.system("sudo modprobe w1-therm") #Inicializo el log: logging.basicConfig(filename='/media/pincho/temps.log',level=logging.INFO,format='%(asctime)s %(message)s') #Función para obtener la hora del sistema: def get_date_time(): return time.strftime("%d/%m/%Y,%H:%M:%S") #Función para obtener la temperatura de un termómetro: def get_temp_sens(term): try: ruta = "/sys/bus/w1/devices/" + term + "/w1_slave" tfile = open(ruta) text = tfile.read() tfile.close() secondline = text.split("\n")[1] temperaturedata = secondline.split(" ")[9] temperature = float(temperaturedata[2:]) temperature = temperature / 1000 temperature = round (temperature,1) except: temperature = 0 return float(temperature) #Función para obtener la temperatura y humedad del DHT22: def get_tempYhum(): try: humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) temperature = round (temperature,1) humidity = round (humidity,1) except: humidity = 0 temperature = 0 return float(temperature), float(humidity) hora = get_date_time() temp0,humedad = get_tempYhum() temp0 = str(temp0) humedad = str(humedad) tempsens1= str(get_temp_sens(termo1)) tempsens2= str(get_temp_sens(termo2)) tempsens3= str(get_temp_sens(termo3)) tempsens4= str(get_temp_sens(termo4)) linealog = hora + \ "," + temp0 + \ "," + humedad + \ "," + tempsens1 + \ "," + tempsens2 + \ "," + tempsens3 + \ "," + tempsens4 print(linealog) logging.info(linealog)
Conexión de los sensores
Para conectar los DS18B20, decido emplear un conector RJ45 (para facilitar la conexión en obra) que saco de una tarjeta de red vieja que tenía por ahí (ni siquiera la desueldo, directamente la corto con una sierra:
Y le sueldo la resistencia y los cables que conectaré a la Raspberry Pi:
Configuro la Raspberry Pi
- Descargo la última versión de Raspbian (Raspbian Stretch, 2018-03-13) y la instalo en una tarjeta SD con Etcher
- Configuro Raspbian para poder acceder desde SSH, configuro los locales y teclado, etc. La nombro RaspiHormiMon
- Creo un túnel reverso SSH, siguiendo las instrucciones que preparé en esta entrada.
Conecto el pincho USB
Además de enviar los datos por internet, voy a archivar los registros en un pincho USB. Para ello tengo que instalarlo y garantizar que se cargue siempre en el arranque, modificando /etc/fstab
. Sigo los pasos que ya conté en esta entrada.
Conexión a internet
Pensaba que tendría que seguir los pasos de esta entrada que escribí hace un par de años, pero compruebo que al conectar el Huawei E303 con una tarjeta SIM con el pin deshabilitado, la Raspberry Pi la reconoce perfectamente (en las últimas versiones de Raspbian viene por defecto usbmodeswitch) sin necesidad de hacer nada y se conecta automáticamente a internet como si fuese una conexión alámbrica, eth1.
Que envíe el log por email
Configuro la Raspberry Pi para que pueda enviar ficheros por correo, siguiendo los pasos que cuento en esta entrada.
Crontab
Ahora añado las siguientes líneas al crontab para que se ejecuten las tareas descritas anteriormente:
- Registro de temperaturas cada minuto
- Envío por correo electrónico del fichero de registros cada hora
Ejecuto:
crontab -e
Y añado las dos siguientes líneas:
* * * * * sudo python /home/pi/logsens.py 0 * * * * mpack -s "Log Temps" /media/pincho/temps.log direccionDeCorreo@dominio.com
Batería y alimentación
Como pretendo dejar el invento en una obra, que estará alimentado a saber de qué forma (un grupo electrógeno seguramente), le pongo una batería, que permita seguir funcionando si se va un rato la luz, y también que proteja de las subidas de tensión.
La alimentación se hará por medio de un cargador convencional micro-usb de 5V (los de los móviles).
Carcasa
Con todo ya listo, lo meto dentro de una caja IP55, que es relativamente estanca, y de dimensiones perfectas para encajar todo sin estar muy apretado.
Montaje en obra
Tengo que decir que yo no pude colocar los sensores en obra y los colocó mi compañero y amigo Jorge. Como no podía ser de otra forma, estuvo lloviendo mientras lo colocaba, por lo que ¡se empapó enterito!
Aquí van una serie de fotos de la colocación de los sensores en obra:
Resultados
La Raspberry Pi tomaba medidas cada minuto, y enviaba un correo electrónico con todo el registro cada hora.
Versión 2
Código revisado, que incorpora los leds de aviso de si hay un error cada minuto, para poder comprobar en obra una vez instalado que está todo en orden, sin tener que esperar a recibir el mensaje cada hora. En caso de haber algún problema, y tras descartar error en conexiones, podría ajustarse la resistencia variable (potenciómetro).
También instalé 5 conectores RJ-45, para poder conectar directamente varios cables y no tener que hacer laboriosos empalmes como tuve que hacer en la ocasión anterior…