import machine, time, hcsr04
from machine import Pin, PWM
from utime import sleep
from hcsr04 import HCSR04
from umqtt.simple import MQTTClient
sensor = HCSR04(trigger_pin = 12, echo_pin = 14)
buzzer = PWM(Pin(13), freq = 1, duty = 512)
led = Pin(15, Pin.OUT)
ALARMA = False
print("Hello, ESP32!")
do = 523
re = 587
mi = 659
fa = 698
sol = 783
la = 880
si = 987
sol_sostenido = 830
fa_sostenido = 740
la_sostenido = 932
do_alto = 1046
re_alto = 1175
pause = 1
melodia = [
mi, mi, mi, do, sol, mi, do, sol, mi,
si, si, si, do, sol, re_alto, do, sol, mi,
mi, mi, mi, mi, re_alto, re, do_alto, do, do_alto,
fa, la_sostenido, la, sol_sostenido, sol, fa_sostenido, sol,
do, re_alto, do, re_alto, sol, mi, sol, si,
mi, mi, mi, mi, re_alto, re, do_alto, do, do_alto,
fa, la_sostenido, la, sol_sostenido, sol, fa_sostenido, sol,
do, re_alto, do, sol, mi, do, sol, mi
]#marcha imperial
duracion_notas = [300] * len(melodia)
def sonido(freq, duracion):
buzzer.freq(freq)
buzzer.duty(512)
time.sleep_ms(duracion)
buzzer.duty(0)
time.sleep_ms(50)
#--------------MQTT----------------------
import network
ssid = 'Wokwi-GUEST'
wifipassword = ''
#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 cuáles son las IP
print(sta_if.ifconfig())
mqtt_server = 'io.adafruit.com'
port = 1883
user = 'Sancruje' #definido en adafruit
password = 'aio_HziQ61IMUEP2d1as3oc2dNqFmt0q' #key adafruit
client_id = 'Alarma-aprox-inador' #debe ser único!
topic_1 = 'Sancruje/feeds/Sensor'
topic_2 = 'Sancruje/feeds/Buzzer'
def funcion_callback(topic, msg):
#completamos con la lógica que debe ejecutarse cuando se reciben mensajes del broker
#OJO que los argumentos topic y msg vienen codificados en UTF-8, por ende hay que convertirlos a string.
dato = msg.decode('utf-8')
topicrec = topic.decode('utf-8')
print("Mensaje en tópico "+topicrec+":"+dato)
if topicrec == topic_1 and "OFF" in dato:
ALARMA = False
else:
ALARMA = True
led.value(ALARMA)
#Hacemos algo util.
#Intentamos conectarnos al broker MQTT
try:
conexionMQTT = MQTTClient(client_id, mqtt_server,user=user,password=password,port=int(port))
conexionMQTT.set_callback(funcion_callback) #Funcion Callback para recibir del broker mensajes
conexionMQTT.connect() #Hacemos la conexión.
conexionMQTT.subscribe(topic_1) #Nos suscribimos a un tópico luego del connect
print("Conectado con Broker MQTT")
except OSError as e:
#Si falló la conexión, reiniciamos todo
print("Fallo la conexion al Broker, reiniciando...")
time.sleep(5)
machine.reset()
while True:
#Si se produce una excepción, por ejemplo se corta el wifi
#o perdemos la conexión MQTT, simplemente vamos a reiniciar
#el micro para que comience la secuencia nuevamente, así 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)
#Si queremos publicar algo podemos usar la función publish…
#conexionMQTT.publish(topic_2,"Mensaje a enviar al broker…")
distance = sensor.distance_cm()
print("Distancia: ", distance, "cm.")
if distance < 300:
for nota, duracion in zip(melodia, duracion_notas):
sonido(nota, duracion)
else:
sonido(pause, 1)
except OSError as e:
print("Error ",e)
time.sleep(5)
machine.reset()
#---------------PROGRAMA-------------------