Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Der 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 mit micros(), wählt eine Wartezeit von 1000 bis 3000 ms, speichert die Startzeit und wechselt zu WAITING
  • WAITING: Wenn die Wartezeit vorbei ist, schalte die LED ein und wechsle zu LIT
  • LIT: Ein Tastendruck schaltet die LED aus und wechselt zu READY

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

}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Projekte

Übe selbstständig: Arduino-Playground