import network
import time
from machine import Pin, PWM # Importamos PWM para controlar el servo
import dht
import ujson
from umqtt.simple import MQTTClient
# ---------------- CONFIGURACIÓN MQTT ----------------
MQTT_CLIENT_ID = "micropython-weather-servo" # Identificador único para el cliente MQTT
MQTT_BROKER = "broker.mqttdashboard.com" # Dirección del servidor MQTT
MQTT_USER = "" # Usuario MQTT (vacío en este caso)
MQTT_PASSWORD = "" # Contraseña MQTT (vacía en este caso)
MQTT_TOPIC = "wokwi-weather" # Tópico al que se publicarán los datos
# ---------------- CONFIGURACIÓN SERVO Y SENSOR ----------------
SERVO_PIN = 18 # Pin GPIO al que está conectado el servo
DHT_PIN = 15 # Pin GPIO donde está conectado el sensor DHT22
TEMP_THRESHOLD = 30 # Umbral crítico de temperatura en grados Celsius
HUMIDITY_THRESHOLD = 60 # Umbral crítico de humedad en %
# Configuración del sensor DHT22
sensor = dht.DHT22(Pin(DHT_PIN))
# Configuración del servo (PWM)
servo = PWM(Pin(SERVO_PIN), freq=50) # Frecuencia de 50Hz para el control del servo
# ---------------- FUNCIÓN CONEXIÓN WIFI ----------------
def connect_to_wifi():
print("Connecting to WiFi...")
sta_if = network.WLAN(network.STA_IF) # Crea un objeto de interfaz WiFi en modo cliente
sta_if.active(True) # Activa la interfaz WiFi
if not sta_if.isconnected(): # Si no está conectado...
sta_if.connect('Wokwi-GUEST', '') # Intenta conectar a la red WiFi (SSID y password)
timeout = 10 # Define un tiempo límite de 10 segundos
while not sta_if.isconnected() and timeout > 0:
print("Connecting...", timeout)
time.sleep(1) # Espera 1 segundo entre intentos
timeout -= 1 # Reduce el contador
if sta_if.isconnected(): # Si se conecta correctamente
print("WiFi Connected! Network config:", sta_if.ifconfig()) # Muestra la configuración IP
else:
print("Failed to connect to WiFi.") # Mensaje de error si no conecta
# ---------------- FUNCIÓN CONEXIÓN MQTT ----------------
def connect_to_mqtt():
print("Connecting to MQTT server...")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.connect() # Conecta al servidor MQTT
print("Connected to MQTT server!")
return client # Devuelve el objeto cliente MQTT
# ---------------- FUNCIÓN PARA MOVER EL SERVO ----------------
def move_servo(angle):
"""
Convierte el ángulo deseado (0° a 180°) en un valor de duty cycle adecuado.
"""
duty = int((angle / 180) * 100 + 25) # Convierte el ángulo al rango de 25 a 125
servo.duty(duty) # Asigna el duty cycle al servo
# ---------------- PROGRAMA PRINCIPAL ----------------
def main():
connect_to_wifi() # Conecta a la WiFi
client = connect_to_mqtt() # Conecta al servidor MQTT
prev_weather = "" # Guarda el último dato enviado para evitar redundancia
while True:
# Lectura de los datos del sensor
sensor.measure() # Toma una nueva medición
temp = sensor.temperature() # Lee la temperatura
humidity = sensor.humidity() # Lee la humedad
print("Temperature: {}°C, Humidity: {}%".format(temp, humidity))
# Publicar datos en MQTT
weather_data = ujson.dumps({"temp": temp, "humidity": humidity}) # Convierte a JSON
if weather_data != prev_weather: # Evita publicar el mismo dato repetidamente
print("Reporting to MQTT topic:", weather_data)
client.publish(MQTT_TOPIC, weather_data) # Envía los datos al tópico MQTT
prev_weather = weather_data # Actualiza el dato previo
# Evaluar condiciones para mover el servo
if temp > TEMP_THRESHOLD or humidity > HUMIDITY_THRESHOLD: # Si se superan los umbrales
print("Threshold exceeded! Activating servo...")
# Movimiento del servo de 0° a 180°
for angle in range(0, 181, 5): # Incrementa de 0° a 180° en pasos de 5°
move_servo(angle)
time.sleep(0.05) # Pausa para suavizar el movimiento
# Movimiento del servo de 180° a 0°
for angle in range(180, -1, -5): # Decrece de 180° a 0° en pasos de 5°
move_servo(angle)
time.sleep(0.05) # Pausa para suavizar el movimiento
else:
print("Conditions normal. Servo OFF.")
servo.duty(0) # Desactiva el servo
# ---------------- EJECUTAR PROGRAMA ----------------
main()