# Importe de librerías para el código
from machine import Pin
from HC1SR04 import HCSR04
import time
from umqtt.simple import MQTTClient
import network
print("Hola, ESP32 de mi vida")
# Declaración de pines del HCSR04 y del buzzer
Sensor = HCSR04(trigger_pin = 21, echo_pin = 19)
Buzz = Pin(23, Pin.OUT)
# Declaración de pines de los lEDs y el boton
LedR = Pin(2, Pin.OUT)
LedV = Pin(15, Pin.OUT)
Boton = Pin(5, Pin.IN,Pin.PULL_UP)
# Declaración de variables
Estado_Alarma = False
Estado_Buzzer = False
# Configuración de conexión a Internet
ssid = "Wokwi-GUEST"
wifipassword = ""
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
# Conexión a Internet
sta_if.connect(ssid, wifipassword)
print("Conectando...")
while not sta_if.isconnected():
print(".", end = "")
time.sleep(0.1)
print("")
print("Conectado a Internet")
# Configuración de conexión al servidor MQTT
mqtt_server = "io.adafruit.com"
port = 1883
user = "JuarezCajal"
password = "aio_fFBY2325Vzlq6I15GZrMY05ng0fu"
client_id_gauge = "esp32miamor"
Alarma_Distancia = "JuarezCajal/feeds/alarma-distancia"
Alarma_Encendido = "JuarezCajal/feeds/alarma-encendido"
Alarma_Sonido = "JuarezCajal/feeds/alarma-sonido"
# Conexión al servidor MQTT
try:
conexionMQTT = MQTTClient(client_id_gauge, mqtt_server, user = user, password = password, port = int(port))
conexionMQTT.connect()
print("Conectado con Broker MQTT")
except OSError as e:
print("Fallo la conexión al Broker, reiniciando...")
time.sleep(5)
machine.reset()
# Función para enviar mensaje a la cola del servidor
def Enviar_Mensaje(topico, mensaje):
try:
conexionMQTT.publish(topico, str(mensaje))
print(f"Número enviado: {mensaje}")
except OSError as e:
print("Error", e)
time.sleep(5)
machine.reset()
# Función de lectura de botón de encendido
def Encendido(boton, estado):
if boton.value() == 0:
while boton.value() == 0:
time.sleep_ms(25)
estado = not estado
return estado
# Función que oscila el buzzer en base a la distancia captada
def Encendido_Buzz():
estado = False
while True:
estado = not estado
Buzz.value(estado)
LedV.value(estado)
for i in range(20):
time.sleep_ms(25)
# Sale de la función si se apaga el sistema
# o si la distancia sobrepasa el límite.
if Encendido(Boton, Estado_Alarma) == False:
return False
if Sensor.distance_cm() > Distancia_Limite:
return True
# El usuario debe ingresar el valor mínimo de lectura del sensor
# para activar el buzzer en caso de estar la alarma ON
Distancia_Limite = float(input("Ingrese la distancia mínima del sensor en cm\n"))
Enviar_Mensaje(Alarma_Distancia, Distancia_Limite)
while True: # Bucle de funcionamiento continuo
Enviar_Mensaje(Alarma_Encendido, Estado_Alarma)
# Cuando la alarma está apagada, apago todo y espera el botón de encendido
while Estado_Alarma == False:
time.sleep_ms(25)
LedR.value(False)
LedV.value(False)
Buzz.value(False)
Estado_Alarma = Encendido(Boton, Estado_Alarma)
Enviar_Mensaje(Alarma_Encendido, Estado_Alarma)
# Cuando está prendida, espera a ser apagada y lee la distancia del sensor
while Estado_Alarma == True:
time.sleep_ms(25)
LedR.value(True) # Prende LED indicador de encendido (rojo)
Estado_Alarma = Encendido(Boton, Estado_Alarma)
# Revisa si la lectura dió menor al límite, y entra en la función del buzzer
if Sensor.distance_cm() < Distancia_Limite:
Enviar_Mensaje(Alarma_Sonido, True)
Estado_Alarma = Encendido_Buzz()
Enviar_Mensaje(Alarma_Sonido, False)
# En caso que la distancia sea mayor, mantiene apagado el buzzer y el LED
else:
Buzz.value(False)
LedV.value(False)