Reaktionsspiel: Timer
Teil des Abschnitts Projekte der Arduino-Journey von Coddy. Lektion 6 von 24.
Jetzt misst das Spiel dich. Die Reaktionszeit ist die Zeit vom Aufleuchten der LED bis zu deinem Tastendruck. Deshalb muss sich das Sketch einen Zeitpunkt merken: wann es die LED eingeschaltet hat.
digitalWrite(ledPin, HIGH);
litAt = millis();
state = LIT;Wenn der Tastendruck im Zustand LIT erfolgt, ist die Differenz die Antwort:
unsigned long reaction = millis() - litAt;
Serial.print("Reaction: ");
Serial.print(reaction);
Serial.println(" ms");Das funktioniert nur, weil das Sketch niemals in einem delay() verharrt: loop() prüft die Taste tausende Male pro Millisekunde, sodass der Tastendruck weniger als eine Millisekunde nach seinem Auftreten erkannt wird. Die meisten Menschen brauchen 200 bis 300 ms.
Aufgabe
MittelMiss die Zeit des Spielers:
- speichere
millis()inlitAt, wenn die LED aufleuchtet - wenn der Tastendruck bei
LITeingeht, berechnemillis() - litAt - gib es als
Reaction: 250 msaus
Klicke auf Run, spiele, lies den Serial-Monitor und klicke dann auf Check.
Probier es selbst
const int ledPin = 12;
const int buttonPin = 2;
// Die drei Zustände eines Durchlaufs
enum State { READY, WAITING, LIT };
State state = READY;
int lastButton = HIGH; // der Tasterzustand bei der letzten Abfrage
unsigned long waitStart = 0; // wann die Wartezeit begann
unsigned long waitTime = 0; // wie lange diese Wartezeit dauert
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Press the button to start");
}
void loop() {
int button = digitalRead(buttonPin);
bool pressed = (button == LOW && lastButton == HIGH); // gerade gedrückt
lastButton = button;
unsigned long now = millis();
switch (state) {
case READY:
if (pressed) {
randomSeed(micros()); // der Zeitpunkt des Tastendrucks ist nie zweimal derselbe
waitTime = random(1000, 3001);
waitStart = now;
state = WAITING;
}
break;
case WAITING:
if (now - waitStart >= waitTime) {
digitalWrite(ledPin, HIGH);
state = LIT;
}
break;
case LIT:
if (pressed) {
digitalWrite(ledPin, LOW);
state = READY;
}
break;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Projekte
2Reaktionsspiel
Reaktionsspiel: Zufällige WartezeitReaktionsspiel: TimerReaktionsspiel: FehlstartReaktionsspiel: BestzeitÜbe selbstständig: Arduino-Playground