#El comando import realiza la importación de las bibliotecas con las funciones requeridas para este proyecto
import network #Configuracion y conexion del ESP32 a redes
import time #Gestion de funciones relacionadas al tiempo
from machine import Pin #Control de los pines GPIO
import dht #Interacción con el sensor DHT
import ujson #Manejo de datos JSON en el microcontrolador
from umqtt.simple import MQTTClient #Comunicacion MQTT desde un broker
# MQTT Server Parameters
MQTT_CLIENT_ID = "micropython-weather-demo" #Identificador para el cliente MQTT
MQTT_BROKER = "broker.mqttdashboard.com" #Direccion del servidor
MQTT_USER = "" #Credenciales para el acceso (User y password)
MQTT_PASSWORD = "" #en este caso se encuentran vacias al tratarse de un servidor publico
MQTT_TOPIC = "wokwi-weather" #Tema en el que se publicarán los datos del sensor
sensor = dht.DHT22(Pin(15)) #Lectura de datos de las variables del sensor y el pin al que se conecta
print("Connecting to WiFi", end="") #Imprime el mensaje "Connecting to WiFi"
sta_if = network.WLAN(network.STA_IF) #Crea un objeto de red llamado sta_if que permite al ESP32 conectarse a una red Wi-Fi
sta_if.active(True) #Activa la interfaz Wi-Fi del ESP32
sta_if.connect('Wokwi-GUEST', '') #Intenta conectar el ESP32 a la red Wi-Fi con el nombre Wokwi-GUEST
while not sta_if.isconnected(): #Inicia un ciclo que se ejecuta hasta que el ESP32 se conecte a la red
print(".", end="") #Al encontrarse dentro del while,imprime un punto por cada intento de conexión
time.sleep(0.1) #Realiza una pausa durante 0.1 segundos en cada intento
print(" Connected!") #Al conectarse, se sale del bucle y se imprime la palabra connected
print("Connecting to MQTT server... ", end="") #Imprime el mensaje "Connecting to MQTT server..."
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD) #Crea un objeto client que representa la conexión MQTT al ESP32.
client.connect() #Conecta al servidor MQTT
print("Connected!") #Imprime el mensaje connected
prev_weather = "" #Almacena las variables en formato JSON.
while True: #Inicia un bucle
print("Measuring weather conditions... ", end="") #Imprime un mensaje donde se indica que se están leyendo las condiciones climaticas
sensor.measure() #Indica al sensor realizar la medicion de variables
message = ujson.dumps({ #Almacena un mensaje en formato JSON con las variables medidas por el sensor y convierte el diccionario en una cadena de texto JSON
"temp": sensor.temperature(), #Define el valor de temp como la lectura de temperatura del sensor
"humidity": sensor.humidity(), #Define el valor de humidity como la lectura de humedad del sensor
})
if message != prev_weather: #Compara message con los datos previos almacenados en prev_weather
print("Updated!") #Imprime updated en caso de que los datos previos y los actuales sean diferentes
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message)) #Imprime un mensaje reportando el tema al que se enviaran los datos junto con los valores almacenados en message
client.publish(MQTT_TOPIC, message) #Publica el mensaje actualizado en el tema establecido
prev_weather = message #Actualiza los valores de prev_weather con la lectura actual
else: #Indica las acciones en caso de que message y prev_weather no sean diferentes
print("No change") #Imprime el mensaje "No change" para indicar que no hubo cambios
time.sleep(1) #Pausa la ejecución del programa durante 1 segundo