"""
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 # Importa la librería para manejar conexiones Wi-Fi
import time # Importa la librería para controlar el tiempo
import random # Importa la libreria para poder generar números aleatorios
from machine import Pin, PWM # Importa la librería Pin para controlar pines del microcontrolador
import ujson # Importa la librería JSON para el microcontrolador
from umqtt.simple import MQTTClient # Importa la librería para comunicación MQTT
from servo import Servo # Importa la libreria para poder controlar el servo
# MQTT Server Parameters
MQTT_CLIENT_ID = "micropython-weather-demo" # ID del cliente MQTT
MQTT_BROKER = "broker.mqttdashboard.com" # Dirección del servidor MQTT
MQTT_USER = "" # Usuario MQTT
MQTT_PASSWORD = "" # Contraseña MQTT
MQTT_TOPIC = "wokwi-weather" # Tema MQTT donde se publicarán los datos
sensor = dht.DHT22(Pin(15)) # Crea un objeto sensor DHT22 conectado al Pin 15
servo_pin = 18 # Pin de conexión del servo
servo = PWM(Pin(servo_pin) , freq = 50) # Se configura con una frecuencia de 50 Hz
servo1 = Servo(pin_id = servo_pin) # Crea un objeto servo conectado al Pin guardado en la variable "servo_pin"(18)
print("Connecting to WiFi", end="") # Imprime un mensaje de inicio de conexión Wi-Fi
sta_if = network.WLAN(network.STA_IF) # Crea un objeto para la interfaz Wi-Fi
sta_if.active(True) # Activa la interfaz Wi-Fi
sta_if.connect('Wokwi-GUEST', '') # Intenta conectarse a la red Wi-Fi "Wokwi-GUEST"
while not sta_if.isconnected(): # Bucle hasta que se establezca la conexión
print(".", end="") # Imprime puntos para indicar progreso
time.sleep(0.1) # Espera 0.1 segundos antes de volver a comprobar la conexión
print(" Connected!") # Imprime un mensaje de conexión Wi-Fi exitosa
print("Connecting to MQTT server... ", end="") # Imprime un mensaje de inicio de conexión MQTT
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD) # Crea un cliente MQTT
client.connect() # Conecta al servidor MQTT
print("Connected!") # Imprime un mensaje de conexión exitosa
prev_weather = "" # Variable para almacenar la lectura anterior de datos
servo_active = False # Variable para que el servo empiece apagado
umbral_temperatura = 25 #temperatura para activar el servo
while True: # Bucle infinito para mediciones continuas
sensor.measure() # Realiza una medición con el sensor
temperature = sensor.temperature() #Se guarda en variable
print("Temperatura actual:", temperature) # Imprime un mensaje de inicio de medición
if temperature > umbral_temperatura and not servo_active : # Comprueba si la temperatura supera el valor para activar el servo
print("Temperatura límite superada, servo activado") # Imprime un mensaje si lo supera
servo_active = True
message = ujson.dumps({ # Escribe los datos de temperatura
"temp": temperature,
})
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message)) # Imprime el tema y mensaje
client.publish(MQTT_TOPIC, message) # Publica el mensaje en el tema MQTT
while temperature > umbral_temperatura: # Mientras "temperature" sea mayor que "umbral_temperatura" entra en bucle
numero_aleatorio = random.randint(0, 180) #genera un número aleatroio entre 0 y 180
servo1.write(numero_aleatorio) # Coloca el servo a 0 grados # Manda al servo a la posición asignada en la variable "numero_aleatorio"
time.sleep(1) # Espera un segundo
sensor.measure() # Realiza una medición con el sensor
temperature = sensor.temperature() #Se guarda en variable "temperature"
servo1.write(90) # Coloca el servo a 90 grados (Posición inicial) cuando la temperatura no pasa del límite
servo_active = False #apaga el servo
time.sleep(1) # Espera 1 segundo antes de realizar la siguiente medición