from machine import I2C, Pin, ADC
from time import sleep
from pico_i2c_lcd import I2cLcd
import time
import utime
# Configuración de LCD y componentes
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
I2C_ADDR = i2c.scan()[0]
lcd = I2cLcd(i2c, I2C_ADDR, 4, 20)
btn_siguiente = Pin(6, Pin.IN, Pin.PULL_UP) # Siguiente (GP6)
btn_anterior = Pin(7, Pin.IN, Pin.PULL_UP) # Anterior (GP7)
btn_led = Pin(8, Pin.IN, Pin.PULL_UP) # Pulsador B1 (GP8)
led1 = Pin(14, Pin.OUT) # LED1 en GP8
led2 = Pin(15, Pin.OUT) # LED2 en GP9
#potenciometro
pot_pin = ADC(Pin(28))
# Lista de mensajes
mensajes = [
"Mensaje 1",
"Mensaje 2",
"Mensaje 3",
"Mensaje 4",
"Voltaje Pot.",
"Reloj"
]
indice = 0
led_estado = 0
def mostrar_menu():
"""Muestra el menú con los mensajes en el LCD de forma vertical."""
lcd.clear()
# Mostrar hasta 4 mensajes en la pantalla
for i in range(4):
# Determinar el índice del mensaje a mostrar
mensaje_index = indice + i
if mensaje_index < len(mensajes):
# Agregar un cursor al mensaje seleccionado
if i == 0: # Mostrar el cursor en el primer mensaje
lcd.putstr("> " + mensajes[mensaje_index] + "\n")
else:
lcd.putstr(" " + mensajes[mensaje_index] + "\n")
else:
lcd.putstr(" \n")
def leer_potenciometro():
"""Lee el valor del potenciómetro y lo muestra en el LCD."""
valor_adc = pot_pin.read_u16() # Leer el valor del ADC (0-65535)
# Convertir el valor ADC a voltaje (0-3.3V)
voltaje = (valor_adc / 65535) * 3.3
# Mostrar el voltaje en el LCD
lcd.clear()
# Mostrar el voltaje en formato vertical
lcd.putstr("V:\n") # Etiqueta
lcd.putstr(f"{voltaje:.2f} V") # Voltaje formateado
sleep(2) # Mantener el voltaje mostrado por 2 segundos
def activar_leds():
"""Alternar el encendido de los LEDs durante 3 segundos."""
global led_estado
if led_estado == 0:
led1.on() # Enciende LED1
led2.off() # Apaga LED2
led_estado = 1 # Cambia el estado a LED2 para la próxima vez
else:
led2.on() # Enciende LED2
led1.off() # Apaga LED1
led_estado = 0 # Cambia el estado a LED1 para la próxima vez
sleep(3) # Mantener el LED encendido durante 3 segundos
led1.off()
led2.off()
def mostrar_reloj():
"""Función para mostrar la hora en el LCD."""
# Obtener la hora actual
h = time.localtime()[3] # Hora
m = time.localtime()[4] # Minutos
s = time.localtime()[5] # Segundos
tiempo_formateado = f"{h:02}:{m:02}:{s:02}"
# Mostrar la hora en el LCD
lcd.clear() # Limpiar la pantalla
lcd.putstr(tiempo_formateado) # Mostrar la hora
def main():
global indice
mostrar_menu() # Mostrar el menú al iniciar
while True:
# Verifica si el botón "Siguiente" ha sido presionado
if not btn_siguiente.value(): # Botón de siguiente presionado
if indice < len(mensajes) - 1: # Si no está al final de la lista
indice += 1 # Avanza al siguiente mensaje
else:
indice = 0 # Resetea al principio si está al final
mostrar_menu() # Actualiza la pantalla con el nuevo mensaje
time.sleep(0.3) # Espera para evitar rebotes
# Verifica si el botón "Anterior" ha sido presionado
elif not btn_anterior.value(): # Botón de anterior presionado
if indice > 0: # Si no está al principio de la lista
indice -= 1 # Retrocede al mensaje anterior
else:
indice = len(mensajes) - 1 # Resetea al final si está al principio
mostrar_menu() # Actualiza la pantalla con el nuevo mensaje
time.sleep(0.3) # Espera para evitar rebotes
# Verifica si el botón LED ha sido presionado
elif not btn_led.value(): # Botón de LED presionado
activar_leds() # Activa los LEDs
time.sleep(0.3) # Espera para evitar rebotes
# Leer el potenciómetro y mostrar el voltaje si la opción de voltaje está seleccionada
if indice == len(mensajes) - 2: # Si se ha seleccionado la opción "Voltaje Potenciometro"
leer_potenciometro() # Llama a la función de lectura del potenciómetro
# Mostrar la hora si la opción "Reloj" está seleccionada
if indice == len(mensajes) - 1: # Si se ha seleccionado la opción "Reloj"
mostrar_reloj() # Llama a la función de mostrar la hora
sleep(1)
# Ejecutar la función principal
if __name__ == "__main__":
main()