Reaktionsspiel: Zufällige Wartezeit
Teil des Abschnitts Projekte der Arduino-Journey von Coddy. Lektion 5 von 24.
Das nächste Projekt ist ein Reaktionsspiel. Du drückst den Knopf, das Board wartet, dann leuchtet die LED auf und du drückst so schnell wie möglich erneut.
Die Wartezeit ist zufällig, sonst würdest du den Rhythmus lernen. random(1000, 3001) liefert eine ganze Zahl von 1000 bis 3000.
random() ist eine Berechnung: Nach jedem Einschalten liefert sie dieselben Zahlen in derselben Reihenfolge. randomSeed() legt fest, wo diese Folge beginnt. Initialisiere sie mit dem Zeitpunkt des Tastendrucks in Mikrosekunden, der bei jedem Spiel anders ist:
randomSeed(micros());
waitTime = random(1000, 3001);Das Spiel ist eine Zustandsmaschine mit drei Zuständen: READY (wartet auf einen Tastendruck), WAITING (die zufällige Wartezeit) und LIT (die LED ist eingeschaltet). Für die Wartezeit wird millis() verwendet, damit spätere Schritte währenddessen den Knopf überwachen können.
Der Starter-Code ermittelt bereits pressed: Der Knopf liest jetzt LOW und hat beim letzten Mal HIGH gelesen. Dieser Knopf prellt nicht, daher ist keine Entprellung erforderlich.
Aufgabe
MittelDer Taster ist an Pin 2 und die LED an Pin 12 angeschlossen. Fülle die drei Zustände aus:
READY: Ein Tastendruck setzt den Startwert mitmicros(), wählt eine Wartezeit von 1000 bis 3000 ms, speichert die Startzeit und wechselt zuWAITINGWAITING: Wenn die Wartezeit vorbei ist, schalte die LED ein und wechsle zuLITLIT: Ein Tastendruck schaltet die LED aus und wechselt zuREADY
Klicke auf Run, spiele ein paar Runden und klicke dann auf Check.
Probier es selbst
const int ledPin = 12;
const int buttonPin = 2;
// Die drei Zustände einer Runde
enum State { READY, WAITING, LIT };
State state = READY;
int lastButton = HIGH; // der zuletzt gelesene Wert des Tasters
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;
// READY: Ein Tastendruck startet die Wartezeit
// WAITING: Wenn die Wartezeit vorbei ist, schalte die LED ein
// LIT: Ein Tastendruck schaltet die LED aus und das Spiel ist wieder bereit
}
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