"""
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
"""
"""
Se importan librerías necesarias para el funcionamiento del código,
como la librería para la conexión Wifi, manejo de tiempo, control de pines GPIO,
lectura del sensor DHT22, manipulación de JSON y conexión con un cliente MQTT.
Todas estas librerías las encontramos https://docs.micropython.org/en/latest/.
"""
import network #Se importa la librería network para la conexión Wifi
import time #Se importa la librería time para los retardos
from machine import Pin, PWM #Se importa libreria para el control de pines GPIO
import dht #se importa el controlador para la lectura del sensor DHT22
import ujson #Se importa la librería para trabajar con JSON
from umqtt.simple import MQTTClient #Se importa la librería para la conexión con un cliente MQTT
from servo import Servo
# MQTT Server Parameters
"""se definen los parámetros para la conexión al servidor MQTT como se muestra en las líneas de código,
#en donde se define el ID del cliente, la dirección del bróker MQTT, el usuario y contraseña,
#y el tema MQTT al que se publicaran los datos."""
MQTT_CLIENT_ID = "micropython-weather-demo" #Se define el ID del cliente
MQTT_BROKER = "broker.mqttdashboard.com" #Se define la dirección del broker MQTT
MQTT_USER = "" #Se define el Usuario
MQTT_PASSWORD = "" #Se define la contraseña
MQTT_TOPIC = "wokwi-weather" #Se define el tema MQTT al que se publicaran los datos
#Se define una variable llamada “sensor”, donde se almacenan los datos del sensor DHT22 y lo ubica en el Pin 15 de la placa ESP32.
# Se configuran los pines GPIO para el servo motor
sensor = dht.DHT22(Pin(15)) #Se crea la variable sensor que es conectada en el Pin 15
servo_pin = 18 # PIN de conexion del servo motor
servo = PWM(Pin(servo_pin), freq=50) #Se configura el pin como PWM con una frecuencia de 50Hz/periodo de 20ms
Servo1 = Servo(pin_id=servo_pin) #Se crea una variable auxiliar
sensor = dht.DHT22(Pin(15)) #Se crea el objeto sensor que va a estar ubicado en el Pin 15
# Se realiza la conexión a una red Wifi llamada ¨Wokwi-GUEST¨
print("Connecting to WiFi", end="") #Se imprime la palabra conectando a WiFi
sta_if = network.WLAN(network.STA_IF) #Se crea una instancia de la interfaz Wifi del ESP32
sta_if.active(True) #Se activa la interfaz Wifi
sta_if.connect('Wokwi-GUEST', '') #Se conecta a la red Wifi Wokwi-GUEST
while not sta_if.isconnected(): #Se crea bucle para verificar conexión
print(".", end="") #Mientras no se conecta al Wifi va a escribir un punto
time.sleep(0.1) #Realiza este proceso cada segundo
print(" Connected!") #Cuando ya se conecte a la red se va a imprimir conectado y se finaliza el bucle
#Se realiza la conexión al servidor MQTT que ingresamos anteriormente MQTT_CLIENT_ID / MQTT_BROKER / MQTT_USER / MQTT_PASSWORD / MQTT_TOPIC
print("Connecting to MQTT server... ", end="") #Se imprime conectando al servidor MQTT
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD) #Se ingresa los datos del servidor
client.connect() #Ingresamos al servidor MQTT
print("Connected!") #Se imprime cuando se conecta al servidor
"""
Se crea un bucle infinito, en donde se mide la temperatura con el sensor DHT22,
se convierten los valores a formato JSON y se verifica si existen cambios en los valores.
Si existen cambios se publica un mensaje en el tema MQTT con los nuevos datos de humedad y temperatura,
si no existen cambios se genera un bucle infinita en donde cada 1 segundo se indica que no hay cambios."""
prev_weather = "" #Se crea una variable para alojar los cambios
servo_active = False #Se crea una variable para que el servo empiece apagado
Set_Point = 25 #Umbral de temperatura para activar el servo motor
"""
while True: #Se crea bucle para verificar si los datos del sensor cambiaron
print("Measuring weather conditions... ", end="") #Se genera mensaje de medicion
sensor.measure() #Se mide los valores del sensor
message = ujson.dumps({ #Se transforma las mediciones a JSON
"temp": sensor.temperature(),
"humidity": sensor.humidity(),
})
if message != prev_weather: #Se crea condicion para verificar si hay algun cambio en el sensor
print("Updated!")
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message)) #Si hay algun cambio se van a imprimir los valores
client.publish(MQTT_TOPIC, message) #Se publican los nuevos valores en el servidor MQTT
prev_weather = message
else: #Si no existen cambios se va a imprimir ¨No change¨
print("No change")
time.sleep(1) #Se repide cada segundo esta accion
"""
while True:
sensor.measure() #Se mide los valores del sensor
temperature = sensor.temperature() #Se almacena en la variable temperaure el valor de temperatura
print("Temperatura actual:", temperature)
if temperature > Set_Point and not servo_active: #Se crea una condicion para activar el servo
print("Set_Ponit excedido. Activando servo.")
servo_active = True
message = ujson.dumps({ #Se transforma a formato JSON el valor de temperatura
"temp": temperature,
})
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message))
client.publish(MQTT_TOPIC, message)
while temperature > Set_Point: #Condicion ON, mueve el servo indefinidamente mientras la temperatura sea mayor que el Set_Point
Servo1.write(0) # Envia posición al servo a 0 grados (manecilla hacia arriba)
time.sleep(1) # Espera 1 segundo para alcanzar la posición
Servo1.write(180) # Envia posición al servo a 180 grados (manecilla hacia abajo)
time.sleep(1) # Retardo de 1 segundo para alcanzar la posición
sensor.measure() #Medicion continua de temperatura
temperature = sensor.temperature()
Servo1.write(90) # Envia posición al servo a 0 grados (manecilla hacia arriba)
servo_active = False #Condicion OFF, se desactiva el servo
time.sleep(1)