Folytatjuk a micro:bit és a micropython együttműködését taglaló cikkünket, a ebben a leckében a gombok használatával, lehetőségeivel ismerkedünk meg.

Gombok

. A micro:bit lapka három gombot tartalmaz, kettőt a ledmátrix jobb illetve bal oldalán, ezek programjainkban szabadon felhasználhatóak különböző feladatok ellátására, tovább egyet a hátsó oldalon, közvetlenül az USB csatlakozó mellett. Ez a gomb az eszköz reszetelésére szolgál.

Az előlapi gombok betűjelzéssel vannak ellátva, a bal oldali az A, a jobb oldali a B jelű, a rájuk való hivatkozás programban a button_a.utasítás, illetve a button_b.utasítás formátumban lehetséges.

Az ismerkedést kezdjük egy rövid programmal, aminek segítségével kiírathatjuk a led-kijelzőre, hogy melyik oldali gombot nyomtuk le. Amennyiben nem történt gombnyomás, a kijelző sötét marad.

from microbit import *
while True:
    if button_a.is_pressed():
        display.show("B")
    elif button_b.is_pressed():
        display.show("J")
    else:
        display.clear()

A program első sora importálja a micro:bit eljárásgyűjtemény könyvtárát, a második sor egy ciklus kezdete (ciklusfej). Ezzel a beállítással a program mindaddig fut, míg a programot le nem állítjuk. Az un. ciklusmagban ( a ciklus azon része, ami az ismétlődő utasításokat tartalmazza) helyezkedik el az a szerkezet, amit a programozók feltételes vezérlésátadásnak neveznek. A program futása annak függvényében fut valamelyik szálon, hogy történt-e gombnyomás, illetve ha igen, akkor melyik gombot nyomtuk le (A vagy B)?

A feladatot egy HA (IF) függvénnyel oldjuk meg, ami három választási lehetőséget kínál, HA (IF) az A gombot nyomjuk meg, a kijelzőn egy B betű jelenik meg, HA (ELIF) a B-t, akkor egy egy J betű, EGYÉBKÉNT (ELSE) törlődik a kijelző. A második ha esetet leíró ELIF kifejezés az ELSE-IF rövid alakja.

A gombok használatát ( button_a illetve button_b ) nagyban könnyítik a hozzájuk kapcsolódó eljárás függvényei. Ezek a következők:

  • is_pressed() logikai függvény, értéke igaz, ha a gomb le van nyomva a lekérdezés pillanatában
  • was_pressed() logikai függvény, értéke igaz, ha a gomb le volt nyomva a micro:bit indítása, vagy a függvény utolsó meghívása óta
  • get_presses() numerikus értéket ad, ami a micro:bit indítása, vagy a függvény utolsó hívása óta történt gombnyomások számát adja vissza
  • reset_presses() a függvény nullára állítja a gombokhoz tartozó eseményszámlálók értékét

LEDek

A micro:bit előlapján a két nyomógomb között egy 25 led-ből álló (5×5) kijelző található. A ledek színe nem, de fényerejük változtatható. A „kijelzőn” előre elkészített ledminták, feliratok, számok jeleníthetőek meg, illetve lehetőség van a pixeleket egyenként ki, illetve bekapcsolni. Erre a következő utasítás használható:

display.set_pixel( x, y, b)

ahol az x,y értékek a pozíciót, a b érték (0..9) a fényerőt állítja be.

Ha a kijelzőre szeretnénk programot írni, célszerű az alábbi „sablont” használni:

A következő mintaprogram segítségével „bekeretezhetjük” a kijelzőt, azaz sorban, egy while ciklus ciklusmagjában négy for ciklus segítségével egyesével bekapcsoljuk a szélső két sor, illetve két oszlop ledjeit, majd újabb négy for ciklussal egyesével kikapcsoljuk azokat.

from microbit import *
while True:
# bekapcsolás
# felső sor
    for i in range(0,5):
        display.set_pixel(i,0,9)
        sleep(100)
# jobb szélső oszlop
    for i in range(1,5):
        display.set_pixel(4,i,9)
        sleep(100)
# alsó sor
    for i in range(2,6):
        display.set_pixel((5-i),4,9)
        sleep(100)
# bal szélső oszlop
    for i in range(2,5):
        display.set_pixel(0,(5-i),9)
        sleep(100)
# kikapcsolás
# felső sor
    for i in range(0,5):
        display.set_pixel(i,0,0)
        sleep(100)
# jobb szélső oszlop
    for i in range(1,5):
        display.set_pixel(4,i,0)
        sleep(100)
# alsó sor
    for i in range(2,6):
        display.set_pixel((5-i),4,0)
        sleep(100)
# bal szélső oszlop
    for i in range(2,5):
        display.set_pixel(0,(5-i),0)
        sleep(100)

Végezetül egy, a micro:bit ledmátrixra tervezett játék, amiben az a cél, hogy a kijelzős alsó sorában lévő „játékos” (villogó pixel) elkerülje a felülről lefelé haladó „akadályokat” a rendelkezésre álló három sávnyi pályán. A programban alkalmazott eljárásokat a következő fejezetekben részletesen megvizsgáljuk! A játékhoz jó szórakozást!

from microbit import *
import random

def draw(track, t, x, y):
    img = Image(track)
    img.set_pixel(x,y,t * 4 + 1)
    return img

def PlayGame():
    # oldalvonalak
    track_bits = [
        "50005:",
        "53005:",
        "50305:",
        "50035:"
    ]
    # kezdősáv
    track = "50005:50005:50005:50005:50005:"
    # játékos koordinátái
    x = 2
    y = 4
    # villogás beállítása
    tick = 0
    # sáv beállítás
    paws = 75
    last = 0
    alive = True
    while alive==True:
        tt = draw(track,tick,x,y)
        if button_a.was_pressed() and x!=1:
            x = x - 1
        elif button_b.was_pressed() and x!=3:
            x = x + 1
        # tikkek frissítése
        tick += 1
        # track bekapcsolása
        display.show(tt)
        # minden harmadik tikk
        if tick == 3:
            # check for collision
            if tt.get_pixel(x,y-1)!=0:
                alive = False
            # reset tikk
            tick =0
            # alsó sor törlése
            track = track[:-6]
            # sáv frissítése
            if last==0:
                last = random.randint(0, len(track_bits)-1)
            else:
                last = 0
            track = track_bits[last] + track
            # képernyő újrarajzolása
            tt = draw(track,tick,x,y)
            display.show(tt)
        sleep(paws)
    
def main():
    while True:
        if button_a.was_pressed():
            PlayGame()
            sleep(3000)
        sleep(50)

main() 

A három forráskód letölthető:

A cikkben használt BBC micro:bit és sok más tartozéka megvásárolható a MálnaPC Webshopjában!