"""
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
"""
# El módulo network es usado para permitir que el programa configure la conexión WiFi
# https://docs.micropython.org/en/latest/esp8266/tutorial/network_basics.html
import network
#Comando que permite importación del módulo network que es usado para permitir que el programa configure la conexión WiFi
# Fuente: https://docs.micropython.org/en/latest/esp8266/tutorial/network_basics.html
import time
#Módulo que proporciona funciones para obtener la hora y fecha actuales,
# medir intervalos de tiempo y para establecer tiempos de retrasos o delays.
from machine import Pin
# Del Módulo "Machine" se importa sólo la clase "Pin" para configurar los pines de entrada y salida. (Valenzuela, 2022), (class Pin – control I/O pins — MicroPython latest documentation, s/f).
import dht
#(Digital Humidity & Temperature). Librería o módulo que especifíca que voy usar un sensor DHT.
import ujson
# Librería que permite cargar los archivos semiestructurados tipo json.
# Permite que la información que vaya a obtener del sensor, sea organizada en un archivo con configuración json.
from umqtt.simple import MQTTClient
# Del módulo "umqtt" se importa sólo la clase MQTTClient donde MQTTA es un protocolo de comunicación usado
# específicamente para IoT. Con esta librería, lo que se recoja en datos tipo json, se envía al servidor MQTTClient.
# MQTT Server Parameters. (Estos parámetros son para inicio de sesión y conexión con el servidor)
MQTT_CLIENT_ID = "micropython-weather-demo"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC = "wokwi-weather"
sensor = dht.DHT22(Pin(15))
# Se crea la variable llamada sensor, donde se guarda la info.
# del sensor DHT22.y Como un parámetro se señala el pin 15 que es donde se conecta el sensor.
print("Connecting to WiFi", end="")
# Función para mostrar por consola el mensaje "Connecting to Wifi"
# el end= "" se usa para que lo siguiente que se muestre esté en la misma línea, en este caso, los puntos suspensivos.
sta_if = network.WLAN(network.STA_IF)
# Inicio de configuración del WiFi. Acá se configura el módulo para conectarse a su propia red
# utilizando la interfaz STA_IF. Es decir, se especifica que se conecte a una red LAN. # Modo Estación. (Network basics — MicroPython latest documentation. (s/f)) , (Ahora, 2021)
sta_if.active(True)
# Activación de la interfaz de la estación.
sta_if.connect('Wokwi-GUEST', '')
# Indica que se conecte a esa red WiFi
while not sta_if.isconnected():#Inicio de Ciclo While para comprobar si la conexión a WiFi está establecida
print(".", end="") # (Muestre puntos cada 0.1 s, mientras no esté conectado a la red WiFi y lo próximo que muestre esté en la misma línea.
time.sleep(0.1)
print(" Connected!") # Al confirmar conexión, luego del espacio en blanco muestre "Connected"
print("Connecting to MQTT server... ", end="") # Muestra el mensaje "Connecting to MQTT server... " y finaliza dejando espacio
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD) # Envía por parámetro todos los datos recopilados en celdas 35-38 y se
# conecta al servidor.
client.connect() # Comando utilizado para establecer la conexión con el servidor MQTT
print("Connected!") #Se muestra el mensaje "Connected!"
prev_weather = "" # Se crea la variable llamada prev_weather con valor vacío, acá se va a guardar la información del sensor.
while True: # Inicio del Ciclo infinito While True, para la lectura del sensor DHT22. Se ejecuta y muestra si hay algún cambio en las mediciones
# de Temperatura y Humedad o indica que no hay cambio. hasta que se detenga manualmente.
print("Measuring weather conditions... ", end="") # Muestra el mensaje que indica que se está midiendo las condiciones climáticas.
sensor.measure() # Se empieza a medir con el sensor.
message = ujson.dumps({#se crea la variable message, en donde en un archivo tipo json, se va a guardar lo que capte el sensor en temperatura y humedad.
"temp": sensor.temperature(), #Lo que capte el sensor en temperatura se mostrará luego de mostrar "temp"
"humidity": sensor.humidity(), #Lo que capte el sensor en humedad se mostrará luego de mostrar "humidity"
})
if message != prev_weather: #Con este if se pregunta: Si lo almacenado en la variable message es diferente a lo que tiene la variable de lectura: "prev_weather"
print("Updated!") #Si la pregunta anterior es cierta, es decir, hay cambio en los datos climáticos, muestra "Updated"
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message)) # Se muestra el mensaje para indicar que los datos sensados se envían al servidor MQTT.
# se muestra lo almacenado en el parámetro MQTT_TOPIC: "wokwi-weather" y va a anexar lo que se capturó en message.
client.publish(MQTT_TOPIC, message) #publicación en el servidor, de lo capturado.
prev_weather = message #actualización de la variable con el nuevo message para nuevas comparaciones.
else:
print("No change") #Si no hay cambios en los datos climáticos se muestra "No change"
time.sleep(1)# Con este comando se incluye una pausa de 1 segundo.
# Fin del programa