import time
import dht
import machine
import micropython
import network
from machine import Pin,PWM,I2C
from umqtt.simple import MQTTClient
from lcd_i2c import LCD
#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 = 'WokwiMatias' #definido en adafruit
password = 'aio_QCFe9886fal4wMmAr9Jv8VzDES1l' #key adafruit
#Indicamos ID(unico) y topicos
client_id = 'MiAlarma'
topic_SENSORH = 'WokwiMatias/feeds/SensorHum'
topic_SENSORT = 'WokwiMatias/feeds/SensorTemp'
topic_ALARMA = 'WokwiMatias/feeds/Alarma'
#Usamos una variable para definir si la alarma esta activa
ALARMA_ACTIVA=False
LEDESTADO = Pin(17,Pin.OUT)
sensor= dht.DHT22(Pin(27))
I2C_ADDR = 0x27 # DEC 39, HEX 0x27
i2c = I2C(0, scl=Pin(4), sda=Pin(16), freq=800000)
lcd = LCD(addr=I2C_ADDR, cols=20, rows=4, i2c=i2c)
lcd.begin()
#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)
lcd.print("Conectando")
lcd.set_cursor(col=0, row=1)
while not sta_if.isconnected():
lcd.print(".")
time.sleep(0.2)
lcd.set_cursor(col=0, row=2)
lcd.print("Conectado a Wifi!")
#Vemos cuales son las IP
print(sta_if.ifconfig())
time.sleep(4)
#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)
lcd.clear()
#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)
lcd.set_cursor(col=0, row=0)
lcd.print("Conectado con")
lcd.set_cursor(col=0, row=1)
lcd.print("Broker MQTT")
except OSError as e:
#Si fallo la conexion, reiniciamos todo
lcd.set_cursor(col=0, row=2)
lcd.print("Fallo la conexion al")
lcd.set_cursor(col=0, row=3)
lcd.print ("Broker, reiniciando...")
time.sleep(5)
machine.reset()
time.sleep(4)
lcd.clear()
#Armamos un loop infinito que chequea por mensajes nuevos
#y verifica el estado del PIR
LEDTEMP= Pin(21,Pin.OUT)
LEDHUM= Pin(15,Pin.OUT)
SIRENA = PWM(Pin(5), freq=1200, duty_u16=32768)
SIRENA.duty(0)
lcd.set_cursor(col=0, row=0)
lcd.print("Comenzando monitoreo")
lcd.set_cursor(col=0, row=1)
lcd.print("Del sensor Temp/Hum")
SONANDO=False #Estado de la sirena
sensor.measure()
estadoHum= sensor.humidity()
estadoTemp= sensor.temperature()
time.sleep(4)
lcd.clear()
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(2000)
sensor.measure()
temp= sensor.temperature()
hum= sensor.humidity()
lcd.set_cursor(col=0, row=0)
lcd.print("Temperatura: "+str(temp))
lcd.set_cursor(col=17, row=0)
lcd.print("C")
lcd.set_cursor(col=0, row=2)
lcd.print("Humedad: "+str(hum))
lcd.set_cursor(col=13, row=2)
lcd.print("%")
SONANDO=False
if ALARMA_ACTIVA:
#Y el Sensor detecta cambio
if temp>=60 and hum>=75:
#Entonces tiene que sonar
SONANDO=True
LEDTEMP.value(1)
LEDHUM.value(1)
if not estadoTemp and estadoHum:
#enviamos al server el cambio
print("Sensor de Temperatura y Humedad activo durante estado de alarma activa")
conexionMQTT.publish(topic_SENSORT,str(1))
conexionMQTT.publish(topic_SENSORH,str(1))
else:
#Si el Sensor no detecta cambio pero lo hizo anterior mente
#Entonces notificamos
if estadoTemp and estadoHum:
conexionMQTT.publish(topic_SENSORT,str(0))
conexionMQTT.publish(topic_SENSORH,str(0))
if temp>=60:
#Entonces tiene que sonar
SONANDO=True
LEDTEMP.value(1)
LEDHUM.value(0)
#Si el estado anterior del sensor de temperatura era 0, entonces notificamos
#ya que el sensor estaba apagado y ahora encendido, o sea que acaba
#de detectar un cambio
if not estadoTemp:
#enviamos al server el cambio
print("Sensor de Temperatura activo durante estado de alarma activa")
conexionMQTT.publish(topic_SENSORT,str(1))
else:
#Si el Sensor no detecta cambio pero lo hizo anterior mente
#Entonces notificamos
if estadoTemp:
conexionMQTT.publish(topic_SENSORT,str(0))
if hum>=75:
#Entonces tiene que sonar
SONANDO=True
LEDTEMP.value(0)
LEDHUM.value(1)
#Si el estado anterior del sensor de humedad era 0, entonces notificamos
#ya que el Sensor estaba apagado y ahora encendido, o sea que acaba
#de detectar cambio
if not estadoHum:
#enviamos al server el cambio
print("Sensor de Humedad activo durante estado de alarma activa")
conexionMQTT.publish(topic_SENSORH,str(1))
else:
#Si el sensor no detecta cambio pero lo hizo anterior mente
#Entonces notificamos
if estadoHum:
conexionMQTT.publish(topic_SENSORH,str(0))
else:
#Si la alarma no esta activa, no deberia sonar
SONANDO=False
#Siempre actualizamos el estado del sensor
estadoHum = hum
estadoTemp= temp
if SONANDO:
SIRENA.duty(512)
else:
SIRENA.duty(0)
except OSError as e:
print("Error ",e)
time.sleep(5)
machine.reset()