Menu
CoddyTech

Gioco di reazione: tempo migliore

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

Lo sketch conserva il tempo migliore (più basso) in una variabile e lo stampa dopo ogni turno.

All'inizio non c'è ancora un tempo migliore. Usa un valore che nessun turno reale può avere, 0, per indicare «nessuno per ora». Dopo ogni turno: se non c'è ancora un tempo migliore, oppure se questo turno lo ha battuto, questo turno diventa il nuovo migliore.

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

Inseriscilo nello stato LIT, in cui un turno termina con un tempo reale. Una falsa partenza non raggiunge mai quel codice, quindi non diventa mai il record.

Il tempo migliore risiede nella memoria della scheda (RAM), che viene cancellata quando si spegne l'alimentazione: il record dura fino a quando non premi di nuovo Run.

challenge icon

Sfida

Medio

Tieni un registro:

  • una variabile best, inizializzata a 0
  • dopo ogni round cronometrato, se best è 0 o il round è stato più veloce, salva il round come nuovo record
  • stampalo dopo ogni round come Best: 250 ms
  • le false partenze non modificano nulla

Premi Run, prova a battere il tuo record, poi Check.

Provalo tu

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

// I tre stati di un turno
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
unsigned long litAt = 0;     // quando si è acceso il 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);  // premuto proprio ora
  lastButton = button;
  unsigned long now = millis();

  switch (state) {
    case READY:
      if (pressed) {
        randomSeed(micros());  // il momento della pressione non è mai lo stesso due volte
        waitTime = random(1000, 3001);
        waitStart = now;
        state = WAITING;
      }
      break;
    case WAITING:
      if (pressed) {
        // Premuto prima che si accendesse la luce: falsa partenza.
        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 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