Menu
CoddyTech

Gra reakcji: najlepszy czas

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

Szkic przechowuje najlepszy (najkrótszy) czas w zmiennej i wyświetla go po każdej rundzie.

Na początku nie ma jeszcze najlepszego czasu. Użyj wartości, której nie może mieć żadna rzeczywista runda, czyli 0, aby oznaczała „jeszcze brak”. Po każdej rundzie: jeśli nie ma jeszcze najlepszego czasu lub ta runda go poprawiła, to właśnie ta runda ustanawia nowy rekord.

if (best == 0 || reaction < best) {
  best = reaction;
}
Serial.print("Best: ");
Serial.print(best);
Serial.println(" ms");

Umieść ten kod w stanie LIT, w którym runda kończy się rzeczywistym czasem. Falstart nigdy nie dociera do tego kodu, więc nigdy nie zostaje rekordem.

Najlepszy czas jest przechowywany w pamięci płytki (RAM), która jest czyszczona po wyłączeniu zasilania: rekord pozostaje do momentu ponownego naciśnięcia przycisku Run.

challenge icon

Wyzwanie

Średni

Prowadź zapis:

  • zmienna best, na początku 0
  • po każdej rundzie mierzonej czasowo, jeśli best wynosi 0 lub runda była szybsza, zapisz tę rundę jako nowy najlepszy wynik
  • wyświetlaj go po każdej rundzie jako Best: 250 ms
  • falstarty niczego nie zmieniają

Naciśnij Run, spróbuj pobić swój najlepszy wynik, 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
unsigned long litAt = 0;     // kiedy zapaliła się dioda LED

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

  switch (state) {
    case READY:
      if (pressed) {
        randomSeed(micros());  // czas naciśnięcia nigdy nie jest dwa razy taki sam
        waitTime = random(1000, 3001);
        waitStart = now;
        state = WAITING;
      }
      break;
    case WAITING:
      if (pressed) {
        // Naciśnięto przed zapaleniem się diody: falstart.
        Serial.println("Too soon!");
        state = READY;
      } else if (now - waitStart >= waitTime) {
        digitalWrite(ledPin, HIGH);
        litAt = now;
        state = LIT;
      }
      break;
    case LIT:
      if (pressed) {
        digitalWrite(ledPin, LOW);
        unsigned long reaction = now - litAt;
        Serial.print("Reaction: ");
        Serial.print(reaction);
        Serial.println(" ms");
        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