"""
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
"""
# Estas son las liberias requeridas para que el código se ejecute correctamente.
import network #Libreria para manejo de interfaces de red https://docs.micropython.org/en/latest/library/network.html
import time #Libreria para implementar funciones de tiempo https://docs.micropython.org/en/latest/library/time.html
from machine import Pin #Libreria que nos permite configurar los pines I/O del ESP32 https://docs.micropython.org/en/latest/library/machine.Pin.html
import dht #Libreria necesaria para trabajar con sensor DHT22 https://docs.micropython.org/en/latest/esp8266/tutorial/dht.html
import ujson #Libreria para realizar conversiones de objetos de Python a archivos de datos JSON https://docs.micropython.org/en/v1.15/library/ujson.html
from umqtt.simple import MQTTClient #Libreria para trabajar con protocolo MQTT https://mpython.readthedocs.io/en/v2.2.1/library/mPython/umqtt.simple.html
# MQTT Server Parameters
# Estos son los parámetros de configuración para la conexión al servidor MQTT.
MQTT_CLIENT_ID = "micropython-weather-demo" #Identificador de Cliente MQTT
MQTT_BROKER = "broker.mqttdashboard.com" #Dirección del Broker MQTT
MQTT_USER = "" #Nombre de usuario MQTT
MQTT_PASSWORD = "" #Contraseña usuario MQTT
MQTT_TOPIC = "wokwi-weather"#Topic MQTT donde se envian los datos
sensor = dht.DHT22(Pin(15)) #Configuración del objeto sensor DHT22 conectado al pin 15 del ESP32
# Configuración y conexión a la red WiFi
print("Connecting to WiFi", end="") #Imprime en consola el mensaje "Conectando a WiFi"
sta_if = network.WLAN(network.STA_IF)#Inicializa la tarjeta de Wi-Fi para que pueda conectarse a una red existente creando la instancia sta_if
sta_if.active(True)# Activa la instancia con el valor True
sta_if.connect('Wokwi-GUEST', '')#Intenta conectarse a la red WiFi llamada "Wokwi-GUEST" que es abierta
while not sta_if.isconnected():# Permanece en este bucle mientras no se conecte
print(".", end="")#Imprime en la consola el mensaje "."
time.sleep(0.1)#Se realiza una pausa de 0,1 segundos
print(" Connected!")#saldrá del bucle e imprimirá en la consola el mensaje " Conectado!"
# Aquí se define la conexión del cliente al servidor MQTT
print("Connecting to MQTT server... ", end="")#imprime en la consola el mensaje “Conectando al servidor MQTT”
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)# Se genera una variable llamada client con los parámetros del MQTT server
client.connect()#Se intenta establecer la conexión del cliente con el servidor MQTT
print("Connected!")#imprime en la consola el mensaje "Conectado!"
prev_weather = ""#Se define la variable prev_weather para guardar los últimos datos de temperatura y humedad leídos
while True:#Bucle principal del programa, donde se realiza la lectura de variables y conversion de datos JSON
print("Measuring weather conditions... ", end="")# Imprime en consola el mensaje "Midiendo condiciones climáticas..."
sensor.measure()#Comando para realizar la medición con el sensor DHT22
message = ujson.dumps({# Crea un mensaje JSON que contiene la temperatura y la humedad medidas por el sensor
"temp": sensor.temperature(),#Comando para obtener la variable de temperatura medida por el sensor DHT22
"humidity": sensor.humidity(),#Comando para obtener la variable de humedad medida por el sensor DHT22
})
if message != prev_weather: #Se compara el mensaje recién creado con el anterior para detectar cambios en la medida
print("Updated!")#Imprime en consola el mensaje "Actualizando!"
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message))#Imprime en consola el mensaje "Reportando al topic MQTT", considerando el formato del mensaje JSON
client.publish(MQTT_TOPIC, message)#Comando para realizar la publicación del mensaje JSON en el topic MQTT con los valores actualizados
prev_weather = message#Se actualiza la variable prev_weather con los valores medidos para volver a comparar
else:#Si no hay cambios en los valores de la medición del sensor DHT22
print("No change")#Imprime en la consola el mensaje "Sin cambios"
time.sleep(1)#Se realiza una pausa de 1 segundo y vuelve a ejecutar el bucle principal