import time
import machine
import micropython
import network
from machine import Pin,PWM,ADC
from umqtt.simple import MQTTClient
#Sistema IoT de monitoreo para Bebés, incluye un sensor de movimiento
#y un sensor de sonido (Potenciometro) que monitorean la actividad de un bebé en su cuna.
#Cuando se detecta movimiento o llanto, el sistema envía una notificación
#al celular de los padres y a través de un dashboard se puede activar un buzzer
#que reproduce una canción de cuna.
#Datos de conexion:
ssid = 'Wokwi-GUEST'
wifipassword = ''
#Datos del Broker
mqtt_server = 'io.adafruit.com'
port = 1883
user = 'FacuzZ'
password = 'aio_AyWO329nSpLmYIPv5dSSLF4mwJeV'
#ID y topicos
client_id = 'ControlCuna'
topic_SensorMov = 'FacuzZ/feeds/sensormovimiento'
topic_SensorSoni = 'FacuzZ/feeds/sensorsonido'
topic_Parlante = 'FacuzZ/feeds/parlante'
topic_Prender = 'FacuzZ/feeds/activar-slash-desactivar'
#Variables que indican el estado del topico
Monit_Activo=False
Parlante_Activo=False
#LEDS Indicadores
LEDGLOBAL = Pin(7,Pin.OUT)
LEDESTADO_Soni = Pin(0,Pin.OUT)
LEDESTADO_Movi = Pin(2,Pin.OUT)
#Variables parlante
Parlante = PWM(Pin(5)) #Variable de donde sacamos señal del parlante
Parlante.duty(0) #Inicializado en 0
#Definimos modo Station
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())
#Funcion definida para recibir y decodificar el encendido y apagado del monitor y parlante
def callback_global(topic, msg):
global Monit_Activo, LEDGLOBAL, Parlante_Activo #variables que cambian en todo el codigo
dato = msg.decode('utf-8')
topicrec = topic.decode('utf-8')
print("Cambio en: " + topicrec + ":" + dato)
if topicrec == topic_Prender: #Si el topico recibido es el de prender
if "OFF" in dato: #y está apagado entonces el sistema está apagado
Monit_Activo = False
else:
Monit_Activo = True #Sino significa que el topico está en ON y se prende el sistema
LEDGLOBAL.value(Monit_Activo)
if topicrec == topic_Parlante: #Si el topico recibido es el del parlante
if Monit_Activo and "UNO" in dato: #Y el sistema está prendido y el topico del parlante tambien
Parlante_Activo = True #Entonces se prende el parlante
print("Parlante activo")
else:
Parlante_Activo = False
#Intentamos conectarnos al broker MQTT
try:
conexionMQTT = MQTTClient(client_id, mqtt_server,user=user,password=password,port=int(port))
conexionMQTT.set_callback(callback_global)
conexionMQTT.connect()
conexionMQTT.subscribe(topic_Prender)
conexionMQTT.subscribe(topic_Parlante)
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()
#Diccionario con las notas y frecuencias de la cancion
notas = {
'E4': 329.63, #MI
'A4': 440.00, #LA
'E5': 659.26, #MI\
'D5': 587.33, #RE\
'C5': 523.25, #DO\
'B4': 493.88, #SI
'G4': 392.00, #SOL
}
#Melodia de la cancion
Cancion = [
'E4', 'E4', 'A4', 'E5', 'D5', 'C5', 'D5',
'A4', 'B4', 'C5', 'C5', 'D5', 'C5', 'B4',
'E4', 'E4', 'A4', 'E5', 'D5', 'C5', 'D5',
'A4', 'B4', 'C5', 'C5', 'B4', 'A4', 'G4', 'A4',
]
#Duraciones en segundos de cada nota
Duraciones = [
0.3, 0.3, 1.2, 0.3, 0.3, 0.3, 1.2,
0.3, 0.3, 1.2, 0.3, 0.3, 0.3, 1.2,
0.3, 0.3, 1.2, 0.3, 0.3, 0.3, 1.2,
0.3, 0.3, 1.0, 0.3, 0.6, 0.3, 0.3, 1.2,
]
SENSORPIR = Pin(1,Pin.IN) #Variable de donde sacamos señal del PIR
estadoPIR = SENSORPIR.value() #Variable de donde sacamos el valor del PIR
pot = ADC(Pin(3)) #Variable de donde sacamos señal del Potenciometro, que simula la señal del microfono
estadopot = pot.read() #Variable de donde sacamos el valor del Potenciometro
#Armamos un loop infinito que chequea por mensajes nuevos
#y verifica el estado del Sensor de movimiento, sensor de sonido y el parlante
print("Comenzando monitoreo")
while True:
time.sleep(1)
#Si el sistema esta activo
try:
#Tenemos que verificar si hay mensajes nuevos publicados por el broker
conexionMQTT.check_msg()
time.sleep_ms(500)
#Definiciones de estados actuales de los sensores y LEDS
estadoPIRNuevo = SENSORPIR.value()
estadoPOTnuevo = pot.read()
LEDESTADO_Soni.value(estadoPOTnuevo>2050)
LEDESTADO_Movi.value(estadoPIRNuevo)
#Sistema de monitoreo
if Monit_Activo:
#Sensor de sonido
if estadoPOTnuevo > 2050:
#Si el sensor supera el limite establecido "50%"(simulado con el potenciometro)
#Y antes no se detecto sonido
if estadopot <= 2050:
#enviamos al server el cambio
print("Hay sonido")
conexionMQTT.publish(topic_SensorSoni,str(1))
else:
#Si el sensor ya no detecta sonido y antes si lo detecto
#Entonces notificamos
if estadopot > 2050:
print("Silencio")
conexionMQTT.publish(topic_SensorSoni,str(0))
#Sensor de movimiento
if estadoPIRNuevo:
#Si el sensor detecta un movimiento
#Y antes no se detecto
if not estadoPIR:
#enviamos al server el cambio
print("Movimiento detectado")
conexionMQTT.publish(topic_SensorMov,str(1))
else:
#Si el sensor ya no detecta movimiento y antes si lo detecto
#Entonces notificamos
if estadoPIR:
conexionMQTT.publish(topic_SensorMov,str(0))
print("Sin movimiento detectado")
#Parlante
if Parlante_Activo: #Si el topico del parlante esta activo
for i in range(0,30): #el for recorre cada nota de la lista
nota = Cancion[i]
duracion = Duraciones[i]
print("sonando", i)
if nota in notas:
frecuencia = notas[nota]
Parlante.freq(int(frecuencia))
Parlante.duty(512) # 50% ciclo de trabajo
time.sleep(duracion) #marca la duracion de cada nota
Parlante.duty(0) # apagar el parlante entre cada nota
if i < len(Cancion) - 1: #controla el tiempo de espera entre notas especificas
nota_sig = Cancion[i + 1]
if nota == 'A4' and nota_sig == 'E5':
time.sleep(0.2)
else:
if nota == 'D5' and nota_sig == 'A4':
time.sleep(0.2)
else:
time.sleep(0.06)
#Actualizacion de los estados
estadoPIR = estadoPIRNuevo
estadopot = estadoPOTnuevo
except OSError as e:
print("Error ",e)
time.sleep(5)
machine.reset()