Reaktionstest
Arduino C++Bau auf dem Board, das du gerade gebaut hast, ein Reaktionsspiel. Die LED an Pin 13 leuchtet nach zufälligen 1 bis 3 s auf; der Spieler drückt so schnell er kann den Taster an D2 (nach GND verdrahtet), und die Zeit von der LED bis zum Druck wird ausgegeben, zum Beispiel als Reaction: 312 ms. Ein Druck vor der LED gibt Too soon! aus. Nach jedem Druck geht die LED aus, und eine neue Runde beginnt. Fang den Druck mit einem Interrupt an D2 ab, entprell ihn und miss alle Zeiten mit millis(), niemals mit delay().
Prüfungen
- Noch nicht ausgeführtNutzt attachInterrupt, INPUT_PULLUP und millis() und niemals delay()
- Noch nicht ausgeführtDie LED bleibt zuerst dunkel
- Noch nicht ausgeführtDie LED leuchtet innerhalb von 3 s
- Noch nicht ausgeführtEin Druck schaltet die LED sofort aus und startet eine neue Runde
- Noch nicht ausgeführtGibt die Reaktionszeit aus, zum Beispiel Reaction: 312 ms
- Noch nicht ausgeführtEin Druck vor der LED gibt Too soon! aus
Tipps
- attachInterrupt(digitalPinToInterrupt(2), onFall, FALLING) führt onFall in dem Moment aus, in dem D2 fällt. Halt die Interrupt-Routine kurz: millis() in einer volatile-Variablen merken und ein Flag setzen.
- Kontakte prellen beim Drücken ein paar Millisekunden lang und beim Loslassen noch einmal. Zähl eine Flanke nur, wenn der Pin 20 ms später immer noch LOW liest.
- Kein delay(): Speicher, wann die LED angehen soll, millis() + random(1000, 3001), und vergleich in loop() mit (long)(millis() - goAt) >= 0, was auch den Überlauf von millis() übersteht.
- Kopier, was der Interrupt schreibt, bei ausgeschalteten Interrupts (noInterrupts() … interrupts()): Ein unsigned long hat 4 Bytes, und der AVR liest ihn Byte für Byte.