====== 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)
++++ ANTWORT |
Jetzt sollte es eigentlich möglich sein. Es ist zwar immer noch ein bisschen mühsam, aber es ist möglich.
++++
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)
++++ ANTWORT |
Eben, man kann den Touch-Sensor nur kurz drücken, oder auch ganz lange gedrückt halten; es zählt immer nur eine Zahl hoch. Man muss den Touch-Sensor konkret loslassen und erneut betätigen, damit die Zahl auf dem Display weiter um 1 hochzählt.
++++
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)