# Importar los módulos necesarios
import network # Módulo para gestionar conexiones de red, documentación en https://docs.micropython.org/en/latest/library/network.html
import time # Módulo para funciones de tiempo, documentación en https://docs.micropython.org/en/latest/library/time.html
from machine import Pin, PWM # Importar Pin y PWM de la máquina para control de hardware, más detalles en https://docs.micropython.org/en/latest/library/machine.Pin.html
import dht # Módulo para el sensor DHT22, especificaciones en https://docs.micropython.org/en/latest/esp32/quickref.html#dht-driver
import ujson # Módulo para manipulación de datos en formato JSON, ver https://docs.micropython.org/en/latest/library/ujson.html
from umqtt.simple import MQTTClient # Cliente MQTT para comunicación, disponible en https://github.com/micropython/micropython-lib/tree/master/micropython/umqtt.simple
# Parámetros de configuración MQTT
MQTT_CLIENT_ID = "micropython-weather-servo"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_USER = "" # Usuario MQTT (opcional)
MQTT_PASSWORD = "" # Contraseña MQTT (opcional)
MQTT_TOPIC = "wokwi-weather"
# Configuración inicial del servo
servo_pin = PWM(Pin(18)) # Inicializar pin 18 como PWM para el servo
servo_pin.freq(50) # Establecer frecuencia PWM a 50Hz para el servo
# Inicialización del sensor DHT22 en el pin 15
sensor = dht.DHT22(Pin(15))
# Conexión a la red WiFi
print("Conectando a la red WiFi", end="")
sta_if = network.WLAN(network.STA_IF) # Crear interfaz de estación WiFi
sta_if.active(True) # Activar interfaz WiFi
sta_if.connect('Wokwi-GUEST', '') # Conectar a la red WiFi especificada
while not sta_if.isconnected():
print(".", end="") # Indicador de progreso de conexión
time.sleep(0.1)
print(" Conectado!") # Mensaje de conexión exitosa
# Conexión al servidor MQTT
print("Conectando al servidor MQTT... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD) # Crear cliente MQTT
client.connect() # Conectar al servidor MQTT
print("Conectado!") # Mensaje de conexión exitosa
# Bucle principal para medir y publicar datos meteorológicos
prev_weather = "" # Variable para almacenar los datos meteorológicos previos
while True:
# Medir condiciones meteorológicas
sensor.measure() # Realizar medición con sensor DHT22
temperatura = sensor.temperature() # Obtener temperatura del sensor
# Control del servo basado en la temperatura medida
if temperatura > 40: # Umbral de temperatura para activar el servo
print(f"Temperatura {temperatura}°C supera el umbral. Activando servo.")
for degree in range(0, 181):
# Ajustar el servo de 0 a 180 grados
servo_pin.duty_u16(int(1000 + (degree / 180) * 8000))
time.sleep(0.02)
print("Servo activado.")
else:
print(f"Temperatura {temperatura}°C por debajo del umbral. Deteniendo servo.")
servo_pin.duty_u16(0) # Detener servo si temperatura es baja
# Preparar mensaje JSON con datos de temperatura y humedad
message = ujson.dumps({
"temp": temperatura,
"humidity": sensor.humidity(),
})
# Publicar datos si han cambiado
if message != prev_weather:
print("Publicando datos meteorológicos a MQTT...")
client.publish(MQTT_TOPIC, message)
prev_weather = message
time.sleep(2) # Esperar 2 segundos antes de continuar