# Importamos modulos (librerias)
import network
import time
import machine
from machine import Pin
import dht
import ujson
from umqtt.simple import MQTTClient
led = Pin(2, Pin.OUT) # declara pin para el led
p23 = Pin(23, Pin.OUT) #Decimos que nuetro "pin" está conectado en el puerto 23
servo1 = machine.PWM(p23) # crea un objeto 'servo1' Modulación Ancho de Banda.
print('servo1') # imprime en consola servo 1
servo1.freq(50) # Establece la frecuencia del PMD de 50 Hz para el servo.
servo1.duty(0) #Se declara un 0 para la posicion del servo.
def map(x, in_min, in_max, out_min, out_max):
# Función para mapear valores de un rango a otro.
return int((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
def servo(pin, angle):
# La función map toma un valor (angle en este caso) y realiza una
# transformación lineal del rango de 0 a 180 grados al nuevo rango de 20 a 120.
pin.duty(map(angle, 0, 180, 20, 120)) #Esta parece ser un estandar (según internet) para la actuación del servo.
# MQTT Server Parameters
MQTT_CLIENT_ID = "micropython-weather-demo"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC = "wokwi-weather"
sensor = dht.DHT22(Pin(15)) # Pin para el sensor (se le asigna el puerto 15)
#Protocolo de coneccion MQTT (parece ser estandar)
print("Connecting to WiFi", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
while not sta_if.isconnected(): #Abrimos un ciclo que nos imprimirá puntos hasta que se logre una conección
print(".", end="")
time.sleep(0.1)
print(" Connected!")
# A continuación creamos un objeto 'MQTTClient' con parámetros definidos (iniciale), es como crear un areglo de variables
print("Connecting to MQTT server... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.connect()
print("Connected!")
prev_weather = "" #Declaramos la variable prev_weather
while True: #Inicia ciclo indefinido (infinito) que tomará los valores de humedad y temperatura en forma continua.
try:
print("Measuring weather conditions... ", end="")
sensor.measure() # Esta función le dice al sensor DHT que tome medida (Temperatura y Humedad)
#Iniciaremos una condicionante IF NOT donde si la temperatura leida por el sensor eno está entre un rango de
#20 - 25 grados nos enviará un mensaje con la funcion Print, encenderá el led y el actuador comenzará a girar
# en simulación de un aspersor de agua de jardin
if not (20 <= sensor.temperature() <= 25):
print("La temperatura está fuera del rango ambiente (20 - 25 grados)")
led.on() #enciende LED
#El servo tomas las posiciones 0, 90 ,180.
servo(servo1, 0)
time.sleep(0.5)
servo(servo1, 90)
time.sleep(0.5)
servo(servo1, 180)
time.sleep(0.5)
#Comienza un ciclo que moverá el servo con un dekay de .5 segundos(ahora si infinito hasta que la temperatura cambie)
for i in range(0, 180, 10):
servo(servo1, i)
time.sleep(0.5)
print("Servo movement complete.")
else: #Cuando la temperatura se encuentr en rango (cuando ya no se cumpla el 'If not') se apagará la led y el servo se dejará de mover.
led.off()
print("Temperatura Ambiente Detectada")
#Se define la variable mensaje con la temperatura y humedad.
message = ujson.dumps({
"temp": sensor.temperature(),
"humidity": sensor.humidity(),
})
if message != prev_weather: #Esta condicion evita que se imprima un mensaje con los valores de temperatura y humedad
# si no ha habido cambios
print("Updated!")
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message))
client.publish(MQTT_TOPIC, message)
prev_weather = message
else:
print("No change")
time.sleep(1)
except Exception as e:
print("An error occurred:", str(e))