# 'Bebedero para mascota'
# Sensor PIR que detecte la presencia:
# si es positivo por cierto tiempo, se corre el servo (a 90 grados?)
# si es negativo, se vuelve al estado original
import time
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 = 'dulcinea02' #definido en adafruit
password = 'aio_KWoh16klllwfyCnvNWL50isGagnS' #key adafruit
#Indicamos ID(unico) y topicos
client_id = 'bebedero-verano'
topic_PIR = 'dulcinea02/feeds/sensor-pir'
topic_servo = 'dulcinea02/feeds/servo'
topic_rele = 'dulcinea02/feeds/rele'
#Usamos una variable para definir si la alarma esta activa
ABRE_BEBEDERO=False
RELE_ESTADO = Pin(4,Pin.OUT)
#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!")
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_rele(topic, msg):
global PIR_ACTIVA,RELE_ESTADO
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_PIR and "ON" in dato:
ABRE_BEBEDERO=False
else:
ABRE_BEBEDERO=True #de lo contrario y si el PIR está activo, será verdadero
RELE_ESTADO.value(ABRE_BEBEDERO)
#Intentamos conectarnos al broker MQTT
try:
conexionMQTT = MQTTClient(client_id, mqtt_server,user=user,password=password,port=int(port))
conexionMQTT.set_callback(callback_rele)
conexionMQTT.connect()
conexionMQTT.subscribe(topic_PIR)
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()
#Declara cada chirimbolito y su funcion
PIR = Pin(13,Pin.IN)
salida = Pin(4,Pin.OUT)
estadoPIR = PIR.value()
servo = machine.Pin(2)
pwmservo= machine.PWM(servo)
pwmservo.freq(50)
print("Comenzando monitoreo de PIR")
AGUA=False #Estado de la apertura del bebedero
while True:
conexionMQTT.check_msg()
time.sleep_ms(500)
estadoPIRNuevo = PIR.value()
pwmservo.duty(25)
time.sleep(2)
if estadoPIRNuevo:
AGUA=True
salida.value(0)
print("Abrete sesamo")
pwmservo.duty(125)
time.sleep(2)
conexionMQTT.publish(topic_rele,str(0))
if not estadoPIR:
salida.value(1)
conexionMQTT.publish(topic_rele,str(1))
print("Cierrate sesamo")
AGUA=False
else:
AGUA=False
# 08-07-24 16hs. ACTUALMENTE, al prender, el relé va por el normally closed
# Si simulo actividad, el relé (al parecer) se va por el servo
# Supongo que no avanza mucho más porque no configure el servo
# Y tampoco ayuda que saque el try/except para que se actualice el estado PIR
#08-07-24 16hs50min -> deje hasta las 21hs
# El servo se mueve, el led prende pero no estoy segura de que el timesleep vaya bien
# Falta actualizar el estado del PIR y que se retroalimente
# Además, falta agregar la lógica del switch
#08-07-24 21.40hs
# Creo que funciona pero muy manual? el led y el servo van lento
# aunque se sabe que el relé no es muy rápido, me gustaria que cambien a la vez