Menu
CoddyTech

Gioco di reazione: timer

Fa parte della sezione Progetti del percorso Arduino di Coddy. Lezione 6 di 24.

Ora il gioco ti misura. Il tempo di reazione è il tempo che intercorre tra l'accensione del LED e la tua pressione, quindi lo sketch deve ricordare un momento: quando ha acceso il LED.

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

Quando arriva la pressione nello stato LIT, la differenza è la risposta:

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

Questo funziona solo perché lo sketch non si ferma mai in un delay(): loop() controlla il pulsante migliaia di volte ogni millisecondo, quindi la pressione viene rilevata meno di un millisecondo dopo che si verifica. La maggior parte delle persone impiega dai 200 ai 300 ms.

challenge icon

Sfida

Medio

Cronometra il giocatore:

  • salva millis() in litAt quando il LED si accende
  • quando arriva la pressione in LIT, calcola millis() - litAt
  • stampalo come Reaction: 250 ms

Premi Run, gioca, leggi il monitor seriale, poi Check.

Provalo tu

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

// I tre stati di un ciclo
enum State { READY, WAITING, LIT };
State state = READY;

int lastButton = HIGH;       // la lettura precedente del pulsante
unsigned long waitStart = 0; // quando è iniziata l'attesa
unsigned long waitTime = 0;  // quanto dura questa attesa

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);  // premuto proprio ora
  lastButton = button;
  unsigned long now = millis();

  switch (state) {
    case READY:
      if (pressed) {
        randomSeed(micros());  // il momento della pressione non è mai identico due volte
        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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Progetti

Esercitati da solo: Playground Arduino