from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
from rotary_irq_rp2 import RotaryIRQ
import time
WIDTH = 128
HEIGTH = 64
rotary = RotaryIRQ(14, 15)
btn = Pin(11, Pin.IN)
i2c = I2C(0, scl=Pin(13), sda=Pin(12), freq=200000)
oled = SSD1306_I2C(WIDTH, HEIGTH, i2c)
# Menus
main_menu = ["Arriba", "Centro", "Abajo"]
sub_menu_arriba = ["Sub Arriba 1", "Sub Arriba 2", "Salir"]
sub_menu_centro = ["Sub Centro 1", "Sub Centro 2", "Salir"]
sub_menu_abajo = ["Sub Abajo 1", "Sub Abajo 2", "Salir"]
# Nuevos submenús para las opciones de cada submenú
sub_menu_arriba_1 = ["Sub Arriba 1.1", "Sub Arriba 1.2", "Salir"]
sub_menu_arriba_2 = ["Sub Arriba 2.1", "Sub Arriba 2.2", "Salir"]
sub_menu_centro_1 = ["Sub Centro 1.1", "Sub Centro 1.2", "Salir"]
sub_menu_centro_2 = ["Sub Centro 2.1", "Sub Centro 2.2", "Salir"]
sub_menu_abajo_1 = ["Sub Abajo 1.1", "Sub Abajo 1.2", "Salir"]
sub_menu_abajo_2 = ["Sub Abajo 2.1", "Sub Abajo 2.2", "Salir"]
current_menu = main_menu
current_val = rotary.value() # Inicializar con el valor actual del encoder
current_option = 0
menu_stack = [] # Pila para mantener el historial de menús
def draw_menu():
oled.fill(0)
for i, item in enumerate(current_menu):
if i == current_option:
oled.text("> " + item, 0, 8 + i * 10)
else:
oled.text(" " + item, 0, 8 + i * 10)
oled.show()
draw_menu() # Mostrar el menú inicial
while True:
new_val = rotary.value() # Obtener el valor actual del encoder
if btn.value() == 0: # Si se presiona el botón
if current_menu == main_menu:
if current_option == 0:
menu_stack.append(current_menu)
current_menu = sub_menu_arriba
elif current_option == 1:
menu_stack.append(current_menu)
current_menu = sub_menu_centro
elif current_option == 2:
menu_stack.append(current_menu)
current_menu = sub_menu_abajo
else:
if current_option == len(current_menu) - 1: # Opción "Salir"
current_menu = menu_stack.pop() if menu_stack else main_menu
else:
menu_stack.append(current_menu)
if current_menu == sub_menu_arriba:
if current_option == 0:
current_menu = sub_menu_arriba_1
elif current_option == 1:
current_menu = sub_menu_arriba_2
elif current_menu == sub_menu_centro:
if current_option == 0:
current_menu = sub_menu_centro_1
elif current_option == 1:
current_menu = sub_menu_centro_2
elif current_menu == sub_menu_abajo:
if current_option == 0:
current_menu = sub_menu_abajo_1
elif current_option == 1:
current_menu = sub_menu_abajo_2
elif current_menu in [sub_menu_arriba_1, sub_menu_arriba_2,
sub_menu_centro_1, sub_menu_centro_2,
sub_menu_abajo_1, sub_menu_abajo_2]:
# Si estamos en un sub-submenú y seleccionamos "Salir"
if current_option == len(current_menu) - 1:
current_menu = menu_stack.pop()
current_val = 0 # Restablecer el valor del encoder al cambiar de menú
rotary.reset()
time.sleep_ms(250) # Pequeña pausa para evitar rebotes
draw_menu() # Dibujar el nuevo menú
if new_val != current_val: # Si el valor del encoder ha cambiado
current_val = new_val
current_option = current_val % len(current_menu) # Mantener la opción dentro del rango
draw_menu() # Redibujar el menú