"""
MicroPython IoT Weather Station Example for Wokwi.com
To view the data:
1. Go to http://www.hivemq.com/demos/websocket-client/
2. Click "Connect"
3. Under Subscriptions, click "Add New Topic Subscription"
4. In the Topic field, type "wokwi-weather" then click "Subscribe"
Now click on the DHT22 sensor in the simulation,
change the temperature/humidity, and you should see
the message appear on the MQTT Broker, in the "Messages" pane.
Copyright (C) 2022, Uri Shaked
https://wokwi.com/arduino/projects/322577683855704658
"""
import network
import time
from machine import Pin
import dht
import ujson
from umqtt.simple import MQTTClient
from machine import Pin, PWM
# Parametros del servidor MQTT
MQTT_CLIENT_ID = "micropython-weather-demo"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC = "wokwi-weather"
sensor = dht.DHT22(Pin(15)) # Indica el pin de conexión y se le asigna una instancia
servo_pin = Pin(18) # Configuración del Pin 18, para conectar la señal de salida al servo
movimiento_servo = PWM(servo_pin, freq=50) # Configuración para controlar el servo con una frecuencia de 50 Hz
print("Connectando al WIFI", end="") # Mensaje que se imprime en consola
sta_if = network.WLAN(network.STA_IF) # Crea la instancia de la interfaz WIFI
sta_if.active(True) # Conecta la interfaz
sta_if.connect('Wokwi-GUEST', '') # Realiza el intento de conexión a la red Wokwi-GUEST
while not sta_if.isconnected(): # Bucle constante hasta que el equipo este conectado
print(".", end="") # Mensaje que se imprime en consola
time.sleep(0.1) # Espera 0,1 segundos
print(" Connected!") # Mensaje que se imprime en consola
print("Connectando al servidor MQTT... ", end="") # Mensaje que se imprime en consola
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.connect()
print("Connected!") # Mensaje que se imprime en consola
def mover_servo(angle): # Función para mover el servo al ángulo especificado en el ciclo while True
pulso_max = 2400 # Define el pulso máximo
pulso_min = 500 # Define el pulso mínimo
p_total = 20000 #Define el periodo total
pulso = pulso_min + (pulso_max - pulso_min) * (angle / 180) #Formula para lograr la duración del pulso
ct = int((pulso / p_total) * 1023) # Formula para lograr el ciclo de trabajo en una escala de 10 bits.
movimiento_servo.duty(ct) #El controlador envia al servo la señal PWM
prev_weather = "" # Variable para almacenar la temperatura
while True: # Bucle que se repite constantemente
sensor.measure() # Lectura de los valores de temperatura y humedad
temperatura = sensor.temperature() #Guarda en la variable temperatura la temperatura medida
tamb= 20 #se define el valor de la temperatura ambiente
if temperatura > tamb: #Función para que se implemente en caso de que la temperatura medida sea superior a la temperatura ambiente.
mover_servo(0) # Se mueve el servo a 0 grados
time.sleep(1) # Espera 1 segundo para realizar la siguiente acción
mover_servo(180) # Se mueve el servo a 180 grados
time.sleep(1) # Espera 1 segundo para realizar la siguiente acción
else: # Ocurre cuando no cumple la condición anterior, es decir cuando la temperatura es menor a la temperatura ambiente
sensor.measure() # Actualización del valor de la temperatura
message = ujson.dumps({ #Crea un mensaje JSON con el valor medido
"temp": sensor.temperature(), # Valor de temperatura
})
print("Servo no funcionando") # Imprime que el servo no esta funcionando en este segundo escenario
if message != prev_weather: # En caso de que la variable almacenada sea diferente al valor registrado
print("Reportando al MQTT {}: {}".format(MQTT_TOPIC, message)) # Imprime en la consola que esta reportando al servidor y el dato que esta reportando
client.publish(MQTT_TOPIC, message) # Publica el dato en el servidor
prev_weather = message # Actualiza la variable con el último valor medido
time.sleep(5) #Espera 5 segundos para empezar el bucle de nuevo