import time
from machine import Pin
# CONFIGURACIÓN
segmentos_pins = [
Pin(28, Pin.OUT), Pin(27, Pin.OUT), Pin(26, Pin.OUT),
Pin(22, Pin.OUT), Pin(21, Pin.OUT), Pin(20, Pin.OUT), Pin(19, Pin.OUT)]
digitos_pin = [ Pin(12, Pin.OUT), Pin(13, Pin.OUT), Pin(14, Pin.OUT), Pin(15, Pin.OUT)]
# Botones
btn_mas_1seg = Pin(0, Pin.IN, Pin.PULL_UP)
btn_mas_10seg = Pin(1, Pin.IN, Pin.PULL_UP)
btn_set = Pin(2, Pin.IN, Pin.PULL_UP)
btn_reset = Pin(3, Pin.IN, Pin.PULL_UP)
#led nuevo
led_conteo = Pin(11, Pin.OUT)
led_conteo.value(0)#pa iniciar en 0
# VARIABLES
segundos_totales = 0
debounce = 250
ult_interrup = 0
corriendo = False
ult_tick = time.ticks_ms()
tiempo_finalizado = 0
patron_segmento = [
(1,1,1,1,1,1,0), (0,1,1,0,0,0,0), (1,1,0,1,1,0,1), (1,1,1,1,0,0,1), (0,1,1,0,0,1,1),
(1,0,1,1,0,1,1), (1,0,1,1,1,1,1), (1,1,1,0,0,0,0), (1,1,1,1,1,1,1), (1,1,1,1,0,1,1)]
def obtener_formato_reloj(total_seg):
if total_seg > 5999: total_seg = 5999
if total_seg < 0: total_seg = 0
minutos = total_seg // 60
segundos = total_seg % 60
return [minutos // 10, minutos % 10, segundos // 10, segundos % 10]
def actualizar_led():
led_conteo.value(1 if corriendo else 0)
# INTERRUPCIONES
def sumar_1_seg(pin):
global segundos_totales, ult_interrup, corriendo
now = time.ticks_ms()
if time.ticks_diff(now, ult_interrup) > debounce:
if not corriendo: segundos_totales += 1
ult_interrup = now
def sumar_10_seg(pin):
global segundos_totales, ult_interrup, corriendo
now = time.ticks_ms()
if time.ticks_diff(now, ult_interrup) > debounce:
if not corriendo: segundos_totales += 10
ult_interrup = now
def inicio_conteo(pin):
global corriendo, ult_interrup
now = time.ticks_ms()
if time.ticks_diff(now, ult_interrup) > debounce:
if segundos_totales > 0:
corriendo = True
actualizar_led()
ult_interrup = now
def reset_reloj(pin):
global segundos_totales, ult_interrup, corriendo
now = time.ticks_ms()
if time.ticks_diff(now, ult_interrup) > debounce:
if corriendo:
corriendo = False
actualizar_led()
else:
segundos_totales = 0
ult_interrup = now
# Registro de IRQs
btn_mas_1seg.irq(trigger=Pin.IRQ_FALLING, handler=sumar_1_seg)
btn_mas_10seg.irq(trigger=Pin.IRQ_FALLING, handler=sumar_10_seg)
btn_reset.irq(trigger=Pin.IRQ_FALLING, handler=reset_reloj)
btn_set.irq(trigger=Pin.IRQ_FALLING, handler=inicio_conteo)
for d in digitos_pin: d.value(1)
# BUCLE PRINCIPAL
while True:
if corriendo and segundos_totales > 0:
if time.ticks_diff(time.ticks_ms(), ult_tick) >= 1000:
segundos_totales -= 1
ult_tick = time.ticks_ms()
if segundos_totales == 0:
corriendo = False
tiempo_finalizado = time.ticks_ms()
actualizar_led()
if segundos_totales == 0 and not corriendo:
if time.ticks_diff(time.ticks_ms(), tiempo_finalizado) > 1000:
for d in digitos_pin:
d.value(1)
time.sleep(0.01)
continue
reloj = obtener_formato_reloj(segundos_totales)
# Multiplexación
for i in range(4):
for d in digitos_pin: d.value(1)
patter = patron_segmento[reloj[i]]
for j in range(7):
segmentos_pins[j].value(patter[j])
digitos_pin[i].value(0)
time.sleep(0.004)Loading
pi-pico-w
pi-pico-w