Operácie

Rýchlokurz micro:bit/09 Kuchynské minútky

Zo stránky SensorWiki

← Predchádzajúca lekcia | ⌂ Obsah kurzu

Klasické kuchynské minútky

Čo sa naučíte

  • spojiť všetko, čo už viete, do jedného užitočného programu,
  • navrhnúť program ešte pred tým, ako ho začnete písať,
  • prehrať zvuk.

Toto je záverečná lekcia kurzu. Ak jej programu úplne rozumiete a zvládnete aspoň dve úlohy na konci, máte všetko potrebné na cvičenia.

Návrh programu

Skôr ako začnete skladať bloky, je dobré si slovami popísať, čo má program robiť. Až potom riešite, ako. Naše minútky budú fungovať takto:

  • Po zapnutí zobrazia čas 0.
  • Tlačidlo A pridá jednu sekundu (pri skutočných minútkach by to bola minúta, ale sekundy sa lepšie testujú).
  • Tlačidlo B spustí odpočítavanie. Ak je nastavený čas 0, nie je čo odpočítavať, preto zobrazia krížik.
  • Po dobehnutí zaznie melódia a trikrát zabliká srdce.
  • Tlačidlá A+B čas vynulujú.

Z popisu už vidno, čo budeme potrebovať:

Časť popisu Programová konštrukcia Lekcia
nastavený čas si treba pamätať premenná cas 3, 8
reakcia na tlačidlá obsluhy udalostí 6
„ak je čas 0, zobraz krížik, inak odpočítavaj“ if-else 7
odpočítavaj, kým čas neklesne na 0 cyklus while 5
srdce zabliká trikrát cyklus for (repeat) 4

Zvuk

Bloky pre zvuk sú v kategórii Music. Na verzii V2 zaznie zvuk zo vstavaného reproduktora na zadnej strane dosky. Verzia V1 reproduktor nemá: zvuk ide na pin 0 a počuť ho je len vtedy, keď medzi piny 0 a GND pripojíte krokosvorkami slúchadlá alebo bzučiak. Simulátor v MakeCode prehrá zvuk cez reproduktory počítača.

Blok play melody ... until done počká, kým melódia dohrá, a až potom pokračuje ďalším príkazom. Pri voľbe in background sa melódia spustí a program hneď pokračuje, takže zvuk a animácia bežia súčasne. My chceme, aby srdce blikalo počas hrania melódie, preto použijeme in background.

Program: kuchynské minútky

input.onButtonPressed(Button.A, function () {
    cas += 1
    basic.showNumber(cas)
})
input.onButtonPressed(Button.AB, function () {
    cas = 0
    basic.showNumber(cas)
})
input.onButtonPressed(Button.B, function () {
    if (cas == 0) {
        basic.showIcon(IconNames.No)
    } else {
        while (cas > 0) {
            basic.showNumber(cas)
            basic.pause(1000)
            cas += -1
        }
        music.play(music.stringPlayable("E B C5 A B G A F ", 230), music.PlaybackMode.InBackground)
        // music.play(music.builtinPlayableMelody(Melodies.PowerUp), music.PlaybackMode.InBackground)
        for (let index = 0; index < 3; index++) {
            basic.showIcon(IconNames.Heart)
            basic.showIcon(IconNames.SmallHeart)
        }
        basic.showNumber(cas)
    }
})
let cas = 0
basic.showNumber(cas)
def on_button_pressed_a():
    global cas
    cas += 1
    basic.show_number(cas)
input.on_button_pressed(Button.A, on_button_pressed_a)

def on_button_pressed_ab():
    global cas
    cas = 0
    basic.show_number(cas)
input.on_button_pressed(Button.AB, on_button_pressed_ab)

