from machine import Pin, ADC, PWM
import time
import network
from umqttsimple import MQTTClient
import ubinascii
import machine
# --- CONFIGURACIÓN DE PINES ---
pir = Pin(13, Pin.IN)
pin_boton = Pin(14, Pin.IN, Pin.PULL_UP)
sensor_gas = ADC(Pin(34))
sensor_ldr = ADC(Pin(35))
sensor_gas.atten(ADC.ATTN_11DB)
sensor_ldr.atten(ADC.ATTN_11DB)
led_alerta = Pin(2, Pin.OUT)
led_luz = Pin(4, Pin.OUT)
buzzer = Pin(15, Pin.OUT)
servo = PWM(Pin(18), freq=50)
# --- CONFIGURACIÓN MQTT Y WIFI ---
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""
MQTT_BROKER = "broker.emqx.io"
# Usamos un ID fijo pero único para evitar problemas de MAC en el simulador
MQTT_CLIENT_ID = "proyecto_mti_jcgm_"
TOPIC_PUB_DATOS = "seguridad/datos/jcgm/mti"
TOPIC_SUB_CONTROL = "seguridad/control/jcgm/mti"
# --- VARIABLES ---
sistema_armado = False
umbral_gas = 50
umbral_noche = 2500
ultimo_envio = 0
# Función para conectar a Wi-Fi
def conectar_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
print("Conectando a WiFi...", end="")
while not wlan.isconnected():
print(".", end="")
time.sleep(0.5)
print("\nWiFi Conectado. IP:", wlan.ifconfig()[0])
# Función para recibir mensajes de Node-RED
def llegada_mensaje(topic, msg):
global sistema_armado
comando = msg.decode()
if comando == "ARMADO":
sistema_armado = True
elif comando == "DESARMADO":
sistema_armado = False
print(f"Comando remoto recibido: {comando}")
# --- FUNCIÓN DE CONEXIÓN ROBUSTA (Sin Reset) ---
def conectar_mqtt():
# Añadimos keepalive para mantener la conexión viva
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, port=1883, keepalive=60)
client.set_callback(llegada_mensaje)
try:
print(f"Intentando conectar a {MQTT_BROKER}...")
# Forzamos una sesión limpia
client.connect(clean_session=True)
print("¡CONECTADO EXITOSAMENTE!")
client.subscribe(TOPIC_SUB_CONTROL)
return client
except Exception as e:
print("Fallo en la conexión:", e)
return None
# --- INICIO ---
conectar_wifi()
client = conectar_mqtt()
while True:
# 1. Lógica del Botón físico (Funciona siempre aunque no haya internet)
if pin_boton.value() == 0:
sistema_armado = not sistema_armado
print("SISTEMA:", "ARMADO" if sistema_armado else "DESARMADO")
while pin_boton.value() == 0: time.sleep(0.01)
time.sleep(0.2)
# Lectura de sensores
gas = int((sensor_gas.read() / 4095) * 100)
luz = sensor_ldr.read()
mov = pir.value()
# 2. Lógica de Control de Actuadores
if sistema_armado:
if luz > umbral_noche: led_luz.off() # PDF: Activar noche apaga luz
else: led_luz.on()
if gas > umbral_gas or mov == 1:
buzzer.on()
led_alerta.on()
servo.duty(77)
else:
buzzer.off()
led_alerta.off()
servo.duty(26)
else:
led_luz.off()
led_alerta.off()
buzzer.off()
servo.duty(26)
# 3. LÓGICA DE COMUNICACIÓN MQTT
if client:
try:
client.check_msg() # Revisar si Node-RED mandó comando
# Envío de datos cada 5 segundos
if (time.time() - ultimo_envio) >= 5:
payload = '{{"gas":{}, "luz":{}, "mov":{}, "armado":{}}}'.format(
gas, luz, mov, 1 if sistema_armado else 0
)
client.publish(TOPIC_PUB_DATOS, payload)
print("Datos enviados:", payload)
ultimo_envio = time.time()
except OSError:
print("Conexión perdida con el broker...")
client = conectar_mqtt()
else:
# Si no hay conexión, intentamos reconectar en segundo plano cada tanto
if (time.time() - ultimo_envio) >= 10:
client = conectar_mqtt()
ultimo_envio = time.time()
time.sleep(0.1)