#Fundamentos de sistemas embebidos
#Azarola Santino 45219619
#Pandolfini Belén 43669665
#12/07/2024
#UNLaM
import time
import dht
import machine
import micropython
import network
from machine import Pin,PWM
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 = 'SantinoAzarola' #definido en adafruit
password = 'aio_nmwL42gmxr7aFk7JMkoCuwfJYCSg' #key adafruit
#Indicamos ID(unico) y topicos
client_id = 'MainDashboard'
topic_START = 'SantinoAzarola/feeds/Encendido'
topic_ALARMA = 'SantinoAzarola/feeds/EstadoAlarma'
topic_CALTO = 'SantinoAzarola/feeds/ColorAlto'
topic_CMEDIO = 'SantinoAzarola/feeds/ColorMedio'
topic_CBAJO = 'SantinoAzarola/feeds/ColorBajo'
topic_TEMP = 'SantinoAzarola/feeds/Temperatura'
#Usamos una variable para definir si la alarma esta activa
DefaultBajo = (0,0,255)
DefaultMedio = (0,255,0)
DefaultAlto = (255,0,0)
BajoR, BajoG, BajoB = DefaultBajo
MedioR, MedioG, MedioB = DefaultMedio
AltoR, AltoG, AltoB = DefaultAlto
tempAnt=500
SISTEMA_ACTIVO=False
pwm_pins = [15,0,2]
pwms = [PWM(Pin(pwm_pins[0])),PWM(pwm_pins[1]),PWM(Pin(pwm_pins[2]))]
[pwm.freq(1000) for pwm in pwms]
#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 SISTEMA_ACTIVO,AltoR,AltoG,AltoB,MedioR,MedioG,MedioB,BajoR,BajoG,BajoB
#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_START and "ON" in dato:
SISTEMA_ACTIVO=True
elif topicrec == topic_START and "OFF" in dato:
SISTEMA_ACTIVO=False
if SISTEMA_ACTIVO:
if "ON" in dato:
print("Sistema activado!")
else:
RGB = tuple(int(dato.lstrip('#')[i:i+2], 16) for i in (0, 2, 4))
if topicrec == topic_CALTO:
AltoR, AltoG, AltoB = RGB
elif topicrec == topic_CMEDIO:
MedioR, MedioG, MedioB = RGB
elif topicrec == topic_CBAJO:
BajoR, BajoG, BajoB = RGB
def cambiarColor(red, green, blue):
pwms[0].duty_u16(map_range(red, 0, 255, 0, 65535))
pwms[1].duty_u16(map_range(green, 0, 255, 0, 65535))
pwms[2].duty_u16(map_range(blue, 0, 255, 0, 65535))
def map_range(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
#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_START)
conexionMQTT.subscribe(topic_CBAJO)
conexionMQTT.subscribe(topic_CMEDIO)
conexionMQTT.subscribe(topic_CALTO)
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()
#Armamos un loop infinito que chequea por mensajes nuevos
#y verifica el estado del PIR
sensor = dht.DHT22(Pin(13))
SIRENA = PWM(Pin(5), freq=1200, duty_u16=32768)
SIRENA.duty(0)
print("Comenzando monitoreo de temperatura")
SONANDO=False #Estado de la sirena
while True:
#Si se produce una excepcion, por ejemplo se corta el wifi
#o perdemos la conexion MQTT, simplemente vamos a reiniciar
#el micro para que comience la secuencia nuevamente, asi que
#usamos un bloque Try+Except
try:
#Tenemos que verificar si hay mensajes nuevos publicados por el broker
conexionMQTT.check_msg()
time.sleep_ms(500)
#actualizamos el sensor
sensor.measure()
temp = sensor.temperature()
#Si la ALARMA esta activa...
if SISTEMA_ACTIVO:
if temp != tempAnt:
if temp < 8:
print("Temperatura Baja")
SONANDO=False
conexionMQTT.publish(topic_ALARMA,str(0))
conexionMQTT.publish(topic_TEMP,str(temp))
cambiarColor(BajoR, BajoG, BajoB)
tempAnt = temp
elif temp < 27:
print("Temperatura Media")
SONANDO=False
conexionMQTT.publish(topic_ALARMA,str(0))
conexionMQTT.publish(topic_TEMP,str(temp))
cambiarColor(MedioR, MedioG, MedioB)
tempAnt = temp
elif temp < 38:
print("Temperatura Alta")
SONANDO=False
conexionMQTT.publish(topic_ALARMA,str(0))
conexionMQTT.publish(topic_TEMP,str(temp))
cambiarColor(AltoR, AltoG, AltoB)
tempAnt = temp
else:
print("ALERTA! TEMPERATURA MUY ALTA")
SONANDO=True
conexionMQTT.publish(topic_ALARMA,str(2))
conexionMQTT.publish(topic_TEMP,str(temp))
cambiarColor(AltoR, AltoG, AltoB)
tempAnt = temp
else:
print("El sistema no esta activo")
pwms[0].duty_u16(map_range(0, 0, 255, 0, 65535))
pwms[1].duty_u16(map_range(0, 0, 255, 0, 65535))
pwms[2].duty_u16(map_range(0, 0, 255, 0, 65535))
#Siempre actualizamos el estado del PIR
if SONANDO:
SIRENA.duty(512)
time.sleep_ms(500)
else:
SIRENA.duty(0)
except OSError as e:
print("Error ",e)
time.sleep(5)
machine.reset()