Jython

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. Dann beginnt die rechte bzw. linke LED mit einer Periode von 2s zu blinken, und zwar so lange der Button gedrückt wird.

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

def blink(led):
    led.write_digital(1)
    sleep(200)
    led.write_digital(0)    
    sleep(200)

while True:
    if button_a.is_pressed():
        blink(ledRight)
    if button_b.is_pressed():
        blink(ledLeft)    
    sleep(200) 
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

def blink(led): Es ist sinnvoll für das Blinken einer LED eine Funktion zu schreiben und diese dann mit dem Paramater leftLED, bzw. rightLED 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
So wie man es von Mausklicks kennt, möchte man hier mit einem Button-Klick ein laufendes Programm unterbrechen und eine andere Aktion ausführen. 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 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(0)
    sleep(1000)
    ledLeft.write_digital(0)
    ledRight.write_digital(1)
    sleep(1000)

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 *: Iimportiert 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 anstelle einer while True -Schleife eine while-Schleife zu verwenden, die nur so lange wiederholt wird, bis ein Button gedrückt wurde.

So lange im folgenden Beispiel 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 exit().

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

setSpeed(15)
forward()
while not button_a.was_pressed():
    d = getDistance()
    if d < 100:
        backward()
        sleep(1000)
        forward()
    sleep(200)
exit() 
► 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 jeweils einen Bewegung auf einem Kreisbogen. 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 in der letzten Zeile stehende Nachricht ( String "text") wird im Programm mit for c in text: durchgelaufen, jedes Zeichen entsprechend mit dot und dash codiert und abgespielt.

# 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)
    sleep(dt)

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

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

transmit("ich komme heute abend")
► In Zwischenablage kopieren