Menu
CoddyTech

Gioco di reazione: attesa casuale

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

Il prossimo progetto è un gioco di reazione. Premi il pulsante, la scheda aspetta, poi accende il LED e tu premi di nuovo il più velocemente possibile.

L'attesa è casuale, altrimenti impareresti il ritmo. random(1000, 3001) restituisce un numero intero da 1000 a 3000.

random() è un calcolo: dopo ogni accensione restituisce gli stessi numeri nello stesso ordine. randomSeed() sceglie da dove inizia quella sequenza. Inizializzala con il momento della pressione, in microsecondi, che è diverso a ogni partita:

randomSeed(micros());
waitTime = random(1000, 3001);

Il gioco è una macchina a stati con tre stati: READY (in attesa di una pressione), WAITING (l'attesa casuale) e LIT (il LED è acceso). L'attesa usa millis(), così i passaggi successivi possono controllare il pulsante durante l'attesa.

Il codice iniziale determina già pressed: il pulsante ora legge LOW e l'ultima volta leggeva HIGH. Questo pulsante non rimbalza, quindi non serve alcun debounce.

challenge icon

Sfida

Medio

Il pulsante è sul pin 2 e il LED sul pin 12. Completa i tre stati:

  • READY: una pressione imposta il seme con micros(), sceglie un'attesa da 1000 a 3000 ms, salva l'ora di inizio e passa a WAITING
  • WAITING: quando l'attesa è terminata, accendi il LED e passa a LIT
  • LIT: una pressione spegne il LED e passa a READY

Premi Run, gioca alcuni turni, 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

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;

  // READY: una pressione avvia l'attesa
  // WAITING: al termine dell'attesa, accendi il LED
  // LIT: una pressione spegne il LED e il gioco è di nuovo pronto

}
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