#Universidad Nacional de la Matanza
#Sistemas Embebidos
#Integrante: Augusto Rossaroli Loos
#El proyecto controla cuantas ovejas entraron o salieron de corral sin y verifica si todas regresaron al corral después del pastoreo.
#Posee un sensor de movimiento(para detectar las ovejas que pasen),un contador(para contar cuantas pasaron), una bocina(que alerta caundo pasa una)
# y un par de leds que indican si esta encendido y cuando esta detectandose movimiento.
#estados:
#estado 0= alarma desactivada (esperando el ON en el deshboard)
#estado 1= alarma activada(prende led), monitoreando el sensor PIR
#estado 2= movimiento detectado(prende led 2), sonar y contar (reflejados en la simulacion y en el deshboard)
#importacion
import machine
from machine import Pin, PWM
import time
import network #conectarse con la red
from umqtt.simple import MQTTClient #es una librería para conectarse a un broker MQTT
import tm1637
from tm1637 import TM1637
#Indicamos red WIFI y clave
SSID = 'Wokwi-GUEST'
WIFI_PASSWORD = ''
#Para que el hardware se conecte el con el Broker
MQTT_SERVER = 'io.adafruit.com'
PORT = 1883
USER = 'augustorossa'
PASSWORD = 'aio_KFlu95rcSPs8fM8YfzBWEUSvhaY0'
#Indicamos ID y topicos
CLIENT_ID = 'ALARMA'
TOPIC_PIR = 'augustorossa/feeds/sensor-movimiento'
TOPIC_BOCINA = 'augustorossa/feeds/alarma'
TOPIC_CONTADOR = 'augustorossa/feeds/contador'
#Indicador de que si el contador esta activo
ALARMA_ACTIVADA = False
LEDESTADO = Pin(17, Pin.OUT)
# Configuración de WiFi(escanea las redes wifi para saber si podemos o no conectarnos a una red)
sta_if = network.WLAN(network.STA_IF) #pone el dispositivo en modo sation
sta_if.active(True) #enciende el modulo wifi
sta_if.connect(SSID, WIFI_PASSWORD ) #es la red que le decimos que se conecte
print("Conectado")
#Ciclo de espera hasta que se conecte
while not sta_if.isconnected():
print(".", end=" ")
time.sleep(0.1)
print("CONECTADO A WIFI")
print(sta_if.ifconfig()) #Imprime la IP asignada al ESP32
# Callback para recibir mensajes cuando hay modificacion en topicos
def callback_alarma(topic, msg): #se ejecuta cada vez que recibamos un topico
global ALARMA_ACTIVADA, LEDESTADO
#decodifico el mensaje y el topico al que esta referido
dato = msg.decode('utf-8')
topicrec = topic.decode('utf-8')
print("Mensaje en topico" + topicrec + ":" + dato)
if topicrec == TOPIC_BOCINA and "OFF" in dato:
ALARMA_ACTIVADA = False
contador = 0
display.number(contador)
conexionMQTT.publish(TOPIC_CONTADOR, "0")#se reinicia en adafruit
elif dato == "ON":
ALARMA_ACTIVADA=True
LEDESTADO.value(ALARMA_ACTIVADA)
# Conexión al broker MQTT
try:
conexionMQTT = MQTTClient(CLIENT_ID, MQTT_SERVER , user=USER, password=PASSWORD, port=int(PORT))
conexionMQTT.set_callback(callback_alarma)#funcion callback recibir mensajes
conexionMQTT.connect()
conexionMQTT.subscribe(TOPIC_BOCINA)#nos subscribimos a un topico
print("Conectado con Broker MQTT")
#si hay errores en try imprime mensaje fallo y 5 segudos despues se resetea
except OSError as e:
print("Fallo la conexion al Broker, reiniciando...")
time.sleep(5)
machine.reset()
# Configuración de pines
PIR = Pin(14, Pin.IN)
LEDPIR = Pin(16, Pin.OUT)
SIRENA = PWM(Pin(13), freq=1200, duty_u16=32768)#pin/frecuencia/potencia del sonido
SIRENA.duty(0)
display = TM1637(clk=Pin(2), dio=Pin(4))
display.brightness(7) # Brillo del display
estadoPIR = PIR.value()
print("Comenzando monitoreo de PIR")
sonando = False # Estado de la sirena
contador = 0 # Inicialización del contador
while True:
try:
#se fija si hay mensajes nuevos en la conexion cada 2 veces x seg, si hay se dispara la funcion de antes
conexionMQTT.check_msg()
time.sleep_ms(500)
estadoPIRNuevo = PIR.value()
LEDPIR.value(estadoPIRNuevo)
#si el sistema esta activado y el pir detecta movimiento suena
if ALARMA_ACTIVADA:
if estadoPIRNuevo:
sonando = True
if not estadoPIR:
#enviamos al server el cambio
print("PIR Activo durante estado de circuito encendido")
conexionMQTT.publish(TOPIC_PIR, str(1))
contador += 1 # Incrementar contador
print("Contador de activaciones:", contador)
display.number(contador) # Mostrar contador en el display TM1637
conexionMQTT.publish(TOPIC_CONTADOR, str(contador)) # Publicar contador en Adafruit
SIRENA.duty(512) # Activar sirena
time.sleep(0.5) # Sonar por 1 segundo
SIRENA.duty(0) # Apagar sirena
else:
if estadoPIR:
conexionMQTT.publish(TOPIC_PIR, str(0))
else:
sonando = False
#actualizo estado
estadoPIR = estadoPIRNuevo
except OSError as e:
print("Error ", e)
time.sleep(5)
machine.reset()