Menu
CoddyTech

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.

challenge icon

Wyzwanie

Średni

Przycisk 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 do WAITING
  • WAITING: gdy czas oczekiwania upłynie, zapala diodę LED i przechodzi do LIT
  • LIT: naciśnięcie wyłącza diodę LED i przechodzi do READY

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

}
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