"""
Universidad de La Matanza
Fundamentos de los Sistemas Embebidos
Integrantes: Rocio Jimenez, Julieta Caragliano, Erin Gomez
Proyecto: nuestro proyecto consiste en un sistema de alarma que detecta
cuando la mascota desea salir y se activa el buzzer
"""
import machine
import network
import time
import micropython
from machine import Pin, PWM, ADC
from hcsr04 import HCSR04
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 = 'ErinAgus_1234' #definido en adafruit
password = 'aio_oStW8326KJjeRPaYFkLG3JP80HwU' #key adafruit
#Indicamos ID(unico) y topicos
client_id = 'DetectorMovimiento'
topic_MOV = 'ErinAgus_1234/feeds/SensorMov'
topic_ALARMA = 'ErinAgus_1234/feeds/Alarma'
#Usamos una variable para definir si la alarma esta activa
ALARMA_ACTIVA=False
LEDESTADO = Pin(7,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
#Cuando se ejecuta esta funcion quere decir que
#hubo un mensaje nuevo en algun topico, verificamos esto
#Dado que lo que llega viene en UTF-8, lo decodificamos
#para que sea una cadena de texto regular
dato = msg.decode('utf-8')
topicrec = topic.decode('utf-8')
print("Cambio en: "+topicrec+":"+dato)
#Nos fijamos si es el topico esperado y el valor del 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:
#Si fallo la conexion, reiniciamos todo
print("Fallo la conexion al Broker, reiniciando...")
time.sleep(5)
machine.reset()
#entradas
sensor=HCSR04(trigger_pin=2, echo_pin=3)
parlante=PWM(Pin(9), freq=1200, duty_u16=32768)
parlante.duty(0) #ciclo de actividad 0%
pot= ADC(Pin(1))
print("Comenzando monitoreo")
sonando=False #para ver si el parlante prende o no
estadoAlarma=0 #detecta que la alarma se prendio
while True:
try:
conexionMQTT.check_msg()
time.sleep_ms(100)
distancia=sensor.distance_cm() #se lee la distancia
valorDistancia=pot.read() #desde el potenciomentro se lee la distancia que se necesita para que suene el buzzer
print("Distancia: ", valorDistancia)
if ALARMA_ACTIVA: #la alarma esta prendida
if distancia<=valorDistancia: #el perro esta en la puerta
sonando=True #para que luego suene el buzzer
if estadoAlarma==0:
conexionMQTT.publish(topic_MOV, str(1))
estadoAlarma=1 #se cambia a 1 porque el perro se acerco
else: #no se detecta movimiento cerca de la puerta
sonando=False #se lo pone asi para que despues no suene el buzzer
if estadoAlarma==1:
conexionMQTT.publish(topic_MOV, str(0))
estadoAlarma=0 #se cambia a 0 porque no esta el perro
else: #la alarma no esta activa y no debe sonar el buzzer
sonando=False
if sonando:
parlante.duty(512)
else:
parlante.duty(0)
except OSError as e:
print("Error ",e)
time.sleep(5)
machine.reset()