#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 servo motor se mueva hasta el punto de cierre de una llave de gas y
#Corta la termica del hogar (simulado con un led blanco)
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')
print("Mensaje en tópico "+topicrec+":"+dato)
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)
led.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()Loading
esp32-c3-devkitm-1
esp32-c3-devkitm-1