from machine import Pin, time_pulse_us, I2C
import time
from lcd_api import LcdApi # Importar librería para manejar el LCD
from i2c_lcd import I2cLcd # Importar librería para manejar el LCD I2C
# Pines para el sensor ultrasónico
TRIG_PIN = 5
ECHO_PIN = 18
# Inicializar el sensor ultrasónico
trig = Pin(TRIG_PIN, Pin.OUT)
echo = Pin(ECHO_PIN, Pin.IN)
# Inicializar el LCD I2C
I2C_ADDR = 0x27 # Dirección del LCD I2C
TOTAL_ROWS = 2
TOTAL_COLS = 16
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000) # Pines SCL y SDA
lcd = I2cLcd(i2c, I2C_ADDR, TOTAL_ROWS, TOTAL_COLS) # Crear objeto LCD
# Configuración de la altura maxima del tanque (en cm)
ALTURA_TANQUE = 100
# Función para medir distancia usando el sensor ultrasónico
def medir_distancia():
trig.off()
time.sleep_us(2)
trig.on()
time.sleep_us(10)
trig.off()
# Medir el tiempo del ECHO
duracion = time_pulse_us(echo, 1)
# Convertir tiempo en distancia (cm)
distancia = (duracion / 2) / 29.1 # Fórmula para convertir microsegundos a cm
return distancia
# Función para monitorear el nivel de agua
def monitor_agua():
while True:
distancia = medir_distancia()
nivel_agua = ALTURA_TANQUE - distancia
# Asegurar que la distancia no sea negativa (caso de error en el sensor)
if nivel_agua < 0:
nivel_agua = 0
# Mostrar en el LCD
lcd.clear()
lcd.putstr("Distancia: {:.2f} cm".format(distancia))
lcd.move_to(0, 1)
lcd.putstr("Nivel: {:.2f} cm".format(nivel_agua))
# Mostrar en el monitor serie
print("Distancia al nivel del agua: {:.2f} cm".format(distancia))
print("Nivel de agua en el tanque: {:.2f} cm".format(nivel_agua))
# Enviar alerta si el nivel de agua es bajo
if nivel_agua < 20: # Ajusta el umbral según tu necesidad
print("Alerta: Nivel de agua bajo!")
lcd.clear()
lcd.putstr("ALERTA: Nivel bajo")
time.sleep(2) # Esperar 2 segundos antes de la siguiente medición
# Ejecutar la función de monitoreo
monitor_agua()