#comision:05 grupo:2 Nombres: Falsetti Gonzalo, Rodriguez Franco Universidad Nacional de la Matanza
from machine import Pin
import dht
import network
from umqtt.simple import MQTTClient
from time import sleep, ticks_ms
# Configuración de red WiFi
WIFI_SSID = 'Wokwi-GUEST' # Cambia por el nombre de tu red WiFi
WIFI_PASS = '' # Cambia por tu contraseña de red
# Configuración de Adafruit IO
AIO_USERNAME = 'gonzakpo063' # Tu usuario de Adafruit IO
AIO_KEY = 'aio_uYJn76LV8Ob9hcGUsGyqVRBjtfuI' # Tu clave de Adafruit IO
AIO_BROKER = 'io.adafruit.com'
AIO_PORT = 1883
# Feeds de Adafruit IO
TEMP_FEED = f'{AIO_USERNAME}/feeds/temperatura'
VENTANA_FEED = f'{AIO_USERNAME}/feeds/ventana'
UMBRAL_FEED = f'{AIO_USERNAME}/feeds/umbral'
CONTROL_FEED = f'{AIO_USERNAME}/feeds/control'
AUTO_CONTROL_FEED = f'{AIO_USERNAME}/feeds/auto-control'
MAIN_SWITCH_FEED = f'{AIO_USERNAME}/feeds/main-switch' # Nuevo feed para encendido/apagado
# Configuración del sensor DHT22
dht_pin = Pin(4) # Cambia al GPIO donde conectaste el DHT22
sensor = dht.DHT22(dht_pin)
# Configuración del motor paso a paso
step_pin = Pin(5, Pin.OUT)
dir_pin = Pin(6, Pin.OUT)
enable_pin = Pin(7, Pin.OUT)
# Inicialización del motor
enable_pin.value(0) # Activa el controlador (0 = habilitado, 1 = deshabilitado)
# Umbrales de temperatura
umbral_alta = 40 # Umbral inicial para abrir la ventana
TEMP_BAJA = 25 # Temperatura para cerrar la ventana
# Estado inicial
ventana_abierta = False
ultima_temp = None # Última temperatura registrada
ultimo_envio = ticks_ms() # Marca de tiempo para control de envío
auto_control_activo = True # Control automático activado por defecto
main_switch_activo = True # Programa activado por defecto
# Conectar a WiFi
def conectar_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASS)
while not wlan.isconnected():
print("Conectando a WiFi...")
sleep(1)
print("Conectado a WiFi:", wlan.ifconfig())
# Función para mover el motor paso a paso
def move_motor(steps, direction):
dir_pin.value(direction) # Establece la dirección (0 o 1)
for _ in range(steps):
step_pin.value(1)
sleep(0.001)
step_pin.value(0)
sleep(0.001)
# Función para abrir la ventana
def abrir_ventana():
global ventana_abierta
if not ventana_abierta:
print("Abriendo ventana...")
move_motor(200, 1) # Ajusta el número de pasos necesarios
ventana_abierta = True
mqtt_client.publish(VENTANA_FEED, "abierta")
else:
print("La ventana ya está abierta.")
# Función para cerrar la ventana
def cerrar_ventana():
global ventana_abierta
if ventana_abierta:
print("Cerrando ventana...")
move_motor(200, 0) # Ajusta el número de pasos necesarios
ventana_abierta = False
mqtt_client.publish(VENTANA_FEED, "cerrada")
else:
print("La ventana ya está cerrada.")
# Manejo de mensajes desde Adafruit IO
def manejar_mensaje(topic, msg):
global umbral_alta, auto_control_activo, main_switch_activo
topic = topic.decode()
msg = msg.decode()
print(f"Mensaje recibido en {topic}: {msg}")
if topic == CONTROL_FEED:
if main_switch_activo: # Solo permite control manual si el switch principal está activo
if msg == "abrir":
abrir_ventana()
elif msg == "cerrar":
cerrar_ventana()
elif topic == UMBRAL_FEED:
if main_switch_activo: # Solo permite actualizar el umbral si el switch está activo
try:
umbral_alta = int(msg)
print(f"Nuevo umbral de temperatura: {umbral_alta}°C")
except ValueError:
print("Error: El umbral recibido no es un número válido.")
elif topic == AUTO_CONTROL_FEED:
if main_switch_activo: # Solo permite cambiar el modo automático si el switch está activo
if msg == "activar":
auto_control_activo = True
print("Control automático activado.")
elif msg == "desactivar":
auto_control_activo = False
print("Control automático desactivado.")
elif topic == MAIN_SWITCH_FEED: # Nuevo manejo del switch principal
if msg == "on":
main_switch_activo = True
print("Sistema activado.")
elif msg == "off":
main_switch_activo = False
print("Sistema desactivado.")
# Conexión a Adafruit IO
conectar_wifi()
mqtt_client = MQTTClient(AIO_USERNAME, AIO_BROKER, AIO_PORT, AIO_USERNAME, AIO_KEY)
mqtt_client.set_callback(manejar_mensaje)
mqtt_client.connect()
mqtt_client.subscribe(CONTROL_FEED)
mqtt_client.subscribe(UMBRAL_FEED)
mqtt_client.subscribe(AUTO_CONTROL_FEED)
mqtt_client.subscribe(MAIN_SWITCH_FEED) # Suscripción al feed del interruptor principal
print("Conectado a Adafruit IO y suscrito a feeds.")
# Bucle principal: Lectura del sensor y control automático
while True:
try:
# Procesar mensajes de Adafruit IO
mqtt_client.check_msg()
# Solo ejecuta el resto si el switch principal está activo
if main_switch_activo:
# Leer datos del sensor DHT22
sensor.measure()
temp = sensor.temperature()
# Control automático de la ventana
if auto_control_activo:
if temp >= umbral_alta and not ventana_abierta:
abrir_ventana()
elif temp <= TEMP_BAJA and ventana_abierta:
cerrar_ventana()
# Enviar datos a Adafruit IO cada 500 ms
if ticks_ms() - ultimo_envio >= 500:
if temp != ultima_temp:
print(f"Temperatura actual: {temp}°C")
mqtt_client.publish(TEMP_FEED, str(temp))
ultima_temp = temp
ultimo_envio = ticks_ms()
except Exception as e:
print("Error:", e)
sleep(0.1) # Pequeño retraso para evitar sobrecargar el bucle