"""
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 declaración "import" en Python se usa para agregar módulos o bibliotecas a su código,
# lo que le permite al usuario utilizar funciones, clases o variables definidas en esos módulos.
import network # El módulo "network" en MicroPython se usa comúnmente para funciones relacionadas
# con redes, como conectarse a redes Wi-Fi y manejar la comunicación de red.
import time # El módulo "tiempo" en MicroPython (así como en Python estándar) proporciona funciones que se ocupan de
# operaciones relacionadas con el tiempo.
import dht # El módulo "dht" esta relacionado con los sensores DHT (humedad y temperatura digitales). Estos sensores
# se utilizan comúnmente para medir tanto la humedad como la temperatura en proyectos electrónicos.
import ujson # El módulo "ujson" en MicroPython proporciona funcionalidad para codificar y decodificar datos JSON
# Una vez importado el módulo, puede utilizar sus funciones para serializar o deserializar datos JSON.
from machine import Pin # Esta línea de código se utiliza para importar la clase Pin del módulo de la máquina, que es
# un módulo específico de MicroPython para interactuar con las funciones de hardware de los
# microcontroladores. La clase Pin se utiliza para trabajar con los pines GPIO
# (entrada/salida de uso general) del microcontrolador.
from umqtt.simple import MQTTClient #Esta línea de código utiliza la biblioteca cliente MicroPython MQTT (Message
# Queuing Telemetry Transport), específicamente la clase MQTTClient del módulo umqtt.simple.
# La clase MQTTClient es parte de la biblioteca MicroPython MQTT (umqtt) y proporciona
# funcionalidad para conectarse a un broker MQTT.
# Esta seccion del código configura el cliente MQTT en el Arduino con los parámetros necesarios para conectarse al broker MQTT
# "broker.mqttdashboard.com", utilizando el identificador de cliente "micropython-weather-demo". El dispositivo no está configurado con
# un nombre de usuario o contraseña específicos para la autenticación. Se comunicará sobre el topic MQTT "wokwi-weather".
# MQTT Server Parameters
MQTT_CLIENT_ID = "micropython-weather-demo"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC = "wokwi-weather"
# Esta línea de código inicializa un objeto DHT22 llamado "sensor" y lo configura para comunicarse con Arduino a través del pin digital 15.
# Una vez hecho esto, puede usar los métodos proporcionados por la biblioteca DHT22 para leer los datos de temperatura y humedad del sensor.
sensor = dht.DHT22(Pin(15))
# Este código conecta el dispositivo a una red Wi-Fi llamada 'Wokwi-GUEST' con una contraseña vacía, proporcionando información
# visual durante el intento de conexión.
print("Connecting to WiFi", end="") # Esta línea imprime el mensaje inicial "Connecting to WiFi" sin pasar a una nueva línea. El parámetro
# end=""se utiliza para suprimir el carácter de nueva línea al final de la declaración impresa.
sta_if = network.WLAN(network.STA_IF) # Esta línea crea un objeto "sta_if" que representa la interfaz de la estación Wi-Fi. La declaración
# "network.WLAN(network.STA_IF)" inicializa el modo de estación Wi-Fi.
sta_if.active(True) # Esta linea activa la interfaz de la estación Wi-Fi.
sta_if.connect('Wokwi-GUEST', '') # Esta linea intenta conectarse a una red Wi-Fi llamada 'Wokwi-GUEST' con una contraseña vacía.
# "while not" es un ciclo que continúa hasta que el dispositivo se conecta correctamente a la red Wi-Fi.
# La condición "not sta_if.isconnected()" comprueba si el dispositivo aún no está conectado. Dentro del ciclo, cada iteración imprime
# un punto sin pasar a una nueva línea como indicacion visual de que el dispositivo está intentando conectarse.
while not sta_if.isconnected():
print(".", end="") # Esta instruccion imprime un punto sin pasar a una nueva línea como indicacion visual.
time.sleep(0.1) # Esta instruccion detiene la ejecución durante 0,1 segundos, introduciendo un retraso entre cada ciclo.
print(" Connected!") # Una vez que sale el ciclo (lo que significa que el dispositivo está conectado),
# esta línea se ejecuta e imprime " Connected!" para indicar una conexión exitosa.
print("Connecting to MQTT server... ", end="") # Esta línea imprime el mensaje "Connecting to MQTT server... " sin pasar a la
# siguiente línea (debido al parámetro end=""). Es una forma de mostrar un mensaje
# al usuario o con fines de depuración.
# Este codigo crea una instancia de la clase MQTTClient, previamente definida en el código. Los parámetros pasados al constructor incluyen:
# El ID del cliente utilizado para identificar este cliente MQTT al conectarse al intermediario.
# La dirección o nombre de host del broker MQTT al que conectarse.
# El nombre de usuario que se utilizará para la autenticación con el agente MQTT.
# La contraseña que se utilizará para la autenticación con el agente MQTT.
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.connect() # Esta instruccion inicia una conexión con el intermediario MQTT utilizando la configuración proporcionada al crear la
# instancia MQTTClient. Establece una conexión con el corredor MQTT y, si tiene éxito, el cliente está listo para
# enviar y recibir mensajes.
print("Connected!") # Esta línea imprime "Connected!" para indicar que Arduino se ha conectado correctamente al servidor MQTT. Sirve como
# mensaje de confirmación al usuario.
prev_weather = "" # se inicializa como un string vacío. Esta variable se utilizará para llevar un seguimiento de las condiciones
# meteorológicas medidas previamente.
while True: # El programa entre en un ciclo infinito, es decir se ejecutará continuamente hasta que se detenga manualmente.
print("Measuring weather conditions... ", end="") # Imprime "Measuring weather conditions... "
sensor.measure() # Esta función se utiliza para medir la temperatura y la humedad.
message = ujson.dumps({ # Los datos de temperatura y humedad se formatean en una cadena JSON utilizando
"temp": sensor.temperature(), # el módulo ujson.
"humidity": sensor.humidity(), #
})
# Esta condición verifica si los datos recién medidos son diferentes de los datos medidos anteriormente.
# Si hay un cambio, el programa imprime "Updated!" a la consola y procede a informar los nuevos datos a un topic MQTT.
# Si no hay cambios, el programa imprime "No change" en la consola.
if message != prev_weather:
print("Updated!")
# Esta línea imprime un mensaje en la consola indicando que los datos se están llevando a un topic MQTT.
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message))
# Esta línea publica los datos (en formato JSON) en el topic MQTT especificado utilizando un cliente MQTT.
client.publish(MQTT_TOPIC, message)
prev_weather = message # La variable se actualiza para almacenar los datos más recientes.
else:
print("No change") # Si no hubiera cambios en los datos se imprime "No change" a la consola
time.sleep(1)