Projekt 1
Gebremste Schleife
Du hast vorhin gesehen, dass die Schleife in der Regel viel zu schnell abgearbeitet wird. Deshalb müssen wir sie bremsen.
Beispiel mit dem Hochzählen einer Zahl
Meist reicht es, wenn die while-Scheife zum Beispiel zehnmal pro Sekunde durchlaufen wird (also alle 100 Millisekunden einmal). Das erreichst du, indem bei jedem Schleifendurchlauf der Befehl wait(100) ausgeführt wird, der das Programm 100 Millisekunden ruhen lässt.
Aufgabe 1
Gib den folgenden Code ein und lasse das Programm laufen. Schaffst du es, den Taster so kurz wie möglich zu drücken, dass im Display immer nur eine Zahl hochzählt?
touch_sensor = TouchSensor(Port.S1) counter = 0 while True: if touch_sensor.pressed(): ev3.screen.clear() ev3.screen.draw_text(50, 60, counter) counter = counter + 1; wait(100)
Jetzt wollen wir dafür sorgen, dass bei einem Tastendruck, egal, wie lang er dauert, immer nur eine Zahl inkrementiert wird.
Aufgabe 1
Gib den folgenden Code ein und lasse das Programm laufen. Was hat sich in der Bedienung nun geändert zum vorherigen Programm?
touch_sensor = TouchSensor(Port.S1) counter = 0 buttonAlreadyDown = False while True: if touch_sensor.pressed(): if not buttonAlreadyDown: ev3.screen.clear() ev3.screen.draw_text(50, 60, counter) counter = counter + 1; buttonAlreadyDown = True else: buttonAlreadyDown = False wait(100)
Soll ein Druck auf den Touch-Sensor nur einmal registriert werden, so müssen wir eine zusätzliche Variable als Hilfe beiziehen. Diese speichert, ob der Sensor bereits im vorangehenden Schleifendurchlauf gedrückt war. Wir nennen sie deshalb buttonAlreadyDown und setzen ihren Wert anfänglich auf False (falsch). Wenn der Touch-Sensor betätigt wird, dann fragen wir den Wert dieser Variablen ab. Falls der Knopf vorher noch nicht unten war (not buttonAlreadyDown), spielen wir den Ton ab und setzen die Variable buttonAlreadyDown auf True (wahr). Nun wird der Ton beim nächsten Schleifendurchlauf nicht mehr abgespielt. Erst wenn wir den Touch-Sensor loslassen, wird die Variable buttonAlreadyDown wieder auf False gesetzt und ein neuerliches Drücken der Touch-Sensor lässt den Ton wieder erklingen.
Beispiel mit einem einzelnen Beep
Nochmals das Gleiche, aber mit einem Beep statt mit einer Zahl auf dem Display.
Aufgabe 1
Gib den folgenden Code ein und lasse das Programm laufen. Du siehst (resp. hörst🤣), dass beim Gedrücktlassen des Touch-Sensors immer und immer wieder ein Beep ertönt.
touch_sensor = TouchSensor(Port.S1) while True: if touch_sensor.pressed(): ev3.speaker.beep(220,100) wait(100)
Hier lösen wir das Problem genau gleich mit Hilfe der Variable buttonAlreadyDown. Der Code ist genau gleich wie vorher beim Hochzählen, nur halt mit einem Beep:
touch_sensor = TouchSensor(Port.S1) buttonAlreadyDown = False while True: if touch_sensor.pressed(): if not buttonAlreadyDown: ev3.speaker.beep(440,1000) buttonAlreadyDown = True else: buttonAlreadyDown = False wait(100)