Estación meteorológica: Conectando un sensor de temperatura y humedad a la Raspberry Pi Pico W

29 de Septiembre, 2024 - Tiempo de lectura: 4 minutos

Para continuar avanzando con mi estación meteorológica conecté un sensor muy habitual para medir temperatura y humedad: El DHT11. Este sensor lo utilizaré para medir la temperatura y humedad en el interior.

La conexión de este sensor fue así:

Conexión del sensor DHT11

Para comunicarme con él empleé esta clase: PicoDHT22, que sirve tanto para el DHT11 como el DHT22. Para poder utilizarla hay que copiar el archivo PicoDHT22.py en la Raspberry Pi Pico W, e importarlo en el código de programa:

from PicoDHT22 import PicoDHT22 # Este paquete es válido tanto para DHT11 como DHT22

Para no declarar todas las variables directamente en el mismo archivo, probé a crear otro fichero distinto e importarlo también. Lo llamé Datos_Meteo.py

#Datos Meteorológicos Datos_Meteo = { 
    'Temp_Ext' : 0, 
    'Hum_Ext' : 0, 
    'Temp_Int' : 0, 
'Hum_Int' : 0, 
}

Para practicar con el uso de las clases cree una clase para utilizar contadores, que luego resultan útiles para depurar el programa. Enviando los valores de los contadores por el puerto serie, por ejemplo, en un determinado punto del programa, con un simple print, se puede saber si el programa se está ejecutando correctamente.

class Counter:

    def __init__(self, name):
        self.name = name
        self.count = 0

    def Increment(self):
        self.count += 1
    def Reset(self):
        self.count = 0

Contador1 = Counter("Cuenta1")

Otro detalle que tiene el programa es el uso de timers para la lectura cíclica del sensor. Viene muy bien si más adelante queremos ejecutar diferentes rutinas en periodos distintos de tiempo. Declaré una instancia de timer cíclico de 3 segundos. Se puede reducir el tiempo hasta 1 segundo, pero si se reduce más puede que se pierdan lecturas.

Aquí está el programa completo:

#Lectura de Sensor DHT11
from machine import Pin, Timer
from PicoDHT22 import PicoDHT22 # Este paquete es válido tanto para DHT11 como DHT22
import utime
import time
from datos_meteo import Datos_Meteo as datos_meteo # Diccionario donde guardo las variables temp y hum

tim_3sec = Timer()

class Counter:

    def __init__(self, name):
        self.name = name
        self.count = 0

    def Increment(self):
        self.count += 1
    def Reset(self):
        self.count = 0

Contador1 = Counter("Cuenta1")

# Configuración DHT11 
dht_sensor=PicoDHT22(Pin(28,Pin.IN,Pin.PULL_UP),dht11=True)
print('Hola')

utime.sleep_ms(2000)    

# Primera lectura de Temp y Humid
T,H = dht_sensor.read()
#print("{}'C  {}%".format(datos_meteo['Temp_Int'],datos_meteo['Hum_Int'])) #DHT22 not responsive if delay too short

# =========================================================    
def tick_3sec(timer):

    # Lectura de Temp y Humid
    T,H = dht_sensor.read()
    datos_meteo['Temp_Int'] = T
    datos_meteo['Hum_Int'] = H
    if datos_meteo['Temp_Int'] is None:
        print(" sensor error")
    else:
        print("{}'C  {}%".format(datos_meteo['Temp_Int'],datos_meteo['Hum_Int'])) #DHT11 not responsive if delay to short

    Contador1.Increment()
    print(Contador1.count)  

# =========================================================     

# Inicialización de Timers
tim_3sec.init(period=3000, mode=Timer.PERIODIC, callback=tick_3sec)

# Ciclo de programa principal ->

while True:

    utime.sleep_ms(100)

    # FIN CICLO PRINCIPAL

A la hora de depurar el programa me encontré con el mensaje de error "[Errno 12] ENOMEM" en Thonny:

Estuve buscando un rato, pero no encontré nada documentado 😐. El problema ocurre cuando se ejecuta el programa desde Thonny. Si se copia en la Raspberry Pi Pico, el programa se ejecuta correctamente. Para comprobar que estaba leyendo bien la temperatura y humedad, como estaba enviando los datos por el puerto serie me ayudé de un viejo amigo: el Tera Term. 😎