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.
Wyzwanie
ŚredniProwadź zapis:
- zmienna
best, na początku 0 - po każdej rundzie mierzonej czasowo, jeśli
bestwynosi 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;
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Projekty
2Gra reakcji
Gra reakcji: losowe oczekiwanieGra reakcji: stoperGra reakcji: falstartGra reakcji: najlepszy czasPoćwicz samodzielnie: Edytor online Arduino