# -------------------------
# 3 LCD + 3 Sensores (Pico / MicroPython)
# -------------------------
from machine import Pin, I2C, SoftI2C, time_pulse_us
from time import sleep, sleep_us
from pico_i2c_lcd import I2cLcd
# -------------------------
# I2C LCD 1 (Hardware I2C0) -> GP0/GP1
# -------------------------
i2c0 = I2C(0, sda=Pin(0), scl=Pin(1), freq=100000)
addrs0 = i2c0.scan()
if not addrs0:
raise RuntimeError("No se detecta LCD en I2C0 (SDA=GP0, SCL=GP1).")
I2C_ADDR0 = addrs0[0]
lcd1 = I2cLcd(i2c0, I2C_ADDR0, 2, 16)
# -------------------------
# I2C LCD 2 (Hardware I2C1) -> GP18/GP19
# -------------------------
i2c1 = I2C(1, sda=Pin(18), scl=Pin(19), freq=100000)
addrs1 = i2c1.scan()
if not addrs1:
raise RuntimeError("No se detecta LCD en I2C1 (SDA=GP18, SCL=GP19).")
I2C_ADDR1 = addrs1[0]
lcd2 = I2cLcd(i2c1, I2C_ADDR1, 2, 16)
# -------------------------
# I2C LCD 3 (SoftI2C) -> GP20/GP21
# -------------------------
i2c2 = SoftI2C(sda=Pin(20), scl=Pin(21), freq=100000)
addrs2 = i2c2.scan()
if not addrs2:
raise RuntimeError("No se detecta LCD en SoftI2C (SDA=GP20, SCL=GP21).")
I2C_ADDR2 = addrs2[0]
lcd3 = I2cLcd(i2c2, I2C_ADDR2, 2, 16)
# -------------------------
# Sensores ultrasónicos
# -------------------------
TRIG1 = Pin(7, Pin.OUT)
ECHO1 = Pin(6, Pin.IN)
TRIG2 = Pin(11, Pin.OUT)
ECHO2 = Pin(10, Pin.IN)
TRIG3 = Pin(9, Pin.OUT)
ECHO3 = Pin(8, Pin.IN)
def medir_distancia(trig: Pin, echo: Pin, timeout_us=30000):
# Pulso de disparo (TRIG)
trig.low()
sleep_us(2)
trig.high()
sleep_us(10)
trig.low()
# Medir pulso en ECHO (en microsegundos)
dur = time_pulse_us(echo, 1, timeout_us)
# dur < 0 = timeout (sin eco)
if dur < 0:
return None
# Distancia en cm (velocidad sonido ≈ 0.0343 cm/us)
dist_cm = (dur * 0.0343) / 2
return dist_cm
def mostrar(lcd, titulo, dist):
lcd.clear()
lcd.putstr(titulo + "\n")
if dist is None:
lcd.putstr("Sin eco")
else:
lcd.putstr("{:0.1f} cm".format(dist))
# Títulos por pantalla
tit1 = "Nivel S1:"
tit2 = "Nivel S2:"
tit3 = "Nivel S3:"
# -------------------------
# Loop principal
# -------------------------
while True:
# Medimos de a uno para evitar interferencia (cross-talk)
d1 = medir_distancia(TRIG1, ECHO1)
sleep(0.07)
d2 = medir_distancia(TRIG2, ECHO2)
sleep(0.07)
d3 = medir_distancia(TRIG3, ECHO3)
sleep(0.07)
# Mostrar en LCDs
mostrar(lcd1, tit1, d1)
mostrar(lcd2, tit2, d2)
mostrar(lcd3, tit3, d3)
# Consola
print("S1:", d1 if d1 is not None else "Sin eco", "cm |",
"S2:", d2 if d2 is not None else "Sin eco", "cm |",
"S3:", d3 if d3 is not None else "Sin eco", "cm")
sleep(0.2)