Menu
CoddyTech

Gra reakcji: stoper

Część sekcji Projekty ścieżki Arduino w Coddy. Lekcja 6 z 24.

Teraz gra mierzy Twój czas. Czas reakcji to czas od zapalenia się diody LED do naciśnięcia przycisku, więc szkic musi zapamiętać jeden moment: kiedy dioda LED się zapaliła.

digitalWrite(ledPin, HIGH);
litAt = millis();
state = LIT;

Gdy naciśnięcie nastąpi w stanie LIT, różnica jest odpowiedzią:

unsigned long reaction = millis() - litAt;
Serial.print("Reaction: ");
Serial.print(reaction);
Serial.println(" ms");

Działa to tylko dlatego, że szkic nigdy nie zatrzymuje się w delay(): loop() sprawdza przycisk tysiące razy na milisekundę, więc naciśnięcie zostaje wykryte mniej niż milisekundę po jego nastąpieniu. Większość osób potrzebuje od 200 do 300 ms.

challenge icon

Wyzwanie

Średni

Mierz czas gracza:

  • zapisz millis() w litAt, gdy zaświeci się dioda LED
  • gdy naciśnięcie nastąpi w stanie LIT, oblicz millis() - litAt
  • wyświetl wynik w formacie Reaction: 250 ms

Naciśnij Run, zagraj, odczytaj dane w monitorze portu szeregowego, a następnie naciśnij Check.

Spróbuj swoich sił

const int ledPin = 12;
const int buttonPin = 2;

// Trzy stany jednej rundy
enum State { READY, WAITING, LIT };
State state = READY;

int lastButton = HIGH;       // poprzedni odczyt stanu przycisku
unsigned long waitStart = 0; // kiedy rozpoczęło się oczekiwanie
unsigned long waitTime = 0;  // jak długo trwa to oczekiwanie

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);  // przycisk naciśnięty właśnie teraz
  lastButton = button;
  unsigned long now = millis();

  switch (state) {
    case READY:
      if (pressed) {
        randomSeed(micros());  // moment naciśnięcia nigdy nie jest dwa razy taki sam
        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;
  }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Projekty

Poćwicz samodzielnie: Edytor online Arduino