Deutsch   English 

4. Interaktive Programme mit Buttons


Der micro:bit verfügt über zwei programmierbare Buttons, die es ermöglichen, interaktiv während der Programmausführung den Programmablauf zu beeinflussen.

Der linke wird mit der Variablen button_a, der rechte mit button_b angesprochen.

Die Funktion button_a.is_pressed() gibt True zurück, wenn der linke Button im Moment des Aufrufs gedrückt ist (analog button_b_is pressed()).

 

Beispiel 1: Auf das Drücken eines Buttons reagieren
Das Programm wartet in einer Endlosschleife, bis der Button A oder der Button B gedrückt wird. Wenn Button A gedrückt wird, blinken die LEDs, und zwar so lange der Button gedrückt wird. Beim des Buttons B leuchten die beiden LEDs

# Mr4a.py
from microbit import *
from mbrobot import *
#from mbrobot_plusV2 import *

def blink():
    setLED(1)
    delay(500)
    setLED(0)   
    delay(500)

while True:
    if button_a.is_pressed():
        blink()    
    delay(100) 
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

def blink(): Es ist sinnvoll für das Blinken der LEDs eine Funktion zu schreiben und diese dann beim Drücken des Buttons A aufzurufen
if button_a.is_pressed() Gibt True zurück, während der Button gedrückt ist


Beispiel 2: Auf das Klicken eines Buttons reagieren
In einer endlosen while-Schleife lässt man die rechte und linke LED mit einer Periode von 1 s blinken. Ein Klick auf den Button A oder B soll das Blinken kurzzeitig unterbrechen und einen Sound abspielen.

Da das Programm die meiste Zeit in der blink-Funktion verbringt, kann es nicht merken, wenn man während dieser Zeit den Button drückt und wieder loslässt. Um einen Klicks trotzdem zu erfassen, muss man die Funktion button_a.was_pressed() verwenden. Diese liefert True, wenn irgend einmal der Button geklickt wurde. Der Klick wird als Event aufgefasst, der vom System auch dann registriert wird,  wenn das Programm gerade etwas anderes macht.

# Mr4b.py
from microbit import *
from mbrobot import *
from music import *

def blink():
    ledLeft.write_digital(1)
    ledRight.write_digital(1)
    delay(500)
    ledLeft.write_digital(0)
    ledRight.write_digital(0)
    delay(500)

while True:
    if button_a.was_pressed():
        play(JUMP_UP)
    if button_b.was_pressed():
        play(JUMP_DOWN)    
    blink()
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

if button_a.was_pressed() Gibt True zurück, falls der Button seit dem letzten Aufruf gedrückt wurde
from music import *: Importiert das Modul music
play(JUMP_UP): Spielt einen kurzen Song ab. Einige Songs sind in der Distribution von TigerJython enthalten (siehe Doc)

Beispiel 3: Ein fahrender Roboter wird mit einem Button-Klick gestoppt
Bei den fahrenden Robotern ist es vorteilhaft eine while-Schleife zu verwenden, die nur so lange wiederholt wird, bis ein Button gedrückt wurde.

Solange der Button A nicht gedrückt wurde, wiederholt der Roboter die Befehle in der while-Schleife. Mit dem Buttonklick wird die Schleife beendet und das Programm geht weiter zum Befehl stop().

# Mr4c.py
from microbit import *
from mbrobot import *

setSpeed(15)
forward()
while not button_a.was_pressed():
    d = getDistance()
    if d < 10:
        backward()
        delay(1000)
        forward()
    delay(200)
stop() 
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

while not button_a.was_pressed() Quasi endlose while-Schleife, die beim Drücken des Button A beendet wird

 


Aufgaben:


1)


Der Roboter soll sich mit den Buttons wie folgt bedienen lassen:
Mit Klick auf den Button A startet er immer wieder eine Kreisbewegung. Mit Klick auf den Button B wird die Bewegung gestoppt.

 


2)


Programmiere einen SOS-Sender.
Im Morse-Alphabet wir s mit drei kurzen und o mit drei langen Signalen dargestellt. Dein Programm soll wie folgt senden:
Beim Klicken des Buttons A wird ein kurzer Ton abgespielt und die beiden roten LEDs leuchten kurz auf. Beim Drücken des Buttons B wird ein langer Ton abgespielt und die beiden roten LEDs leuchten lang auf.
Falls du mehr in Morse senden willst, kannst du die Kodierung der einzelnen Buchstaben im nachfolgenden Programmcode sehen.


 



3)


Der Morsecode wird zur Übermittlung von Nachrichten verwendet. Buchstaben, Satzzeichen und Zahlen sind als kurzes Signal, langes Signal und Pause codiert. Mit dem eingebauten Lautsprecher kannst du sehr einfach Morse-Nachrichten erzeugen.

a)

Sende einige mit Hilfe der beiden Buttons wie in der Aufgaben 2 einige kurze Nachrichten.
Codierung der einzelnen Buchstaben:

 a : .-    ,  b : -...  ,  c : -.-.  ,  d : -..   ,  e : .     ,
 f : ..-.  ,  g : --.   ,  h : ....  ,  i : ..    ,  j : .---  ,
 k : -.-   ,  l : .-..  ,  m : --    ,  n : -.    ,  o : ---   ,
 p : .--.  ,  q : --.-  ,  r : .-.   ,  s : ...   ,  t : -     ,
 u : ..-   ,  v : ...-  ,  w : .--   ,  x : -..-  ,  y : -.--  ,
 z : --.. 

b)

Mit dem folgendem Programm kannst du automatisch Morse-Nachrichten erzeugen. Es ist zweckmässig, die Codierung in einem Python-Dictionary abzulegen. Die Nachricht  wird in transmit() mit einer for c in text-Schleifedurchgelaufen, und jedes Zeichen mit dot und dash abgespielt. Sende Mitteilungen in Morse-Code mit verschiedenen Geschwindigkeiten und versuche sie zu entziffern.

# Morse.py

from microbit import *
from music import *

dt = 100 
freq = 1000

morse = {
'a':'.-'   , 'b':'-...' , 'c':'-.-.' , 'd':'-..'  , 'e':'.'    ,
'f':'..-.' , 'g':'--.'  , 'h':'....' , 'i':'..'   , 'j':'.---' ,
'k':'-.-'  , 'l':'.-..' , 'm':'--'   , 'n':'-.'   , 'o':'---'  ,
'p':'.--.' , 'q':'--.-' , 'r':'.-.'  , 's':'...'  , 't':'-'    ,
'u':'..-'  , 'v':'...-' , 'w':'.--'  , 'x':'-..-' , 'y':'-.--' ,
'z':'--..' , '1':'.----', '2':'..---', '3':'...--', '4':'....-',
'5':'.....', '6':'-....', '7':'--...', '8':'---..', '9':'----.',
'0':'-----', '-':'-....-', '?':'..--..', ',':'--..--', ':':'---...',
'=':'-...-'}

def dot():
    pitch(freq, dt)
    delay(dt)

def dash():
    pitch(freq, 3 * dt)
    delay(dt)

def transmit(text):
    for c in text:
        if c == " ":
            delay(4 * dt)
        else:
            c = c.lower()
            if c in morse:
                k = morse[c]
                for x in k:
                    if x == '.':
                        dot()
                    else:
                        dash()
            delay(2 * dt)

transmit("I will be there tonight")
► In Zwischenablage kopieren