from machine import Pin, I2C, ADC
import utime
from ssd1306 import SSD1306_I2C
import framebuf
# Configuración del I2C para la pantalla OLED
i2c = I2C(0, scl=Pin(32), sda=Pin(33))
# Inicialización del OLED
oled = SSD1306_I2C(128, 64, i2c)
# Configuración de los pines
led = Pin(14, Pin.OUT)
button_red = Pin(34, Pin.IN, Pin.PULL_UP)
button_green = Pin(35, Pin.IN, Pin.PULL_UP)
potX = ADC(Pin(26))
potY = ADC(Pin(27))
def buscar_icono(ruta):
dibujo = open(ruta, "rb") # Abrir en modo lectura binaria
dibujo.readline() # Método para ubicarnos en la segunda línea
xy = dibujo.readline() # Ubicarnos en la tercera línea
x = int(xy.split()[0]) # split devuelve una lista con las coordenadas
y = int(xy.split()[1])
icono = bytearray(dibujo.read()) # Guardar el contenido en un array de bytes
dibujo.close()
return framebuf.FrameBuffer(icono, x, y, framebuf.MONO_HLSB)
def display_message(message, row, col, size=1):
oled.text(message, col, row)
oled.show()
def update_menu():
oled.fill(0)
display_message("Menu:", 0, 0)
display_message(menu_states[current_state], 1, 3)
def status_change(estado):
global cursor_choices
if estado == 0:
cursor_choices = []
elif estado == 1:
cursor_choices = [1, 10]
oled.fill(0)
return estado
oled.blit(buscar_icono("lukelogo.txt"),0,0)
oled.show()
utime.sleep(3)
# Definición del menú
menu = ["Inicio", "Configuración", "Acerca de", "Salir"]
menu_index = 0
# Función para mostrar el menú
def display_menu():
oled.fill(0) # Limpiar la pantalla
for i, item in enumerate(menu):
if i == menu_index:
oled.text("> " + item, 0, i * 10) # Resaltar el elemento seleccionado
else:
oled.text(item, 10, i * 10)
oled.show()
# Funciones para navegar en el menú
def next_item():
global menu_index
menu_index = (menu_index + 1) % len(menu)
display_menu()
def prev_item():
global menu_index
menu_index = (menu_index - 1) % len(menu)
display_menu()
# Mostrar el menú inicial
display_menu()
# Configuración del ADC para el potenciómetro
adc = ADC(Pin(26)) # Ajusta el pin ADC según tu placa
adc.atten(ADC.ATTN_11DB) # Para ESP32, ajusta el rango de lectura
# Bucle principal (simulación de botones con retrasos)
while True:
adc_value = adc.read() # Leer el valor del potenciómetro
# Mapear el valor del potenciómetro al índice del menú
new_menu_index = int(adc_value / 4095 * (len(menu) - 1))
if new_menu_index != menu_index:
menu_index = new_menu_index
display_menu()
utime.sleep(0.1)
'''
def interfaz(cursor):
global estado
if estado == 0:
oled.fill(0)
display_message("Welcome to", 0, 2,1)
display_message("Luke's Gardens", 7, 0,1)
oled.show()
#utime.sleep(10)
#estado = status_change(1)
#elif estado == 1:
# print(estado)
# oled.fill(0)
# display_message("+--Luke's Gardens--+", 0, 0, size=1)
# display_message("Huerta", 8, 16, size=2)
# display_message("Arboles", 80, 16, size=2)
# cursor_choices = [8, 80]
# display_message("*", cursor_choices[cursor], 16, size=2)
# oled.show()
# Estado inicial de los botones
button_cancel = 1
button_accept = 1
# Variables de estado
menu_states = ["Estado 1", "Estado 2", "Estado 3"]
current_state = 0
cursor_choices = []
cursor = 0
estado = 0
#interfaz(cursor)
while True:
button_cancel = button_red.value()
button_accept = button_green.value()
x_val = potX.read_u16()
y_val = potY.read_u16()
prev_cursor = cursor
if x_val < 1000: # Mover hacia la izquierda
cursor = cursor - 1
utime.sleep(0.2) # Debouncing
elif x_val > 40000: # Mover hacia la derecha
cursor = cursor + 1
utime.sleep(0.2) # Debouncing
if button_cancel == 0: # Botón de cancelar presionado
utime.sleep(1)
if button_accept == 0: # Botón de aceptar presionado
utime.sleep(1)
if cursor < 0:
cursor = 0
elif cursor >= len(cursor_choices):
cursor = len(cursor_choices) - 1
interfaz(cursor)
#oled.fill(0)
#display_message("welcome", 0, 0, 1)
utime.sleep(0.1)
'''