"""
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
"""
"""
Se importan librerías necesarias para el funcionamiento del código,
como la librería para la conexión Wifi, manejo de tiempo, control de pines GPIO,
lectura del sensor DHT22, manipulación de JSON y conexión con un cliente MQTT.
Todas estas librerías las encontramos https://docs.micropython.org/en/latest/.
"""
import network #Importamos la librería network para la conexión Wifi
import time #Importamos la librería time para el manejo del tiempo
from machine import Pin, PWM #Importamos el control de pines GPIO
import dht #Importamos el controlador para la lectura del sensor DHT22
import ujson #Importamos la librería para manipular JSON
from umqtt.simple import MQTTClient #Importamos la librería para la conexión con un cliente MQTT
from servo import Servo
# MQTT Server Parameters
"""se definen los parámetros para la conexión al servidor MQTT como se muestra en las líneas de código,
#en donde se define el ID del cliente, la dirección del bróker MQTT, el usuario y contraseña,
#y el tema MQTT al que se publicaran los datos."""
MQTT_CLIENT_ID = "micropython-weather-demo" #Se define el ID del cliente
MQTT_BROKER = "broker.mqttdashboard.com" #Se define la dirección del broker MQTT
MQTT_USER = "" #Se define el Usuario
MQTT_PASSWORD = "" #Se define la contraseña
MQTT_TOPIC = "wokwi-weather" #Se define el tema MQTT al que se publicaran los datos
#Se define una variable llamada “sensor”, la cual importa el sensor DHT22 y lo ubica en el Pin 15 de nuestra placa ESP32.
# Configuración de los pines GPIO para el servo motor
sensor = dht.DHT22(Pin(15)) #Se crea el objeto sensor que va a estar ubicado en el Pin 15
servo_pin = 18 # PIN de conexion del servo motor
servo = PWM(Pin(servo_pin), freq=50) #Se configura el pin como PWM con una frecuencia de 50Hz
Servo1 = Servo(pin_id=servo_pin)
sensor = dht.DHT22(Pin(15)) #Se crea el objeto sensor que va a estar ubicado en el Pin 15
# Se realiza la conexión a una red Wifi llamada ¨Wokwi-GUEST¨
print("Connecting to WiFi", end="") #Se imprime la palabra conectando a WiFi
sta_if = network.WLAN(network.STA_IF) #Se crea una instancia de la interfaz Wifi del ESP32
sta_if.active(True) #Se activa la interfaz Wifi
sta_if.connect('Wokwi-GUEST', '') #Se conecta a la red Wifi Wokwi-GUEST
while not sta_if.isconnected(): #Se crea bucle para verificar conexión
print(".", end="") #Mientras no se conecta al Wifi va a escribir un punto
time.sleep(0.1) #Realiza este proceso cada segundo
print(" Connected!") #Cuando ya se conecte a la red se va a imprimir conectado y se finaliza el bucle
#Se realiza la conexión al servidor MQTT que ingresamos anteriormente MQTT_CLIENT_ID / MQTT_BROKER / MQTT_USER / MQTT_PASSWORD / MQTT_TOPIC
print("Connecting to MQTT server... ", end="") #Se imprime conectando al servidor MQTT
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD) #Se ingresa los datos del servidor
client.connect() #Ingresamos al servidor MQTT
print("Connected!") #Se imprime cuando se conecta al servidor
"""
Se crea un bucle infinito, en donde se mide la temperatura con el sensor DHT22,
se convierten los valores a formato JSON y se verifica si existen cambios en los valore.
Si existen cambios se publica un mensaje en el tema MQTT con los nuevos datos de humedad y temperatura,
si no existen cambios se genera un bucle infinita en donde cada 1 segundo se indica que no hay cambios."""
prev_weather = "" #Se crea variable para alojar los cambios
servo_active = False #Se crea variable para que el servo empiece apagado
Umbral_temperatura = 25 #Umbral de temperatura para activar el servo motor
"""
while True: #Se crea bucle para verificar si los datos del sensor cambiaron
print("Measuring weather conditions... ", end="") #Se genera mensaje de medicion
sensor.measure() #Se mide los valores del sensor
message = ujson.dumps({ #Se transforma las mediciones a JSON
"temp": sensor.temperature(),
"humidity": sensor.humidity(),
})
if message != prev_weather: #Se crea condicion para verificar si hay algun cambio en el sensor
print("Updated!")
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message)) #Si hay algun cambio se van a imprimir los valores
client.publish(MQTT_TOPIC, message) #Se publican los nuevos valores en el servidor MQTT
prev_weather = message
else: #Si no existen cambios se va a imprimir ¨No change¨
print("No change")
time.sleep(1) #Se repide cada segundo esta accion
"""
while True:
sensor.measure() #Se mide los valores del sensor
temperature = sensor.temperature() #Se aloja el valor de la temperatura
print("Temperatura actual:", temperature)
if temperature > Umbral_temperatura and not servo_active: #Se crea condicion para activar el servo
print("Umbral de temperatura excedido. Activando servo.")
servo_active = True
message = ujson.dumps({ #Se transforma a JSON el valor de temperatura
"temp": temperature,
})
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message))
client.publish(MQTT_TOPIC, message)
while temperature > Umbral_temperatura: #Mover el servo indefinidamente mientras la temperatura sea alta
Servo1.write(0) # Manda posición al servo a 0º, manilla hacia arriba
time.sleep(1) # Espera 1 segundo para alcanzar la posición
Servo1.write(180) # Manda posición al servo a 90º, manilla hacia abajo
time.sleep(1) # Espera 1 segundo para alcanzar la posición
sensor.measure() #Volver a medir la temperatura
temperature = sensor.temperature()
Servo1.write(90) # Manda posición al servo a 0º, manilla hacia arriba
servo_active = False #Se desactiva el servo
time.sleep(1)