import network
import time
from machine import Pin
import machine
import dht
import ujson
from umqtt.simple import MQTTClient
# -----------------------------
# Hardware (pines según lo acordado)
# -----------------------------
sensor = dht.DHT22(Pin(15))
led_rojo = Pin(12, Pin.OUT)
led_verde = Pin(14, Pin.OUT)
led_azul = Pin(26, Pin.OUT)
buzzer_pin = Pin(4, Pin.OUT)
# -----------------------------
# Variables iniciales / límites
# -----------------------------
limite_frio = 15.0
limite_calor = 30.0
alarma_activa = False
estado_anterior = None
armario_de_ropa = {
"frio": {1: "Abrigo deportivo, Remera manga larga/termica, Joggin de invierno y Zapatillas deportivas",
2: "Campera de cuero/lana, Buzo, Jeans y Zapatillas",
3: "Abrigo de paño largo, Camisa de vestir, Pantalón de lana y Zapatos"},
"templado": {1: "Buzo ligero, Remera transpirable, Pantalón deportivo y Zapatillas deportivas",
2: "Buzo, Camisa manga larga, Jeans y Zapatillas",
3: "Chaqueta de traje, Camisa de vestir y Pantalón de vestir"},
"calor": {1: "Musculosa, Short deportivo y Zapatillas deportivas",
2: "Remera casual, Pantalon ligero/bermuda y Zapatillas/Ojotas",
3: "Camisa de lino, Pantalón de vestir y Zapatos"},
}
# -----------------------------
# WIFI
# -----------------------------
ssid = 'Wokwi-GUEST'
wifipassword = ''
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(ssid, wifipassword)
print("Conectando")
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.5)
print("\nConectado a Wifi!")
print(sta_if.ifconfig())
# -----------------------------
# MQTT – ADAFRUIT IO
# -----------------------------
mqtt_server = 'io.adafruit.com'
port = 1883
user = 'proyectoembebidos717'
password = 'aio_HOWs647E3PhnsMz9RnSEBbV0eNrH'
client_id = 'weather-demo-717'
feed_wokwi_clima = 'proyectoembebidos717/feeds/wokwi-clima'
feed_limite_frio = 'proyectoembebidos717/feeds/limite_frio'
feed_limite_calor = 'proyectoembebidos717/feeds/limite_calor'
feed_leds = 'proyectoembebidos717/feeds/leds'
feed_buzzer = 'proyectoembebidos717/feeds/buzzer'
feed_estilo = 'proyectoembebidos717/feeds/estilo-usuario'
feed_recomendacion = 'proyectoembebidos717/feeds/mensaje-recomendacion'
# -----------------------------
# Callback MQTT
# -----------------------------
def funcion_callback(topic, msg):
global limite_frio, limite_calor, alarma_activa
topic_str = topic.decode('utf-8')
msg_str = msg.decode('utf-8')
if topic_str == feed_limite_frio:
try:
limite_frio = float(msg_str)
print("Nuevo limite de frio:", limite_frio)
except:
print("limite de frio inválido:", msg_str)
elif topic_str == feed_limite_calor:
try:
limite_calor = float(msg_str)
print("Nuevo limite de calor:", limite_calor)
except:
print("limite de calor inválido:", msg_str)
elif topic_str == feed_buzzer:
if msg_str in ("1", "ON", "on", "On", "True", "true"):
alarma_activa = True
print("Alarma ACTIVADA (desde dashboard)")
elif msg_str in ("0", "OFF", "off", "Off", "False", "false"):
alarma_activa = False
print("Alarma DESACTIVADA (desde dashboard)")
elif topic_str == feed_estilo:
try:
val = int(float(msg_str))
if 1 <= val <= 3:
estilo_usuario = val
print(f">>> Estilo cambiado a opción: {estilo_usuario}")
except:
print("Estilo inválido")
#=================================
# CONECTAR A MQTT
#=================================
try:
client = MQTTClient(client_id, mqtt_server, user=user, password=password, port=int(port))
client.set_callback(funcion_callback)
client.connect()
print("Suscrito a los feeds de control.")
client.subscribe(feed_limite_frio)
client.subscribe(feed_limite_calor)
client.subscribe(feed_buzzer)
client.subscribe(feed_estilo)
client.subscribe(feed_recomendacion)
print("Pidiendo datos guardados a Adafruit...")
client.publish(feed_limite_frio + '/get', ' ')
client.publish(feed_limite_calor + '/get', ' ')
client.publish(feed_buzzer + '/get', ' ')
client.publish(feed_estilo + '/get', ' ')
for i in range(10):
client.check_msg()
time.sleep(0.5)
print("----------------- Sincronización Finalizada ------------------ ")
print(f"Límites iniciales cargados: Frío< {limite_frio} | Calor> {limite_calor} | Alarma= {alarma_activa}")
except OSError as e:
print("Error crítico conectando MQTT:", e)
time.sleep(5)
machine.reset()
# -----------------------------
# Variables para publicar solo cuando cambie
# -----------------------------
prev_temp_hum_msg = ""
prev_led_state = ""
prev_buzzer_state = "0"
# -----------------------------
# Loop principal
# -----------------------------
while True:
try:
client.check_msg()
sensor.measure()
temp = sensor.temperature()
hum = sensor.humidity()
if temp < limite_frio:
estado = "FRIO"
elif temp > limite_calor:
estado = "CALOR"
else:
estado = "TEMPLADO"
try:
estilo_usuario
except NameError:
estilo_usuario = 2
recomendacion = armario_de_ropa[estado.lower()][estilo_usuario]
client.publish("proyectoembebidos717/feeds/mensaje-recomendacion", recomendacion)
if estado == "FRIO":
led_azul.value(1)
led_verde.value(0)
led_rojo.value(0)
elif estado == "TEMPLADO":
led_azul.value(0)
led_verde.value(1)
led_rojo.value(0)
else:
led_azul.value(0)
led_verde.value(0)
led_rojo.value(1)
if estado != prev_led_state:
client.publish(feed_leds, estado)
prev_led_state = estado
print("Publicado leds:", estado)
# -----------------------------
# *BLOQUE DE BUZZER — CORREGIDO*
# -----------------------------
if alarma_activa and (estado != estado_anterior):
buzzer_pin.value(1)
time.sleep(0.2)
buzzer_pin.value(0)
print("Buzzer sonó por cambio de estado:", estado)
estado_anterior = estado
temp_hum_msg = ujson.dumps({"temp": temp, "hum": hum})
if temp_hum_msg != prev_temp_hum_msg:
client.publish(feed_wokwi_clima, temp_hum_msg)
prev_temp_hum_msg = temp_hum_msg
print("Publicado wokwi-clima:", temp_hum_msg)
time.sleep(2)
except OSError as e:
print("Error en loop principal:", e)
time.sleep(5)
machine.reset()