#importamos las librerias necesarias
import network # libreria para manejar conexiones de red (Wi-Fi) en https://docs.micropython.org/en/latest/library/network.html
import time # libreria para manejar operaciones de tiempo en https://docs.micropython.org/en/latest/library/time.html
import dht # Libería para interactuar con el sensor DHT22 https://docs.micropython.org/en/latest/esp8266/tutorial/dht.html
import ujson # Libería para trabajar con datos en formato JSON en https://docs.micropython.org/en/latest/library/json.html
from umqtt.simple import MQTTClient # Libería para interactuar con servidores MQTT
from machine import Pin, PWM # Libreria para manejar pines en la placa (entrada/salida) en https://docs.micropython.org/en/latest/library/machine.html
# Parámetros del Servidor MQTT
MQTT_CLIENT_ID = "micropython-weather-demo" # Identificador único del cliente MQTT
MQTT_BROKER = "broker.mqttdashboard.com" # Dirección del servidor MQTT
MQTT_USER = "" # Usuario para autenticación en el servidor MQTT
MQTT_PASSWORD = "" # Contraseña para autenticación en el servidor MQTT
MQTT_TOPIC = "wokwi-weather" # Tema MQTT al cual se enviarán los datos meteorológicos
# Crear un objeto sensor DHT22 en el pin 15
sensor = dht.DHT22(Pin(15))
# Configurar el pin de salida para controlar el servo
servo_pin = Pin(18) # El pin de la placa
servo_pwm = PWM(servo_pin, freq=50) # Configura el PWM con una frecuencia de 50 Hz
# Función para mover el servo a una posición específica
def move_servo(angle):
# calibrar el rango de movimiento del servo
duty_min = 25 # Valor mínimo del ciclo de trabajo
duty_max = 127 # Valor máximo del ciclo de trabajo
duty = int(duty_min + (angle / 180) * (duty_max - duty_min))
servo_pwm.duty(duty)
# Conectar a la red Wi-Fi
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
while not sta_if.isconnected():
time.sleep(0.1)
while not sta_if.isconnected(): # Esperar hasta que la conexión a la red Wi-Fi se establezca
print(".", end="")
time.sleep(0.1)
print(" Connected!")
# Conectar al servidor MQTT
print("Connecting to MQTT server... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.connect()
print("Connected!")
# Inicializar variable para almacenar datos meteorológicos anteriores
prev_weather = ""
# Umbral de temperatura para activar el movimiento del servo
umbral_temperatura = 28
# Frecuencia de medición (cada 10 segundos)
medicion_intervalo = 10
# Bandera para indicar si el movimiento intermitente del servo está activo
servo_movimiento_activo = False
# Tiempo de duración del movimiento intermitente (en segundos)
duracion_movimiento_intermitente = 1
# Inicializar el temporizador para el movimiento intermitente
temporizador_movimiento = 0
# Función para realizar el movimiento intermitente
def perform_intermittent_movement():
move_servo(0)
time.sleep(1)
move_servo(180)
time.sleep(1)
# Medir y publicar continuamente las condiciones meteorológicas
while True:
print("Measuring weather conditions... ", end="")
sensor.measure()
# Preparar mensaje JSON con temperatura y humedad
message = ujson.dumps({
"temp": sensor.temperature(),
"humidity": sensor.humidity(),
})
if sensor.temperature() > umbral_temperatura:
# Verificar si el movimiento intermitente está inactivo o ha pasado el tiempo de duración
if not servo_movimiento_activo or (time.ticks_diff(time.ticks_ms(), temporizador_movimiento) > duracion_movimiento_intermitente * 1000):
perform_intermittent_movement()
servo_movimiento_activo = True
temporizador_movimiento = time.ticks_ms()
elif sensor.temperature() <= umbral_temperatura:
move_servo(90)
servo_movimiento_activo = False
# Verificar si las condiciones meteorológicas han cambiado desde la medición anterior
if message != prev_weather:
print("Updated!")
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message))
# Publicar datos meteorológicos en el servidor MQTT
client.publish(MQTT_TOPIC, message)
# Actualizar datos meteorológicos anteriores para la próxima comparación
prev_weather = message
else:
print("No change")