#########################################################
# CRONOMETRO CON RESET + LED MICROPYTHON PARA RP2040
# (15 Agosto 2024)
# (13 Septiebre 2024)
# (05 Abril 2025)
# Jordi Giro
# Carlos Hernández
#########################################################
## IMPORTAR LIB: ##
from contador import Contador
from led_RGB import Led_RGB
from machine import Pin
from time import sleep, localtime, time
## HARDWARE: ##
#LED_PINS = [1, 4, 7, 10]
#CLK_PINS = [2, 5, 8, 11]
#DIO_PINS = [3, 6, 9, 12]
LED_PINS = [1, 7, 10, 4]
CLK_PINS = [2, 8, 11, 5]
DIO_PINS = [3, 9, 12, 6]
btn_pin = Pin( 0, Pin.IN) # RESET Boton PIN
ws_pin = 16 # Pin WS2812 LED
num_displays = 4
blink_int = 0.25
tiempo_activar = 3 # Segundos para pulsar para activar/desactivar el 4o timer
led_ult_activo = True # Led activo = True, queda encendido el led del que se acaba de resetear, a False el que se resetea si se pulsa
## INICIALIZAR MODULOS: ##
# Displays:
displays = [None for c in range(num_displays)]
for i in range(num_displays):
displays[i] = Contador(CLK_PINS[i], DIO_PINS[i], LED_PINS[i])
ledstatus = Led_RGB(ws_pin)
#ledstatus.color = (0, 0, 255)
curr_display = 0
curr_led = 0
boton_pulsado = 0
#displays[3].active = False
## FUNCIONES: ##
# Función para actualizar el cronómetro
def update_timer():
#for disp in Displays:
#disp.update_timer()
for i in range(num_displays):
displays[i].update_timer()
# Función Limpia Pantalla.
def reset_counter():
global curr_display
global boton_pulsado
if btn_pin.value() == 1:
# Boton pulsado
if boton_pulsado == 0:
# Lo han pulsado ahora mismo
boton_pulsado = time()
elif boton_pulsado != -1:
# miramos si lleva X segundos pulsado y aun no hemos reseteado
if time() - boton_pulsado >= tiempo_activar:
displays[num_displays - 1].active = not displays[num_displays - 1].active
displays[num_displays - 1].start = 0
boton_pulsado = -1
if displays[num_displays - 1].active:
if curr_display == 0:
curr_display = num_displays - 2
seleccionar_display(num_displays - 1)
else:
if curr_display == num_displays - 1:
curr_display = num_displays - 2
seleccionar_display(0)
else:
# Boton no pulsado
if boton_pulsado > 0:
# Si es > 0 lo acaban de soltar
displays[curr_display].reset()
seleccionar_display(siguiente_display(curr_display))
boton_pulsado = 0
def siguiente_display(num_display):
next_display = (num_display + 1) % num_displays
while (next_display != num_display) and not displays[next_display].active:
next_display = (next_display + 1) % num_displays
return next_display
def seleccionar_display(num_display):
global curr_display
global curr_led
displays[curr_led].enciende_led(False)
if led_ult_activo:
curr_led = curr_display
else:
curr_led = num_display
curr_display = num_display
displays[curr_led].enciende_led(True)
# TEST LED:
def test_hardware():
for i in range(num_displays):
displays[i].enciende_led(True)
sleep(0.5)
displays[i].enciende_led(False)
# Mostrar 00:00:00 en el módulo TM1637
displays[curr_display].enciende_led(False)
ledstatus.parpadea(blink_int)
update_timer()
test_hardware()
# Bucle principal
while True:
# Actualizar el cronómetro cada segundo
reset_counter()
update_timer()
ledstatus.verifica_parpadeo()
sleep(0.1)