"""
PROGRAMA: CLIENTE MQTT PARA SENSOR DHT22 CON MICROPYTHON
Descripción: Este programa conecta un Raspberry Pi Pico a WiFi y a un broker MQTT,
permitiendo controlar un LED, leer temperatura/humedad con un DHT22, y enviar/recepcionar
mensajes mediante el protocolo MQTT. Incluye manejo de interrupciones para un botón.
"""
# --- SECCIÓN 1: IMPORTACIÓN DE LIBRERÍAS ---
import network # Para manejar la conexión WiFi
import time # Para manejar tiempos y delays
import umqtt.simple as mqtt # Cliente MQTT simplificado
from machine import Pin # Para controlar pines GPIO
import dht # Driver para el sensor DHT22
# --- SECCIÓN 2: CONFIGURACIÓN INICIAL DE HARDWARE ---
led = Pin(0, Pin.OUT) # LED conectado al pin GPIO 0 (configurado como salida)
boton = Pin(18, Pin.IN, Pin.PULL_UP) # Botón en GPIO 18 con resistencia pull-up interna
dht22 = dht.DHT22(Pin(15)) # Sensor DHT22 conectado al pin GPIO 15
continua = True # Variable de control para el bucle principal
# --- SECCIÓN 3: FUNCIÓN DE CALLBACK PARA MENSAJES MQTT ---
def receptor(topic, msg):
"""Función que se ejecuta cuando llega un mensaje MQTT suscrito"""
global continua
m = msg.decode() # Decodifica el mensaje de bytes a string
# Acciones según el mensaje recibido
if m == 'A':
led.on() # Enciende el LED si el mensaje es 'A'
elif m == 'B':
led.off() # Apaga el LED si el mensaje es 'B'
elif m == 'Z':
continua = False # Termina el programa si el mensaje es 'Z'
print(m) # Imprime el mensaje recibido
# Inicializa variable para el debounce del botón
ini_boton = time.ticks_ms()
# --- SECCIÓN 4: FUNCIÓN DE INTERRUPCIÓN PARA EL BOTÓN ---
def boton_fun(boton):
"""Función que se ejecuta cuando se presiona el botón (por interrupción)"""
global ini_boton
fin = time.ticks_ms() # Obtiene el tiempo actual en milisegundos
# Verifica que hayan pasado al menos 200ms para evitar rebotes (debounce)
if(time.ticks_diff(fin, ini_boton) > 200):
dht22.measure() # Realiza una medición del sensor DHT22
temp = dht22.temperature() # Lee la temperatura
hum = dht22.humidity() # Lee la humedad
c.publish('temp', str(temp)) # Publica la temperatura en el topic 'temp'
c.publish('hum', str(hum)) # Publica la humedad en el topic 'hum'
print("Temperatura: ", temp) # Imprime temperatura en consola
print("Humedad: ", hum) # Imprime humedad en consola
ini_boton = fin # Actualiza el tiempo de la última pulsación
# Configura la interrupción para el botón (se activa en flanco de bajada)
boton.irq(trigger=Pin.IRQ_FALLING, handler=boton_fun)
# --- SECCIÓN 5: CONEXIÓN A RED WiFi ---
wf = network.WLAN(network.STA_IF) # Crea objeto para modo estación (cliente WiFi)
wf.active(True) # Activa la interfaz WiFi
wf.connect("INFINITUM08B1", "PaRe7NRNRE") # Intenta conectar a la red WiFi
# Espera hasta que se establezca la conexión
while not wf.isconnected():
print(".", end=' ') # Imprime puntos mientras espera
time.sleep(1) # Espera 1 segundo entre intentos
print("\nConectado al WiFi!!!") # Mensaje de conexión exitosa
config = wf.ifconfig() # Obtiene configuración de red
print("IP = ", config[0]) # Muestra la dirección IP asignada
# --- SECCIÓN 6: CONEXIÓN Y CONFIGURACIÓN MQTT ---
c = mqtt.MQTTClient("pico1", "18.191.157.166") # Crea cliente MQTT con ID y broker
c.set_callback(receptor) # Establece la función de callback para mensajes
c.connect() # Conecta al broker MQTT
c.subscribe('estado') # Se suscribe al topic 'estado'
print("Esperando mensajes...") # Mensaje indicando que está listo
# --- SECCIÓN 7: BUCLE PRINCIPAL ---
while continua == True:
c.wait_msg() # Espera mensajes MQTT (no bloqueante)
# --- SECCIÓN 8: FINALIZACIÓN ---
c.disconnect() # Desconecta del broker MQTT
print("Fin del Programa.") # Mensaje de finalización