"""
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 # Este comando realiza la importacion de la libreria de Microphyton titulada "network" la cual esta disponible en: http://docs.microphyton.org/en/latest/library/network.html
import time #Este comando realiza la importacion de la libreria de MicroPhyton titulada "time" la cual esta disponible en: https://docs.phyton.org/3/library/time.html
from machine import Pin #Este comando se utiliza para importar la clase "Pin" desde el modulo "machine". Sirve para controlar pines de entrada y salida
import dht #Este comando realiza la importacion de la libreria de MicroPhyton titulada "DHT" (Digital himidity and temperature). Sirve para interactuar con el sensor DHT22
import ujson #Este comando realiza la importacion de la libreria de MicroPhyton titulada "ujson" la cual permite trabajar con datos en formato JSON
from umqtt.simple import MQTTClient #Este comando se utiliza para importar la clase "MQTTClient" desde la libreria "umqtt.simple", nos permite utilizar y conectar un cliente con un servidor MQTT
# MQTT Server Parameters
MQTT_CLIENT_ID = "micropython-weather-demo" #Este comando sirve como identificador de cliente MQTT
MQTT_BROKER = "broker.mqttdashboard.com" #Este comando sirve para indicar que el cliente se conectara al servidor MQTT_broker
MQTT_USER = "" # Este comando me indica que no he definido un nombre de usuario
MQTT_PASSWORD = "" # Este comando me indica que no he definido contraseña
MQTT_TOPIC = "wokwi-weather" # Este comando hace referencia al tema (topic) al cual el cliente MQTT se sucribirá, en este caso al referente al clima.
sensor = dht.DHT22(Pin(15)) # Este comando me indica que el sensor DHT22 esta conectado al pin GPIO15
print("Connecting to WiFi", end="") # Este comando muestra la frase Connecting to wifi al arrancar el programa, el end sirve para cambiar el carácter al final de linea que se imprime al final del mensaje
sta_if = network.WLAN(network.STA_IF) # Se crea un objeto llamado sta_if (interfaz de estación) el cual es configurado en modo cliente a través de la libreria network y la clase "WLAN"
sta_if.active(True) # Se utiliza para activar la interfaz de estación
sta_if.connect('Wokwi-GUEST', '') # Se utiliza para conectar la interfaz de estacion (STA) a una red WiFi llamda "Woksi-GUEST". El vacío en el segundo argumento me indica que no se proporcionará contraseña para la red WiFI.
while not sta_if.isconnected(): # es un condicional que se ejecutará mientras el estado de la conexión sea "false"
print(".", end="") # mostrará puntos suspensivos mientras no se logre la conexión
time.sleep(0.1) # establece una pausa de 0.1 segundos antes de repetir el bucle.
print(" Connected!") # se ejecutará cuando el condicional sea "true", es decir la interfaz de estación (STA) se conecte a la red y mostrará la palabra "Connected!"
print("Connecting to MQTT server... ", end="") # mostrará el mensaje que me indica que estoy intentando conectarme al servidor MQTT
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD) # Creo un objeto llamado "client" de la clase MQTTClient, además se le proporcionará el identificador de cliente, la dirección de broker y las credenciales de usuario y contraseña
client.connect() # Este comando se utiliza para establecer la conexión al servidor MQTT
print("Connected!") # Este comendo me muestra la palabra "Coneected!" una vez que se establecio la conexión con el servidor MQTT
prev_weather = "" # Este comando se inicia como una cadena vacia y se utiliza para almacenar el estado previo de las condiciones metereológicas y su posterior comparación
while True: # Este comando inicia un bucle infinito el cual se ejecutará continuamente hasta que el programa sea interrumpido manualmente.
print("Measuring weather conditions... ", end="") # Este comando muestra el mensaje indicando que se están midiendo las condiciones metereológicas. La opción end evita que se agregue una nueva linea al final del mensaje, por lo cual la proxima salida se mostrará en la misma linea
sensor.measure() # Este comando llama al método measure (Medición) del objeto llamado sensor
message = ujson.dumps({ # Este comando crea un diccionario en una cadena JSON
"temp": sensor.temperature(), # Este comando incluye la palabra "temp" asignándole el valor medido para temperatura
"humidity": sensor.humidity(), # Este comando incluye la palabra "humidity" asignándole el valor medido para la humedad
})
if message != prev_weather: # Este comando compara el mensaje actual con el estadio previo. Si son diferentes me indicará que hubo un cambio en las condiciones metereológicas
print("Updated!") # De haber habido un cambio en la medición este comando muestra la palbra "updated!"
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message)) # Este comando muestra el nuevo valor de temperatura y humedad
client.publish(MQTT_TOPIC, message) # Este comando publica el mensaje en el servidor MQTT en el tema especificado MQTT_TOPIC
prev_weather = message #Este comando actualiza el estado previo con el mensaje actual para comparar futuras mediciones y determinar si hubo algún cambio
else: # Este comando se ejecuta cuando no se cumplio la condición de comparación, es decir no hubo cambios en las condiciones metereológicas
print("No change") # Este comando indica que no hubo cambios a traves del mensaje "no change"
time.sleep(1) # Este comando pausa el programa por 1 segundo antes de realizar una nueva medición.