"""
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 se utiliza para importar el modulo de red "network" que esta relacionado con la configuración y el manejo de la red. Disponible en https://docs.micropython.org/en/latest/_sources/library/network.rst.txt
import time #Este comando se utiliza para importar el modulo de tiempo "time", el cual proporciona funciones relacionadas con la medición y gestión del tiempo. Disponible en https://docs.micropython.org/en/latest/_sources/library/time.rst.txt
from machine import Pin, PWM #Este comando se utiliza para importar el modulo "Pin", necesario para trabajar con los pines del hardware en microcontroladores.
import dht #Este comando importa em modulo dht, el cual proporciona funciones para interactuar con sensores de temperatura y humeda, sensor DHT22.
import ujson #Este comando permite serializar y deserializar objetos en el formato JSON. Disponible en https://docs.micropython.org/en/v1.15/_sources/library/ujson.rst.txt
from umqtt.simple import MQTTClient #Este comando proporciona funcionalidades para trabajar con el protocolo MQTT al importar la clase MQTTClient del módulo umqtt.simple.
from time import sleep
#Introducción de configuración del servo
servo01=PWM(Pin(5))
servo01.freq(60)
amb_temp=25
# MQTT Server Parameters
MQTT_CLIENT_ID = "micropython-weather-demo" #Mediante este comando se establece una variable denominada "MQTT_CLIENT_ID" con el valor "micropython-weather-demo"; en donde el client_id es un identificador único que se utiliza para distinguir un cliente de MQTT de otros clientes en el servidor MQTT al que se conecta, y por otra parte el valor de "micropython-weather-demo" se está utilizando para la obtención de datos meteorológicos ambientales como temperatura y humedad.
MQTT_BROKER = "broker.mqttdashboard.com" #A través de este comando se establece la dirección del servidor MQTT al que se desea conectar el dispositivo; el dispositivo debe tener acceso a la red para poder comunicarse con el servidor MQTT. El MQTT_BROKER debe identificar la dirección del broker MQTT y el broker MQTT debe estar en línea para aceptar las conexiones entrantes en la dirección proporcionada.
MQTT_USER = "" #Este comando establece una variable llamada MQTT_USER con un valor/texto vacío, que en lo posterior permitira almacenar el nombre del usuario que se utilizará al autenticarse con el servidor MQTT si asi lo quisiese.
MQTT_PASSWORD = "" #Este comando establece una variable llamada MQTT_PASSWORD con un valor/texto vacío, que en lo posterior permitira almacenar la contraseña del user que se utilizará al autenticarse con el servidor MQTT si asi lo quisiese.
MQTT_TOPIC = "wokwi-weather-01" #Este comando se utiliza para especificar el tema "topic" al que tu cliente MQTT se suscribirá o en el que publicará mensajes. El "wokwi-weather" es el topic al que se suscribe.
sensor = dht.DHT22(Pin(15)) #Este comando crea una variable denominada sensor, encargado de recibir datos de temperatura y humedad que envia el sensor DHT22 mediante el Pin 15.
print("Connecting to WiFi", end="") #Este comando indica en la interfaz del usuario el mensaje "Connecting to Wifi"; pero al tener la designación end="" al final de la linea de programación le dice a print que no coloque una nueva linea (\n) al final del mensaje que por defecto lo tiene.
sta_if = network.WLAN(network.STA_IF) #Este comando proporciona la configuracion y el manejo de la red y genera una interfaz de estación WLAN.
sta_if.active(True) #Este comando se encarga de activar la instancia de interfaz "sta_if"
sta_if.connect('Wokwi-GUEST', '') #Este comando se encarga de conectar la red "Wokwi-GUEST", mediante el password "".
while not sta_if.isconnected(): #Con este comando se genera una conexión con el sta_if de conexión a red, pero si no se accede a la red en la interfaz del usuario se imprime continuamente "." sin añadir ninguna línea.
print(".", end="")
time.sleep(0.1) #Este comando se utiliza para pausar la ejecución el programa durante 0.1 segundos.
print(" Connected!") #Este comando se encarga de mostrar "Connected" cuando se accede a la red.
print("Connecting to MQTT server... ", end="") #Con este comando se imprime en la interfaz del usuario "Connecting to MQTT server...", sin añadir ninguna línea de salto.
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD) #En esta parte se define la instancia "client" con todos los datos registrados y ya definidos.
client.connect() #Comando utilizado para restablecer la conexión con el Broker MQTT.
print("Connected!") #Comando utilizado para mostrar en la inferfaz de usuario "Connected".
prev_weather = "" #Se inicia la ejecución de la variable "prev_weather" sin ningún valor inicial.
while True: #Empieza a ejecutarse un bucle infinito.
print("Measuring weather conditions... ", end="") #Comando que indica en la interfaz de usuario "Measuring weather conditions... ", sin añadir ningún salto de línea.
sensor.measure() #Comando que mide la temperatura y humedad recibida del sensor DHT22.
if sensor.temperature()>amb_temp:
for i in range (3000,7000):
servo01.duty_u16(i)
sleep(0.0005)
for i in range (7000,3000,-1):
servo01.duty_u16(i)
sleep(0.0005)
message = ujson.dumps({ #Comando que muestra los datos serializados en formato JSON.
"temp": sensor.temperature(), #Este comando indica el valor de temperatura recibido y leido por el sensor.
"humidity": sensor.humidity(), #Este comando indica el valor de humedad recibido y leido por el sensor.
})
if message != prev_weather: #Este comando se encarga de evaluar si el nuevo valor medido es diferente que la lectura anterior, por lo tanto si esta condición se cumple...
print("Updated!") #Este comando se encarga de imprimir en la interfaz de usuario la actualización "Updated" de la medición.
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message)) #Comando encargado de mostrar el "topic" en donde se muestran los valores de teperatura y humedad.
client.publish(MQTT_TOPIC, message) #Comando encargado de mostrar al Broker MQTT en el "topic" los valores de temperatura y humedad correspondientes.
prev_weather = message #Comando que actualiza la variable "prev_weather" e iniciar el proceso.
else:
print("No change") #Comando que muestra el texto "No change".
time.sleep(1) #Comando que pausa la ejecución el programa durante 0.1 segundos.