import time
import machine
import micropython
import network
from machine import Pin,PWM
from umqtt.simple import MQTTClient
#Indicamos red WIFI y clave
ssid = 'Wokwi-GUEST'
wifipassword = ''
#Datos Server MQTT (Broker)
#Indicamos datos MQTT Broker (server y puerto)
mqtt_server = 'io.adafruit.com'
port = 1883
user = 'HDK1SAMMMMMM' #definido en adafruit
password = 'aio_KOFk57mT7xpansT9qjcpwMlzFDWx' #key adafruit
#Indicamos ID(unico) y topicos
#Nombre: Eliezer Samuel Jeronimo Luciano
client_id = 'MiAlarma3'
topic_PIR = 'HDK1SAMMMMMM/feeds/SensorPIR3'
topic_ALARMA = 'HDK1SAMMMMMM/feeds/ALARMA3'
#Usamos una variable para definir si la alarma esta activa
ALARMA_ACTIVA=False
LEDESTADO = Pin(17,Pin.OUT)
#Definimos modo Station (conectarse a Access Point remoto)
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
#Conectamos al wifi
sta_if.connect(ssid, wifipassword)
print("Conectando")
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print("Conectado a Wifi!")
#Vemos cuales son las IP
print(sta_if.ifconfig())
#Antes de conectarnos al broker, vamos a definir una funcion
#que sera llamada cada vez que se produzca un publish sobre
#un topico donde estamos suscriptos
def callback_alarma(topic, msg):
global ALARMA_ACTIVA,LEDESTADO
dato = msg.decode('utf-8')
topicrec = topic.decode('utf-8')
print("Cambio en: "+topicrec+":"+dato)
if topicrec == topic_ALARMA and "OFF" in dato:
ALARMA_ACTIVA=False
else:
ALARMA_ACTIVA=True
LEDESTADO.value(ALARMA_ACTIVA)
#Intentamos conectarnos al broker MQTT
try:
conexionMQTT = MQTTClient(client_id, mqtt_server, user=user, password=password, port=int(port))
conexionMQTT.set_callback(callback_alarma)
conexionMQTT.connect()
conexionMQTT.subscribe(topic_ALARMA)
print("Conectado con Broker MQTT")
except OSError as e:
print("Fallo la conexion al Broker, reiniciando...")
time.sleep(5)
machine.reset()
#Armamos un loop infinito que chequea por mensajes nuevos
#y verifica el estado del PIR
PIR = Pin(13,Pin.IN)
LEDPIR = Pin(12,Pin.OUT)
# LED indicador de sirena activa (segundo LED - verde, pin 14)
LED_SIRENA = Pin(14,Pin.OUT)
SIRENA = PWM(Pin(5), freq=1200, duty_u16=32768)
SIRENA.duty(0)
estadoPIR = PIR.value()
print("Comenzando monitoreo de PIR")
SONANDO=False #Estado de la sirena
tiempo_deteccion = None # Momento en que se detecto movimiento por primera vez
while True:
try:
conexionMQTT.check_msg()
time.sleep_ms(500)
#actualizamos el LED PIR
estadoPIRNuevo = PIR.value()
LEDPIR.value(estadoPIRNuevo)
#Si la ALARMA esta activa...
if ALARMA_ACTIVA:
#Y el PIR detecta movimiento
if estadoPIRNuevo:
#Registrar tiempo de primera deteccion si no esta registrado
if tiempo_deteccion is None:
tiempo_deteccion = time.time()
print("Movimiento detectado, esperando 5 segundos...")
#Verificar si ya pasaron 5 segundos desde la primera deteccion
if (time.time() - tiempo_deteccion) >= 5:
SONANDO=True
#Si el estado anterior del PIR era 0, entonces notificamos
#ya que el PIR estaba apagado y ahora encendido, o sea que acaba
#de detectar movimiento
if not estadoPIR:
#enviamos al server el cambio
print("PIR Activo durante estado de alarma activa")
conexionMQTT.publish(topic_PIR,str(1))
else:
#Si el PIR no detecta movimiento pero lo hizo anteriormente
#Entonces notificamos
if estadoPIR:
conexionMQTT.publish(topic_PIR,str(0))
#Solo reiniciamos el temporizador si la sirena AUN no arranco
if not SONANDO:
tiempo_deteccion = None
else:
#Si la alarma no esta activa, no deberia sonar
SONANDO=False
tiempo_deteccion = None
#Siempre actualizamos el estado del PIR
estadoPIR = estadoPIRNuevo
if SONANDO:
SIRENA.duty(512)
LED_SIRENA.value(1) # LED verde encendido cuando sirena activa
else:
SIRENA.duty(0)
LED_SIRENA.value(0) # LED verde apagado
except OSError as e:
print("Error OSError:",e)
time.sleep(5)
machine.reset()