"""
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
"""
#la declaracion import permite acceder a funciones, clases y variables definidas en
#archivos externos, mejor conocidos como módulos.
import network #En este caso mediante el módulo network se esta gestionando la conexión Wi-Fi.
import time # Utilizada para importar la biblioteca time, haciendo que sus funciones y clases
#estén disponibles para su uso en su código, como por ejemplo sleep.
from machine import Pin # Importa el objeto pin que sirve para para controlar pines de E/S
#(también conocidos como GPIO, entrada/salida)
import dht #El módulo dht de la biblioteca estándar de MicroPython proporciona un conjunto de
#funciones para controlar los sensores DHT11 y DHT22.
import ujson #Importa ujson, una versión optimizada de JSON para manejar datos en formato JSON.
#Codificación y decodificación JSON, permite convertir entre objetos Python y el formato de datos JSON.
from umqtt.simple import MQTTClient #Importa MQTTClient para conectarse a un servidor MQTT y enviar/recibir mensajes.
#MQTT es un protocolo de mensajería liviano basado en suscripción y lanzamiento para usar sobre el protocolo TCP/IP.
#Ofrece un modelo de suscripción/publicación que es más simple=y fácil de usar.
# MQTT Server Parameters
MQTT_CLIENT_ID = "micropython-weather-demo" #Identificador único para el cliente MQTT
MQTT_BROKER = "broker.mqttdashboard.com" # Dirección del servidor MQTT (broker)
MQTT_USER = "" # usuario MQTT(vacio).
MQTT_PASSWORD = "" # credenciales del usuario(vacio).
MQTT_TOPIC = "wokwi-weather" # Tema donde se publicarán los datos de temperatura y humedad
sensor = dht.DHT22(Pin(15)) # Crea un objeto DHT22 usando el pin GPIO 15 para comunicarse con el sensor
#El sensor DHT22 permite monitorear temperatura y humedad de forma precisa
print("Connecting to WiFi", end="") #Muestra un mensaje para iniciar la conexion Wifi
sta_if = network.WLAN(network.STA_IF) #Este módulo se utiliza para configurar la conexión WiFi
sta_if.active(True)# Activa la interfaz Wi-Fi.
sta_if.connect('Wokwi-GUEST', '') #Intenta conectarse a la red "Wokwi-GUEST" que no tiene contraseña
while not sta_if.isconnected():#Bucle que espera hasta que la conexión wifi esté activa
print(".", end="")#Imprime un punto cada 0.1 segundos para mostrar progreso hasta que se realice la conexión
time.sleep(0.1) #Espera 0.1 segundos entre intentos de conexión
print(" Connected!") #Una vez que se realiza la conexión correctamente imprime Conectado
print("Connecting to MQTT server... ", end="")#Imprime mensaje de conexión al broker MQTT.
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)# Crea un cliente MQTT con los siguientes parámetros
# ID del cliente es importante para poder identificar rápidamente a un cliente específico en la administración de un sistema MQTT.
# La dirección o nombre de host del broker MQTT al que se va a conectar
# El nombre de usuario se usa para la autenticación en el servidor de MQTT.
# La contraseña esta asociada con el nombre de usuario proporcionadoque y se utiliza para la autenticación con el servidor MQTT.
client.connect()#Establece la conexión al servidor MQTT.
print("Connected!")# Muestra un mensaje que indica que la conexión al servidor MQTT fue exitosa.
prev_weather = ""#Almacena el mensaje anterior que indicará los valores de temperatura y humedad para detectar cambios.
while True: #Inicializa un bucle infinito.
print("Measuring weather conditions... ", end="")# Imprime un mensaje para indicar que se inicio la medición.
sensor.measure() #Toma una nueva medición de temperatura y humedad.
message = ujson.dumps({ #Con la medición obtenida crea un mensaje JSON
"temp": sensor.temperature(), #Indica sensor de temperatura
"humidity": sensor.humidity(), # Indica sensor de humedad
})
#Mediante esa condición se verifica si los datos han cambiado desde la última medición, si exitió un cambio
# el programa imprime "Updated" e informa los nuevos datos a un tema MQTT, caso contario el programa
# imprime "No change" en la consola.
if message != prev_weather:
print("Updated!") # Indica que existe una medición nueva
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message))
client.publish(MQTT_TOPIC, message)#Publica el mensaje en el tema MQTT
prev_weather = message #Actualiza la variable prev_weather con la medición actual
else:#Indica que si no se cumple la condición de arriba se ejecuta la siguiente
print("No change")# Indica que eno xiste una medición nueva
time.sleep(1)# Espera 1 segundo antes de la siguiente medición.