Micro:bit – šachové hodiny

Co je potřeba

micro:bit V2
rozšiřující konektor pro přístup k P8 a P16
nepájivé pole
USB kabel nebo bateriový držák
2× LED
2× rezistor 330 Ω
4x propojovací vodiče samec-krokosvorka (pokud si také budete tlačítka vyrábět)
propojovací vodiče samec-samec
2× spínací tlačítko (v našem případě jsou tlačítka vyrobena z kartonu, alobalu a provázku)

Schéma zapojení

  • Zapojení LED: anoda (delší nožička +) směrem k rezistoru, katoda (kratší nožička –) směrem ke GND.
  • Všechny body GND jsou spojeny dohromady. Na nepájivém poli v řádku označeném -.
  • Tlačítka při stisku propojí P0 nebo P1 s GND. Program používá události dotykových pinů, které reagují na krátké spojení a uvolnění.
  • Přiřazení PIN: tlačítko hráče 1 na P0 spouští čas hráče 2; tlačítko hráče 2 na P1 spouští čas hráče 1. LED na P16 svítí, když se odpočítává čas hráči 1, LED na P8 svítí, když se odpočítává čas hráči 2.

Stručný postup sestavení

  1. Osaď Micro:bit do rozšiřujícího konektoru a ten pak do středu nepájivého pole.
  2. Při odpojeném napájení zapoj tlačítka a LED podle schématu. Tlačítka a LED umísti každé na stranu příslušného hráče. Hráč 1 (piny P0 a P16) je na levé straně a hráč 2 (piny P1 a P8) je na pravé straně micro:bit.
  3. Otevři editor Microsoft MakeCode a přepni na Python. Přiložený kód používá rozhraní MakeCode, nikoli běžný MicroPython.
  4. Vlož níže napsaný kód, stáhni program a nahraj jej do micro:bitu.
  5. Připoj napájení.

Zdrojový kód

def Kresli(POCET: number):
    global index
    basic.clear_screen()
    index = 0
    while index <= POCET - 1:
        led.plot(led_order[index][0], led_order[index][1])
        index += 1

def on_pin_pressed_p0():
    global HRAC
    if GAME == 3:
        HRAC = 2
        pins.digital_write_pin(DigitalPin.P16, 0)
        pins.digital_write_pin(DigitalPin.P8, 1)
input.on_pin_pressed(TouchPin.P0, on_pin_pressed_p0)

def ZobrazHrace():
    if HRAC == 1:
        basic.show_leds("""
            . . # . .
            . # . . .
            # # # # #
            . # . . .
            . . # . .
            """)
        pins.digital_write_pin(DigitalPin.P16, 1)
        pins.digital_write_pin(DigitalPin.P8, 0)
    elif HRAC == 2:
        basic.show_leds("""
            . . # . .
            . . . # .
            # # # # #
            . . . # .
            . . # . .
            """)
        pins.digital_write_pin(DigitalPin.P16, 0)
        pins.digital_write_pin(DigitalPin.P8, 1)

def on_button_pressed_a():
    global MIN, HRAC
    if GAME == 0:
        MIN += 1
        if MIN >= len(AR_MIN):
            MIN = 0
        Kresli(AR_MIN[MIN])
    elif GAME == 1:
        if HRAC == 1:
            HRAC = 2
        else:
            HRAC = 1
        ZobrazHrace()
input.on_button_pressed(Button.A, on_button_pressed_a)

def on_button_pressed_b():
    global DELKA_MIN, HRAC, GAME, ODPOCET1, ODPOCET2, ZACATEK
    if GAME == 0:
        DELKA_MIN = AR_MIN[MIN]
        HRAC = 1
        GAME = 1
        ODPOCET1 = DELKA_MIN * 60000
        ODPOCET2 = DELKA_MIN * 60000
        ZobrazHrace()
    elif GAME == 1:
        GAME = 2
        basic.show_icon(IconNames.YES)
        music.play(music.builtin_playable_sound_effect(soundExpression.twinkle),
            music.PlaybackMode.UNTIL_DONE)
        basic.pause(200)
        GAME = 3
        ZACATEK = input.running_time()
input.on_button_pressed(Button.B, on_button_pressed_b)

def on_pin_pressed_p1():
    global HRAC
    if GAME == 3:
        HRAC = 1
        pins.digital_write_pin(DigitalPin.P16, 1)
        pins.digital_write_pin(DigitalPin.P8, 0)
input.on_pin_pressed(TouchPin.P1, on_pin_pressed_p1)

def Odpocitej(ZBYVA: number):
    global index
    basic.clear_screen()
    index = 0
    while index <= Math.ceil(ZBYVA / 60) - 1:
        led.plot(led_order[index][0], led_order[index][1])
        index += 1
KONEC = 0
ZACATEK = 0
ODPOCET2 = 0
ODPOCET1 = 0
DELKA_MIN = 0
index = 0
MIN = 0
led_order: List[List[number]] = []
AR_MIN: List[number] = []
HRAC = 0
GAME = 0
GAME = -1
HRAC = 1
AR_MIN = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25]
led_order = [[0, 0],
    [1, 0],
    [2, 0],
    [3, 0],
    [4, 0],
    [4, 1],
    [3, 1],
    [2, 1],
    [1, 1],
    [0, 1],
    [0, 2],
    [1, 2],
    [2, 2],
    [3, 2],
    [4, 2],
    [4, 3],
    [3, 3],
    [2, 3],
    [1, 3],
    [0, 3],
    [0, 4],
    [1, 4],
    [2, 4],
    [3, 4],
    [4, 4]]
