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.
Sfida
MedioTieni 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;
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Progetti
2Gioco di reazione
Gioco di reazione: attesa casualeGioco di reazione: timerGioco di reazione: falsa partenzaGioco di reazione: tempo miglioreEsercitati da solo: Playground Arduino