'''
Actividad: Crear un app con 3 botones que sumen y resten numero y el tercero resetee los resultados
Integrantes del equipo:
Alvarez Gonzalez Jesus Armando
Mendoza Juarez Juan Diego
Trujillo Guerrero Fabiola
'''
import machine
import ssd1306
import time
import framebuf # Importa la librería para trabajar con colores
# Configura la pantalla OLED
i2c = machine.I2C(-1, machine.Pin(22), machine.Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Configura los pines para los botones
btn_up = machine.Pin(23, machine.Pin.IN, machine.Pin.PULL_UP)
btn_down = machine.Pin(19, machine.Pin.IN, machine.Pin.PULL_UP)
btn_menu = machine.Pin(18, machine.Pin.IN, machine.Pin.PULL_UP)
# Configura los pines para el zumbador (buzzer)
buzzer = machine.Pin(25, machine.Pin.OUT)
# Configura el pin del servo
servo_pin = machine.Pin(26)
servo = machine.PWM(servo_pin, freq=50)
# Configura los pines para los LEDs
led1 = machine.Pin(2, machine.Pin.OUT)
led2 = machine.Pin(4, machine.Pin.OUT)
led3 = machine.Pin(5, machine.Pin.OUT)
# Define las opciones del menú principal
main_menu_options = ["LEDS", "Buzzer", "Servomotor"]
main_selected_option = 0
# Define las opciones de los submenús
sub_menu_options = [["LED Rojo", "LED Verde", "LED Azul", "Apagar LEDs"],
["Buzz 1 seg", "Buzz 2 seg", "Buzz 3 seg"],
["Servo a 0°", "Servo a 90°", "Servo a 150°"]]
sub_selected_option = 0
# Define el color azul
BLUE = 3
# Título fijo en la parte superior
title = "Menu OLED"
title_x = 5
title_y = 0
# Función para dibujar el título
def draw_title():
title_buffer = bytearray((oled.width // 8) * oled.height)
title_frame = framebuf.FrameBuffer(title_buffer, oled.width, oled.height, framebuf.MONO_HLSB)
title_frame.fill(0)
title_frame.text(title, title_x, title_y, BLUE)
oled.framebuf.blit(title_frame, 0, 0)
oled.show()
def draw_main_menu():
draw_title()
for i, option in enumerate(main_menu_options):
if i == main_selected_option:
oled.text("--> " + option, 0, 10 + i * 10)
else:
oled.text(option, 0, 10 + i * 10)
oled.show()
def draw_sub_menu():
draw_title()
for i, option in enumerate(sub_menu_options[main_selected_option]):
if i == sub_selected_option:
oled.text("--> " + option, 0, 10 + i * 10)
else:
oled.text(option, 0, 10 + i * 10)
oled.show()
def navigate_main_menu(direction):
global main_selected_option
if direction == "up":
main_selected_option = (main_selected_option - 1) % len(main_menu_options)
elif direction == "down":
main_selected_option = (main_selected_option + 1) % len(main_menu_options)
draw_main_menu()
def navigate_sub_menu(direction):
global sub_selected_option
if direction == "up":
sub_selected_option = (sub_selected_option - 1) % len(sub_menu_options[main_selected_option])
elif direction == "down":
sub_selected_option = (sub_selected_option + 1) % len(sub_menu_options[main_selected_option])
draw_sub_menu()
def turn_on_led(led_pin):
led_pin.value(1)
def turn_off_led(led_pin):
led_pin.value(0)
def buzz(duration):
buzzer.value(1)
time.sleep(duration)
buzzer.value(0)
def move_servo(degrees):
if degrees < 0:
degrees = 0
elif degrees > 150: # Ajustado a 150 grados
degrees = 150
duty = (degrees / 180) * 115 + 30 # Calcula el ciclo de trabajo para el servo
servo.duty(int(duty))
# Inicializa la pantalla y el menú principal
draw_main_menu()
in_sub_menu = False
while True:
if not in_sub_menu:
if not btn_up.value():
navigate_main_menu("up")
while not btn_up.value():
pass
elif not btn_down.value():
navigate_main_menu("down")
while not btn_down.value():
pass
elif not btn_menu.value():
if main_selected_option == 0:
in_sub_menu = True
draw_sub_menu()
elif main_selected_option == 1:
in_sub_menu = True
draw_sub_menu()
elif main_selected_option == 2:
in_sub_menu = True
draw_sub_menu()
while not btn_menu.value():
pass
else:
if not btn_up.value():
navigate_sub_menu("up")
while not btn_up.value():
pass
elif not btn_down.value():
navigate_sub_menu("down")
while not btn_down.value():
pass
elif not btn_menu.value():
if main_selected_option == 0:
if sub_selected_option == 0:
turn_on_led(led1)
elif sub_selected_option == 1:
turn_on_led(led2)
elif sub_selected_option == 2:
turn_on_led(led3)
elif sub_selected_option == 3:
turn_off_led(led1)
turn_off_led(led2)
turn_off_led(led3)
in_sub_menu = False
draw_main_menu()
elif main_selected_option == 1:
if sub_selected_option == 0:
buzz(1)
elif sub_selected_option == 1:
buzz(2)
elif sub_selected_option == 2:
buzz(3)
in_sub_menu = False
draw_main_menu()
elif main_selected_option == 2:
if sub_selected_option == 0:
move_servo(0)
elif sub_selected_option == 1:
move_servo(90)
elif sub_selected_option == 2:
move_servo(150)
in_sub_menu = False
draw_main_menu()
while not btn_menu.value():
pass