import time
import board
import digitalio
COMMON_ANODE = False # True: közös anódos, False: közös katódos
# ------ 7 szegmenses kijelző lábai: a, b, c, d, e, f, g ------
segment_pins = [board.GP0, board.GP1, board.GP2, board.GP3, board.GP4, board.GP5, board.GP6]
segments = []
for pin in segment_pins:
seg = digitalio.DigitalInOut(pin)
seg.direction = digitalio.Direction.OUTPUT
segments.append(seg)
# 7-segment display layout
# A
# ---
# F | G | B
# ---
# E | | C
# ---
# D
digits_cat = {
0: (1, 1, 1, 1, 1, 1, 0),
1: (0, 1, 1, 0, 0, 0, 0),
2: (1, 1, 0, 1, 1, 0, 1),
3: (1, 1, 1, 1, 0, 0, 1),
4: (0, 1, 1, 0, 0, 1, 1),
5: (1, 0, 1, 1, 0, 1, 1),
6: (1, 0, 1, 1, 1, 1, 1),
7: (1, 1, 1, 0, 0, 0, 0),
8: (1, 1, 1, 1, 1, 1, 1),
9: (1, 1, 1, 1, 0, 1, 1)
}
digits_an = {
0: (0, 0, 0, 0, 0, 0, 1),
1: (1, 0, 0, 1, 1, 1, 1), # 1
2: (0, 0, 1, 0, 0, 1, 0), # 2
3: (0, 0, 0, 0, 1, 1, 0), # 3
4: (1, 0, 0, 1, 1, 0, 0), # 4
5: (0, 1, 0, 0, 1, 0, 0), # 5
6: (0, 1, 0, 0, 0, 0, 0), # 6
7: (0, 0, 0, 1, 1, 1, 1), # 7
8: (0, 0, 0, 0, 0, 0, 0), # 8
9: (0, 0, 0, 1, 1, 0, 0) # 9
}
def display_digit(n: int):
# Kiírja az n számjegyet a kijelzőre
pattern = digits_cat.get(n, (0,)*7)
for seg, on in zip(segments, pattern):
if COMMON_ANODE:
# közös anód: aktív alacsony
seg.value = False
else:
# közös katód: aktív magas
seg.value = True
def display_off():
# Minden szegmenset lekapcsol
for seg in segments:
if COMMON_ANODE:
seg.value = True # kikapcsolva = HIGH
else:
seg.value = False # kikapcsolva = LOW
# ------ Gomb és vezetékek ------
# Gomb: egyik láb GPIO_BTN-re, másik GND-re
BTN_PIN = board.GP15
button = digitalio.DigitalInOut(BTN_PIN)
button.direction = digitalio.Direction.INPUT
button.pull = digitalio.Pull.UP # BELSŐ FELHÚZÓ! (nagyon fontos)
# Piros vezeték: kihúzáskor álljon meg a számlálás
RED_PIN = board.GP16
red_wire = digitalio.DigitalInOut(RED_PIN)
red_wire.direction = digitalio.Direction.INPUT
red_wire.pull = digitalio.Pull.UP # GND-re dugva: 0, kihúzva: 1
# Gyorsító vezeték: kihúzáskor gyorsabb
FAST_PIN = board.GP17
fast_wire = digitalio.DigitalInOut(FAST_PIN)
fast_wire.direction = digitalio.Direction.INPUT
fast_wire.pull = digitalio.Pull.UP # GND-re dugva: 0, kihúzva: 1
def is_paused():
#Igaz, ha a piros vezeték ki van húzva
return red_wire.value # True = ki van húzva
def is_fast():
#Igaz, ha a gyorsító vezeték ki van húzva
return fast_wire.value # True = ki van húzva
# ------ Időzítések ------
delay = 1.0 # normál sebesség (s)
fast_delay = 0.2 # gyorsított sebesség (s)
blink_delay = 0.5 # 0 villogás fél másodpercenként
# ------ Kezdő állapot ------
current_digit = 9
display_digit(current_digit)
print("Alapállapot, kiírt szám:", current_digit)
started = False # elindult-e már a visszaszámlálás
finished = False # elérte-e már a 0-t
blink_on = True # villogásnál épp látszik-e a 0
last_change = time.monotonic()
prev_button = button.value # élérzékeléshez
# ------ Fő ciklus ------
while True:
now = time.monotonic()
btn_val = button.value
# Gomb lenyomás élérzékelés (felengedett -> lenyomott)
if prev_button and not btn_val:
if not started:
started = True
finished = False
current_digit = 9
display_digit(current_digit)
print("Számlálás indul 9-től visszafelé.")
last_change = now
prev_button = btn_val
# Pause és gyorsítás állapot
paused = is_paused()
delay = fast_delay if is_fast() else delay
# Ha már elindult, de még nem értünk a 0-ig
if started and not finished:
if (not paused) and (now - last_change >= delay):
current_digit -= 1
if current_digit < 0:
# elértük a 0-t → villogás
current_digit = 0
finished = True
blink_on = True
display_digit(0)
print("Elértük a 0-t, villogtatás indul.")
last_change = now
else:
display_digit(current_digit)
print("Aktuális szám:", current_digit)
last_change = now
# Ha már végigszámolt, villogtassa a 0-t
if finished:
if (not paused) and (now - last_change >= blink_delay):
if blink_on:
display_off() # 0 eltűnik
else:
display_digit(0) # 0 megjelenik
blink_on = not blink_on
last_change = now
time.sleep(0.01)