Gra reakcji: losowe oczekiwanie
Część sekcji Projekty ścieżki Arduino w Coddy. Lekcja 5 z 24.
Następny projekt to gra na refleks. Naciskasz przycisk, płytka czeka, a potem zapala LED, a ty naciskasz ponownie tak szybko, jak potrafisz.
Czas oczekiwania jest losowy, bo inaczej nauczyłbyś się rytmu. random(1000, 3001) daje liczbę całkowitą od 1000 do 3000.
random() jest obliczeniem: po każdym włączeniu zasilania zwraca te same liczby w tej samej kolejności. randomSeed() wybiera, od którego miejsca zaczyna się ta sekwencja. Użyj jako ziarna momentu naciśnięcia, wyrażonego w mikrosekundach, który jest inny w każdej grze:
randomSeed(micros());
waitTime = random(1000, 3001);Gra jest maszyną stanów z trzema stanami: READY (oczekiwanie na naciśnięcie), WAITING (losowy czas oczekiwania) i LIT (LED jest włączona). Czas oczekiwania wykorzystuje millis(), dzięki czemu w kolejnych krokach można monitorować przycisk.
Kod startowy już oblicza pressed: przycisk odczytuje teraz LOW, a poprzednio odczytywał HIGH. Ten przycisk nie odbija, więc nie wymaga eliminacji drgań styków.
Wyzwanie
ŚredniPrzycisk jest podłączony do pinu 2, a dioda LED do pinu 12. Uzupełnij trzy stany:
READY: naciśnięcie inicjuje generator za pomocąmicros(), wybiera czas oczekiwania od 1000 do 3000 ms, zapisuje czas rozpoczęcia i przechodzi doWAITINGWAITING: gdy czas oczekiwania upłynie, zapala diodę LED i przechodzi doLITLIT: naciśnięcie wyłącza diodę LED i przechodzi doREADY
Naciśnij Run, rozegraj kilka rund, a następnie naciśnij Check.
Spróbuj swoich sił
const int ledPin = 12;
const int buttonPin = 2;
// Trzy stany rundy
enum State { READY, WAITING, LIT };
State state = READY;
int lastButton = HIGH; // poprzedni odczyt stanu przycisku
unsigned long waitStart = 0; // kiedy zaczęł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); // wciśnięty właśnie teraz
lastButton = button;
// READY: naciśnięcie przycisku rozpoczyna oczekiwanie
// WAITING: gdy oczekiwanie dobiegnie końca, zapal LED
// LIT: naciśnięcie przycisku wyłącza LED i gra jest znów gotowa
}
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