#DETECTOR DE FUGAS DE GAS: Al detectar alto niveles de gas en el ambiente
#(simulado con un potenciometro),
#se activa una alarma, hace que la el se cierre una llave de gas y
#Corta la luz del hogar
#UNLAM
#03/07/2024
#Doricich, Agustin Francisco
#Benitez, Nahuel Luca
#Gallardo, Samuel
import network
import socket
import time
import machine
from machine import Pin, ADC, PWM
from servo import Servo
from umqtt.simple import MQTTClient
#Variables
#Configura el pin 0 como un ADC para leer valores analógicos
sensor = ADC(Pin(0))#Potenciometor que simula
#Configura el pin 1 como un PWM para controlar un buzzer.
buzzer = PWM(Pin(1, mode=Pin.OUT), duty=0)
#Configura un servomotor en el pin 3.
sg90 = Servo(pin=3, angle=90)#Servomotor
#Leds
led = Pin(2, Pin.OUT)
rele = Pin(5,Pin.OUT) #Simula Termica
#Variables de estado.
RESET=0
ESTADO=0
#config mqtt
ssid = 'Wokwi-GUEST'
wifipassword= ''
#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!")
#adafruit
mqtt_server = 'io.adafruit.com'
port = 1883
user= 'MrUse77'
password= 'aio_JdiK53fNLYdSKfYe2Kt2BLsYwFYS'
client_id="Sensor"
topic_Alarma="MrUse77/feeds/ALARMA"
topic_Sensor="MrUse77/feeds/sensor-de-gas"
def funcion_callback(topic, msg):
global RESET
#Pasamos el msg y el topico de 8 bytes a str
dato = msg.decode('utf-8')
topicrec = topic.decode('utf-8')
if topicrec == topic_Sensor and "1" in dato:
#Utilizamos el RESET como estado
RESET = dato
#Conexion al adafruit
try:
conexionMQTT = MQTTClient(client_id, mqtt_server,user=user,password=password,port=int(port))
conexionMQTT.set_callback(funcion_callback) #Funcion Callback para recibir del broker mensajes
conexionMQTT.connect() #Hacemos la conexión.
conexionMQTT.subscribe(topic_Sensor) #Subscripcion al topico del sensor
print("Conectado con Broker MQTT")
except OSError as e:
#Si falló la conexión, reiniciamos todo
print("Fallo la conexion al Broker, reiniciando...")
time.sleep(5)
machine.reset()
#Funcion para alarma (controla el buzzer y el LED para simular una alarma)
def alarma(freq, ms, led_value):
if freq == 0:
buzzer.duty(0)
lestado de alarmad.value(0)
return
else:
buzzer.freq(freq)
buzzer.duty(200)
led.value(led_value)
time.sleep_ms(ms)
#Funcion para mapear valores del potenciometro de 0 a 100
def mapeo(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
print("MQ5 Sensor")
while True:
try:
#Chequea si hubo alguna publicacion en el topico
conexionMQTT.check_msg()
time.sleep_ms(500)
#Guarda el valor que registra el sensor en una variable (valores de 0 a 4095)
sensor_value = sensor.read()
#Envia el valor del sensor a la funcion mapeo
value = mapeo(sensor_value, 0, 4095, 0, 100)
#Si el reset es 0 entra
if not RESET:
if value >= 50 or ESTADO == 1:
#Llama a la funcion alarma 2 veces con diferentes valores
alarma(323, 200, 1)
alarma(523, 200, 0)
#Se cierra la llave de gas (servo)
sg90.move(180)
#Se baja la termica (rele)
rele.value(1)
#Si al momento de encenderse la alarma el estado es 0 se publica
#en el topico para encender la luz del dashboard y se cambia el estado a 1
if ESTADO == 0:
ESTADO=1
conexionMQTT.publish(topic_Alarma,str(ESTADO))
#Si el reset es 1 (se activa desde el dashboard)
else:
#Si la alarma sigue activa (estado=1)
if ESTADO == 1:
#Se publica en el topico para apagar la luz del dashboard
#y el estado vuelve a 0
ESTADO=0
conexionMQTT.publish(topic_Alarma,str(ESTADO))
#Se devuelve el valor del reset a 0
RESET=0
#Se apaga la alarma (sonido y luz)
alarma(0, 0, 1)
#Se abre la llave de gas (servo)
sg90.move(90)#Para mejor simulacion vuelve a 90 grados, ESTO NO DEBERIA PASAR NORMALMENTE
#Se vuelve a subir la termica
rele.value(0)
except OSError as e:
#Si falló la conexión, reiniciamos todo
print("Error: ",e)
time.sleep(5)
machine.reset()