import time
import machine
import micropython
import network
import dht
from machine import Pin, PWM
from umqtt.simple import MQTTClient
import urequests
import ubinascii
import gc # Importar el módulo de recolección de basura
# Configuración de Twilio
twilio_sid = 'AC75994e678344c6c9292e1863d76d732d' # Reemplaza con tu Account SID
twilio_token = '234845f6bafd6e95f63e83e806d85f3b' # Reemplaza con tu Auth Token
twilio_phone_number = '+19137044572' # Reemplaza con tu número de Twilio
destination_phone_number = '+5491122827132' # Reemplaza con el número de destino
# Variable de bandera para el envío de SMS
sms_enviado = False
def send_sms(body):
gc.collect() # Recolectar basura antes de la solicitud
url = 'https://api.twilio.com/2010-04-01/Accounts/{}/Messages.json'.format(twilio_sid)
data = 'From={}&To={}&Body={}'.format(twilio_phone_number, destination_phone_number, body)
auth = ubinascii.b2a_base64('{}:{}'.format(twilio_sid, twilio_token))[:-1].decode('utf-8')
headers = {
'Authorization': 'Basic {}'.format(auth),
'Content-Type': 'application/x-www-form-urlencoded'
}
response = urequests.post(url, data=data, headers=headers)
if response.status_code == 201:
print("SMS enviado correctamente")
else:
print("Error al enviar SMS: {}".format(response.text))
response.close() # Cerrar la respuesta para liberar recursos
# CONECTA WIFI
ssid = 'Wokwi-GUEST'
wifipassword = ''
# SERVER MQTT
mqtt_server = 'io.adafruit.com'
port = 1883
user = 'Lpedro'
password = 'aio_wcSJ86B67xm68v88rKZdGhlzFLl6'
# TOPICOS
client_id = 'Incendio'
topic_TMP = 'Lpedro/feeds/sensortemp'
topic_ALARMA = 'Lpedro/feeds/alarmatemp'
ALARMA_ACTIVA = False
ALARMA_FORZADA = False
LEDESTADO = Pin(17, Pin.OUT) # LED estado general
PARLANTE = PWM(Pin(5)) # Pin del parlante usando PWM
PARLANTE.duty(0) # Asegurarse de que el parlante esté apagado al inicio
LUZ = Pin(18, Pin.OUT) # LED que se enciende con el parlante
LUZ2 = Pin(4, Pin.OUT)
sensor = dht.DHT22(Pin(14))
band = 0 # Chequeo temp anterior
# Acceso a internet
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(ssid, wifipassword)
print("CONECTANDO")
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print("CONECTADO A WIFI!!")
print(sta_if.ifconfig())
# Función de callback para manejar mensajes MQTT
def callback_alarma(topic, msg):
global ALARMA_ACTIVA, ALARMA_FORZADA, LEDESTADO, PARLANTE, LUZ, LUZ2
dato = msg.decode('utf-8')
topicrec = topic.decode('utf-8')
print("Mensaje en Tópico " + topicrec + ": " + dato)
if topicrec == topic_ALARMA and "OFF" in dato:
ALARMA_ACTIVA = False
ALARMA_FORZADA = False
LEDESTADO.value(0)
PARLANTE.duty(0)
LUZ.value(0)
LUZ2.value(0)
conexionMQTT.publish(topic_TMP, '0') # Publicar 0 cuando el dispositivo está apagado
if topicrec == topic_ALARMA and "ON" in dato:
ALARMA_ACTIVA = True
LEDESTADO.value(1)
conexionMQTT.publish(topic_TMP, '1') # Publicar 1 cuando el dispositivo está encendido
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()
# Función para generar sonido de sirena
def sonido_sirena():
for freq in range(1000, 2000, 10): # Aumentar la frecuencia de 1000 a 2000
PARLANTE.freq(freq)
LUZ.value(1)
LUZ2.value(0)
time.sleep(0.01)
for freq in range(2000, 1000, -10): # Disminuir la frecuencia de 2000 a 1000
PARLANTE.freq(freq)
LUZ.value(0)
LUZ2.value(1)
time.sleep(0.01)
while True:
try:
conexionMQTT.check_msg()
if ALARMA_ACTIVA:
sensor.measure()
temp = sensor.temperature()
if band == 0 or aux != temp:
aux = temp
band = 1
print("TEMPERATURA = " + str(aux))
if temp >= 58:
ALARMA_FORZADA = True # Se fuerza la alarma si la temperatura es igual o mayor a 58 grados.
# Enviar SMS solo si no ha sido enviado previamente
if not sms_enviado:
send_sms('Alarma de incendio activada! Temperatura: {} grados'.format(temp))
sms_enviado = True
if ALARMA_FORZADA:
PARLANTE.duty(512) # Encender el parlante con un ciclo de trabajo del 50%
sonido_sirena() # Generar sonido de sirena
if temp <= 30:
ALARMA_FORZADA = False # Desactivar la alarma forzada si la temperatura es igual o menor a 30 grados.
PARLANTE.duty(0) # Apagar el parlante
LUZ.value(0) # Apagar la luz
LUZ2.value(0)
sms_enviado = False # Restablecer la bandera de SMS cuando la alarma se desactiva
else:
# Asegurarse de que el parlante esté apagado si la alarma no está activa
PARLANTE.duty(0)
LUZ.value(0)
LUZ2.value(0)
time.sleep(0.1) # Reducimos la frecuencia de medición para evitar sobrecarga
except OSError as e:
print("Error ", e)
time.sleep(5)
machine.reset()