from machine import Pin, I2C
from os import listdir
from ssd1306 import SSD1306_I2C
from time import sleep
#---[ VARIABLES para I2C ]---
id = 0
sda = Pin(8)
scl = Pin(9)
i2c = I2C(id=id, scl=scl, sda=sda)
#---[ VARIABLES para la PANTALLITA ]---
ancho = 128
alto = 64
linea = 1
resaltar = 1
recorrer = 0
longitud_lista = 0
lineas_totales = 6
#---[ CREACIÓN del OBJETO e INICIALIZACIÓN ]---
oled = SSD1306_I2C(width=ancho, height=alto, i2c=i2c)
oled.init_display()
#---[ ELEMENTOS del ENCODIFICADOR ROTATIVO ]---
SW = Pin(16, Pin.IN, Pin.PULL_UP)
DT = Pin(17, Pin.IN, Pin.PULL_UP)
CLK = Pin(18, Pin.IN, Pin.PULL_UP)
#---[ PARA la REFERENCIA del ENCODER y BOTÓN ]---
valor_previo = True
interruptor_oprimido = False
def obtener_archivos():
""" Para obtener una lista de archivos ejecutables en el directorio raíz """
files = listdir() # Obtención del listado de todos los archivos
menu = [] # Lista a llenar
for file in files: # Para todos los archivos leídos...
if file.endswith(".py"): #... si tienen extensión*.py
menu.append(file) # Agrégalos a la lista
return(menu)
def muestra_menu(menu):
""" Muestra el menú en la pantalla (ver ejercicio)"""
# Variables globales a utilizar
global linea, resaltar, recorrer, longitud_lista
# Variables del menú
item = 1
linea = 1
altura_linea = 10
# Limpieza del display
oled.fill_rect(0,0,ancho,alto,0)
# Corrimiento de la lista de archivos para mostrarlos en pantallita
longitud_lista = len(menu)
lista_corta = menu[recorrer:recorrer+lineas_totales]
for item in lista_corta:
if resaltar == linea:
oled.fill_rect(0,(linea-1)*altura_linea, ancho,altura_linea,1)
oled.text(">",0, (linea-1)*altura_linea,0)
oled.text(item, 10, (linea-1)*altura_linea,0)
oled.show()
else:
oled.text(item, 10, (linea-1)*altura_linea,1)
oled.show()
linea += 1
oled.show()
def ejecutar(filename):
item = 1
altura_linea = 10
""" Ejecución del archivo python seleccionado <filename> """
# Limpieza de la pantallita
oled.fill_rect(0,0,ancho,alto,0)
oled.text("Ejecutando", 1, 10)
oled.fill_rect(0,(linea-2)*altura_linea, ancho,altura_linea,1)
oled.text("> Escape", 0, (linea-2)*altura_linea,0)
oled.show()
oled.text(filename,1, 20)
oled.show()
# Obtención de la lista de archivos python y despliegue del menú
lista_archivos = obtener_archivos()
muestra_menu(lista_archivos)
#---------------------------------------------------------------------------
# Ciclo repetitivo eterno
while True:
# Lectura de cambio de posición en "encoder rotativo"
if valor_previo != CLK.value():
if CLK.value() == False:
# Vuelta a la izquierda del encoder
if DT.value() == False:
if resaltar > 1:
resaltar -= 1
else:
if recorrer > 0:
recorrer -= 1
# Vuelta a la derecha del encoder
else:
if resaltar < lineas_totales:
resaltar += 1
else:
if recorrer+lineas_totales < longitud_lista:
recorrer += 1
muestra_menu(lista_archivos)
valor_previo = CLK.value()
# Verificación de haber oprimido el botón central
if SW.value() == False and not interruptor_oprimido:
interruptor_oprimido = True
# Para verificar en la consola, para depuración
print("Ejecutando", lista_archivos[resaltar-1+recorrer])
# Ejecución del script
ejecutar(lista_archivos[(resaltar-1) + recorrer])