98 - Medir humedad y temperatura con la Raspberry
Con un sensor combinado puedes medir humedad ambiente y temperatura con la Raspberry registrarlas y hacer un seguimiento de la evolución de estos parámetros
Esto de la climatología es una de las cosas que siempre me ha llamado poderosamente la atención. Una de mis mayores ilusiones sin lugar a dudas, es la posibilidad de tener mi propia estación meteorológica. Poder hacer mis propias mediciones y llevar un seguimiento estadístico de la evolución de temperatura, humedad, velocidad del viento y resto de parámetros, es algo que realmente me fascina. Sin embargo, siempre me ha parecido una afición relativamente cara, y una razón por la que siempre la he dejado de lado. Pero, desde que me he metido con esto de ver la influencia de las condiciones externas en el funcionamiento de la Raspberry Pi 4, no paro de darle vueltas. Así quiero tener un perfecto estudio comparando la temperatura de la Raspberry Pi con la temperatura ambiente para ver como afecta… y desacoplar temperatura ambiente de la evolución de la Raspberry. Vaya, básicamente se trata de medir humedad ambiente y temperatura con la Raspberry, y representarla gráficamente.
Dicho esto, en este nuevo episodio del podcast, quiero explicarte como he incorporado un sensor de temperatura y humedad. El objeto es llevar un seguimiento de estos dos parámetros. Eso si, en el interior de casa. Pero, es que, como he dicho, se trata de conocer la evolución de la temperatura de la Raspberry.
Medir humedad y temperatura con la Raspberry
Existen diferentes sensores que te permiten conocer la temperatura ambiental. Sin embargo, ya que me metía, he decidido que el sensor también permitiera conocer la humedad relativa. De esta forma, y de una sola lectura podía llevar un seguimiento de ambos parámetros.
Entiendo que en condiciones normales, la humedad relativa no le afectará a la Raspberry. Sin embargo, te puedo asegurar que a mi si que me afecta. Y como me afecta, y la diferencia no es sustancial, he decidido monitorizarlas ambas, durante unos semanas, meses o el tiempo que sea.
El sensor
Para medir temperatura y humedad hay dos sensores que los puedes encontrar en casi cualquier sitio. Se trata del DHT11 y el DHT22. Son dos sensores de una misma familia.
Se trata de sensores muy extendidos, aunque básicos y algo lentos, pero con un precio relativamente bajos. Precisamente esta característica es la que justifica que estén tan extendidos. Al final, lo que tratamos es monitorizar de alguna manera, temperatura y humedad, sin que nos cueste un ojo de la cara.
Con esto de llamarlos lentos a los sensores, simplemente me refiero a que la respuesta a los cambios que se producen no es instantánea si no que requiere de un tiempo.
Cada uno de estos dispositivos está constituido por un sensor de humedad y un termistor. Disponen de un chip que realiza la conversión analógico a digital, de forma que la señal digital es fácilmente legible por cualquier microcontrolador.
Existen algunas diferencias entre el DHT11 y el DHT22. Pero básicamente se reducen a que el segundo tiene una mayor precisión, sobre todo en lo que se refiere a la temperatura y que el rango de temperatura oscila entre los -40 y los 80, mientras que en el caso del hermano económico parte de los 0 hasta los 50 grados celsius. En el caso de las humedades, el mas económico va de 20 a 80% mientras que el DHT22 barre todo el espectro.
En mi caso particular he probado diferentes opciones para estos sensores. He probado únicamente sensores de temperatura y sensores combinados de humedad y temperatura. También he probado un sensor combinado que no requiere de la resistencia que veremos mas adelante porque la lleva incorporado el propio sensor.
1 Wire Interface
Ahora que ya tienes tu sensor que te va a permitir tener información de parámetros como la temperatura o la humedad, queda integrarlos con la Raspberry Pi.
Con este fin la Raspberry tiene un 1-Wire bus, que puedes utilizar a través del GPIO4. Se trata de un bus que tiene una velocidad de lectura lenta, pero es lo mas habitual para la utilización con los sensores que has visto hasta el momento.
1-Wire es un protocolo de comunicaciones del tipo maestro esclavo, con una única línea de datos, y con una referencia a tierra común de todos los dispositivos. La línea de datos requiere de una resistencia conectada a la alimentación, y que verás en muchos esquemas de conexión.
GPIO
Uno de los problemos a los que siempre me enfrento a la hora de cablear la Raspberry es reconocer cual es el GPIO al que tengo que conectar. Siempre termino buscando algún esquema en internet donde quede reflejado todos los GPIO. Sin embargo, no es necesario. Existe un paquete que te pone toda la información que necesitas en el terminal. Se trata de gpiozero
. Este paquete lo puedes instalar en tu Raspberry ejecutando la siguiente instrucción,
sudo apt install python3-gpiozero
Una vez instalado, tan solo tienes que ejecutar pinout
en la Raspberry que quieras para ver el esquema de coneción, con la posición y nombre para cada uno de los GPIO.
Pero además esta librería de Python te da mucho mas juego, porque te permite integrar diferentes elementos y dispositivos. No te preocupes, porque tarde o temprano volveré a dedicar un nuevo capítulo del podcast. Y si tienes mucha prisa, no tienes mas que darle un vistazo a la documentación del proyecto gpiozero.
Esto es parte de lo que se muestra al ejecutar pinout
,
J8:
3V3 (1) (2) 5V
GPIO2 (3) (4) 5V
GPIO3 (5) (6) GND
GPIO4 (7) (8) GPIO14
GND (9) (10) GPIO15
GPIO17 (11) (12) GPIO18
GPIO27 (13) (14) GND
GPIO22 (15) (16) GPIO23
3V3 (17) (18) GPIO24
GPIO10 (19) (20) GND
GPIO9 (21) (22) GPIO25
GPIO11 (23) (24) GPIO8
GND (25) (26) GPIO7
GPIO0 (27) (28) GPIO1
GPIO5 (29) (30) GND
GPIO6 (31) (32) GPIO12
GPIO13 (33) (34) GND
GPIO19 (35) (36) GPIO16
GPIO26 (37) (38) GPIO20
GND (39) (40) GPIO21
Y que te da idea donde tienes que conectar cada elemento.
Montaje para medir humedad y temperatura con la Raspberry
En la siguiente imagen encontrarás un esquema del montaje realizado en el caso de que el sensor de humedad y temperatura no lleve incorporado la resistencia.
Mientras que si tu sensor de humedad y temperatura lleva incorporado la resistencia, el cableado es bastante simple y queda conforme ves en el siguiente esquema de la captura de pantalla.
Mi caso es el segundo, es decir, el sensor lleva incorporada la resistencia, con lo que he prescindido de la placa de pruebas, y los cables van directos desde la Raspberry al sensor.
Un poco de Python
Para la lectura de temperatura y humedad relativa del sensor utilizo un módulo de Python implementado por Adafruit y que está disponible en un repositorio en GitHub, Adafruit_Python_DHT.
La instalacion de este módulo es realmente sencilla. Solo tienes que ejecutar las siguientes instrucciones,
sudo apt update
sudo apt install python3-pip
sudo python3 -m pip install --upgrade pip setuptools wheel
sudo pip3 install Adafruit_DHT
Una vez instalado el módulo he implementado el siguiente script a partir de los ejemplos y la documentación disponible en Adafruit,
#!/usr/bin/python
import sys
import Adafruit_DHT as dht
sensor = dht.DHT22
pin = 4
humidity, temperature = dht.read_retry(sensor, pin)
print('Temp={0:0.1f} *C, Hum={1:0.1f} %'.format(temperature, humidity))
sys.exit(0)
Integración con RPi Monitor
Como te he comentado al principio del podcast la idea es la de poder independizar las mediciones de temperatura de la Rasbperry 4, de la temperatura ambiente. Para esto, me resultaba necesario mostrar tanto la temperatura ambiente como la humedad relativa en los gráficos de RPi Monitor.
Esto es relativamente sencillo, mas si tenemos en cuenta que RPi Monitor ya tiene una implementación de esto. Sin embargo, como no me podía estar quieto, la he personalizado para mis necesidades. Por un lado, las he mostrado en forma de reloj
, tal y como puedes ver en la siguiente captura de pantalla,
Por otro lado he combinado la lectura de la temperatura ambiente y la humedad relativa, con la temperatura de la Raspberry y otros parámetros, tal y como puedes ver en la siguiente captura de pantalla,
Para hacer esto, he creado un nuevo archivo /etc/rpimonitor/template/dht22.conf
para RPi Monitor con la siguiente definición,
# Get dynamic data
dynamic.21.name=living_room_temp,humidity
dynamic.21.source=dht
dynamic.21.regexp=Temp=(\S+) \*C, Hum=(\S+)
dynamic.21.postprocess=
dynamic.21.rrd=GAUGE
# Add a line of status in page number 2
web.status.1.content.21.name=Ambiente
web.status.1.content.21.icon=cpu_temp.png
web.status.1.content.21.line.1=JustGageBar("Temperatura ambiente", data.living_room_temp+"°C", 10, data.living_room_temp, 60, 100, 80)
web.status.1.content.21.line.2=JustGageBar("Humedad ambiente", data.humidity+"%", 50, data.humidity, 100, 100, 80)
web.statistics.1.content.21.name=Ambiente
web.statistics.1.content.21.graph.1=living_room_temp
web.statistics.1.content.21.graph.2=humidity
web.statistics.1.content.21.ds_graph_options.living_room_temp.label=Temperatura ambiente (deg C)
web.statistics.1.content.21.ds_graph_options.humidity.label=Humedad (%)
web.statistics.1.content.21.ds_graph_options.humidity.yaxis=2
web.statistics.1.content.21.graph_options.legend= { position: "sw"}
web.statistics.1.content.21.graph_options.y2axis={ position: "right", min: 0, max: 100 }
web.statistics.1.content.22.name=Combinada
web.statistics.1.content.22.graph.1=living_room_temp
web.statistics.1.content.22.graph.2=humidity
web.statistics.1.content.22.graph.3=soc_temp
web.statistics.1.content.22.graph.4=cpu_voltage
web.statistics.1.content.22.graph.5=load15
web.statistics.1.content.22.graph.6=cpu_frequency
web.statistics.1.content.22.ds_graph_options.living_room_temp.label=Temperatura ambiente (°C)
web.statistics.1.content.22.ds_graph_options.humidity.label=Humedad (%)
web.statistics.1.content.22.ds_graph_options.soc_temp.label=Temperatura CPU (°C)
web.statistics.1.content.22.ds_graph_options.load15.label=Load 15min
web.statistics.1.content.22.ds_graph_options.living_room_temp.yaxis=1
web.statistics.1.content.22.ds_graph_options.soc_temp.yaxis=1
web.statistics.1.content.22.ds_graph_options.humidity.yaxis=2
web.statistics.1.content.22.ds_graph_options.cpu_voltage.yaxis=3
web.statistics.1.content.22.ds_graph_options.load15.yaxis=4
web.statistics.1.content.22.ds_graph_options.cpu_frequency.yaxis=5
web.statistics.1.content.22.graph_options.legend= { position: "sw"}
web.statistics.1.content.22.graph_options.y2axis={ position: "right", min: 0, max: 100 }
web.statistics.1.content.22.graph_options.y3axis={ position: "right", min: 0, max: 3 }
web.statistics.1.content.22.graph_options.y5axis={ position: "right", min: 0, max: 2000 }
Conclusión
Con esto ya tengo todos los elementos necesarios para realizar las diferentes pruebas con el objetivo de concluir cual es el mejor sistema para tener la Raspberry Pi 4 perfectamente refrigerada. Pero esto será objeto de un futuro episodio del podcast.
Más información,
he recorrido todos los tutoriales, hasta ahora no las puedo leer la T y H, ya estamos en version python 3.7.9, instalado por raspbian, es eso el problema de no poder leer los resultados de los sensores, hasta he visto que tienen que instalar el python 2.
ayuda por favor
Lo que he comentado en este artículo es para Python3
Un saludo.
que tipo de sensor utilizaste para tener la resistencia integrada dentro del sensor,
si pudiera ponerme en contacto me seria de mucha ayuda