pins.digital_write_pin(DigitalPin.P8, 1)
pins.digital_write_pin(DigitalPin.P16, 1)
MIN = 4
basic.show_leds("""
    . # # # .
    # . # . #
    # . # # #
    # . . . #
    . # # # .
    """)
music.play(music.builtin_playable_sound_effect(soundExpression.hello),
    music.PlaybackMode.UNTIL_DONE)
basic.pause(100)
Kresli(AR_MIN[MIN])
GAME = 0

def on_forever():
    global KONEC, ZACATEK, ODPOCET1, ODPOCET2
    if GAME == 3:
        KONEC = ZACATEK
        ZACATEK = input.running_time()
        if HRAC == 1:
            ODPOCET1 = ODPOCET1 - (ZACATEK - KONEC)
            Odpocitej(Math.ceil(ODPOCET1 / 1000))
        elif HRAC == 2:
            ODPOCET2 = ODPOCET2 - (ZACATEK - KONEC)
            Odpocitej(Math.ceil(ODPOCET2 / 1000))
        if ODPOCET1 < 1 or ODPOCET2 < 1:
            basic.show_icon(IconNames.SKULL)
            music._play_default_background(music.built_in_playable_melody(Melodies.DADADADUM),
                music.PlaybackMode.UNTIL_DONE)
            
            def on_pause_until():
                return input.button_is_pressed(Button.B)
            pause_until(on_pause_until)
            
            control.reset()
basic.forever(on_forever)

Jak hodiny fungují

  • Nastavení času: Na začátku se zobrazí symbol hodin a po té se rozsvítí horní 5 LED na horním řádku displeje. To znamená výchozí nastavení 5 minut. Jedna LED znamená jednu minutu. Tlačítkem A vybíráš čas pro každého hráče 1 až 10, 15, 20 nebo 25 minut.
  • Potvrzení: stiskem tlačítka B.
  • Volba začínajícího hráče: Po té se rozsvítí šipka směrem ke hráči 1. Tlačítkem A přepínáš hráče, který bude začínat. Šipka a LED ukazují vybraného hráče.
  • Potvrzení a start: znovu stiskem tlačítka B.
  • Během hry: svítí LED hráče, kterému právě ubíhá čas. Po tahu hrající hráč krátce stiskne a uvolní své externí tlačítko (připojená k pinům P0 a P1) — tím spustí odpočet času soupeře.
  • Displej: ukazuje zbývající čas právě aktivního hráče; jeden bod představuje jednu započatou minutu.
  • Konec: po vypršení času jednoho z hráčů se zobrazí lebka a přehraje melodie. Tlačítkem B se hodiny restartují do nastavení. Program neobsahuje pauzu ani přidávání času za tah.

Simulátor

Na simulátoru si můžete po stisknutí tlačítka „zobrazit simulátor“ vyzkoušet funkčnost aplikace. Tlačítky A, B se provádí počáteční nastavení. Klikání na piny P0 a P1 simuluje tlačítka hráčů. Zvýraznění pinů P8 a P16 simuluje rozsvícení LED diod.

Poznámky k programu

  • Dva nezávislé časy – proměnné ODPOCET1 a ODPOCET2 uchovávají zbývající čas každého hráče. Odečítá se pouze čas hráče, který je právě na tahu.
  • Měření skutečně uplynulého času – input.running_time() vrací čas od spuštění programu v milisekundách. Rozdíl dvou měření určuje, kolik času odečíst; program tak nespoléhá na pravidelné čekání.
  • Přepínání hráčů – tlačítko na P0 předá tah hráči 2, tlačítko na P1 hráči 1. Současně se přepnou LED na P16 a P8, které ukazují, komu běží čas.
  • Displej jako ukazatel minut – seznam led_order určuje pořadí rozsvěcování bodů „po řádcích tam a zpět“. Funkce Odpocitej() rozsvítí jeden bod za každou započatou zbývající minutu.
    Jak nastavit pořadí rozsvěcování LED pomocí matic najdete v článku MICRO:BIT – Postupné rozsvěcování LED diod.
  • Jednoduché stavy programu – proměnná GAME rozlišuje nastavení času (0), výběr hráče (1), přípravu startu (2) a běžící hru (3). Stejná tlačítka proto mohou v různých fázích dělat jiné věci.
  • Volitelné délky hry – seznam AR_MIN obsahuje nabízené časy. Jeho úpravou lze nabídku změnit; kvůli displeji s 25 body je vhodné zachovat maximum 25 minut.
  • Konec a restart – po vypršení času se zobrazí lebka a zazní melodie. Program počká na stisk B a pomocí control.reset() spustí kód znovu od začátku.

Výroba hodin z kartonu

Protože hodiny potřebují velká tlačítka, nezbylo než je vyrobit. Základna je vyrobená z kartonu. Zahnuté konce jsou obalené alobalem, přichyceným vteřinového lepidlem a kancelářskou sešívačkou a pomocí provázku jsou vytvarované do velkých tlačítek. Nepájivé pole s micro:bitem je přilepené ke kartonové základně, stejně jako bateriový držák. Vše je pospojované spoustou drátku, na tlačítka jsou potřeba propojovací vodiče s krokosvorkou na jednom konci.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Time limit is exhausted. Please reload CAPTCHA.

Web používá Akismet ke snížení množství spamu. Zjistěte, jak jsou zpracovávány údaje z komentářů.