def on_button_pressed_b():
    global cas
    if cas == 0:
        basic.show_icon(IconNames.NO)
    else:
        while cas > 0:
            basic.show_number(cas)
            basic.pause(1000)
            cas += -1
        music.play(music.string_playable("E B C5 A B G A F ", 230),
            music.PlaybackMode.IN_BACKGROUND)
        # music.play(music.builtinPlayableMelody(Melodies.PowerUp), music.PlaybackMode.InBackground)
        for index in range(3):
            basic.show_icon(IconNames.HEART)
            basic.show_icon(IconNames.SMALL_HEART)
        basic.show_number(cas)
input.on_button_pressed(Button.B, on_button_pressed_b)

cas = 0
basic.show_number(cas)

Ako to funguje

Najzaujímavejšia je obsluha tlačidla B. Všimnite si, ako sú konštrukcie vnorené do seba: v obsluhe udalosti je podmienka, vo vetve else je cyklus while a za ním cyklus for. Presne toto vnorenie najlepšie vidno v blokoch: každá konštrukcia je „krabička“, do ktorej sa vkladajú ďalšie príkazy. V textovom zápise ho vyjadrujú úrovne odsadenia (a v JavaScripte zložené zátvorky).

Prejdime si obsluhu tlačidla B pre nastavený čas 3 sekundy:

  1. Podmienka cas == 0 neplatí (cas je 3), vykoná sa vetva else.
  2. Cyklus while: 3 > 0 platí → zobraz 3, počkaj, cas = 2. Potom 2 > 0 → zobraz 2, cas = 1. Potom 1 > 0 → zobraz 1, cas = 0. Nakoniec 0 > 0 neplatí, cyklus končí.
  3. Spustí sa melódia na pozadí.
  4. Cyklus for trikrát vystrieda veľké a malé srdce (medzitým stále hrá melódia).
  5. Zobrazí sa 0 a minútky sú pripravené na ďalšie použitie.

Takémuto „ručnému“ prechádzaniu programu s konkrétnymi hodnotami sa hovorí trasovanie. Je to najspoľahlivejší spôsob, ako pochopiť cudzí program alebo nájsť chybu vo vlastnom.

Odpočítavanie nie je úplne presné: k pauze 1000 ms sa pripočíta čas, kým sa zobrazí číslo, a pri dvojciferných číslach je to posúvanie textu, teda aj niekoľko sekúnd. Na kuchynské minútky to stačí, na presné meranie času sa používajú iné prostriedky (blok running time v kategórii Input), ku ktorým sa dostaneme na cvičeniach.

Časté chyby

  • Premenná cas je vo while podmienke, ale v tele cyklu sa nemení → nekonečný cyklus, minútky nikdy nedobehnú.
  • Podmienka cas >= 0 namiesto cas > 0 → cyklus prebehne o raz viac a čas skončí na -1. Trasovaním si overte prečo.
  • Melódia v režime until done → srdce začne blikať až po dohraní melódie.

Úlohy

  1. Trasujte program pre prípad, že stlačíte B hneď po zapnutí. Ktoré príkazy sa vykonajú?
  2. Upravte minútky tak, aby tlačidlo A pridávalo po 10 sekúnd.
  3. Nech posledné tri sekundy odpočítavania sprevádza krátke pípnutie (do tela cyklu while vložte podmienku if cas <= 3 a do nej blok play tone z kategórie Music).
  4. Pridajte tlačidlo na odoberanie času. Tlačidlo A je obsadené a B spúšťa odpočítavanie. Nájdite si v kategórii Input inú udalosť, napr. on shake alebo (V2) on logo pressed. Nezabudnite, že čas nesmie byť záporný.
  5. Náročnejšia: Upravte minútky tak, aby sa nastavovali v minútach a počas odpočítavania zobrazovali len zostávajúce minúty. Potrebujete na to vnorené cykly?

🎓 Gratulujeme, zvládli ste základy! Na cvičeniach budeme pokračovať senzormi, komunikáciou medzi micro:bitmi a pripájaním ďalších súčiastok. Ďalšie inšpirácie nájdete v zbierke príkladov.

← Predchádzajúca lekcia | ⌂ Obsah kurzu