Menu
CoddyTech

Simon: Sequenza casuale

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

Ora è il turno della scheda. La prima volta che si rilascia un pulsante, il gioco inizia: la scheda sceglie quattro colori casuali, li memorizza in un array e li riproduce.

random(4) restituisce 0, 1, 2 o 3: un colore. Un ciclo for riempie l'array. Come nel gioco di reazione, inizializza il generatore con micros() alla pressione, altrimenti ogni partita riprodurrà gli stessi colori:

randomSeed(micros());
for (int i = 0; i < 4; i++) {
  sequence[i] = random(4);
}

Un secondo ciclo for riproduce lo schema: accende un colore con la sua nota, aspetta, lo spegne e aspetta di nuovo. La seconda attesa è importante quando un colore compare due volte: senza, rosso, rosso sembra un unico rosso lungo. Ora il giocatore deve solo guardare, quindi delay() va bene.

for (int i = 0; i < 4; i++) {
  lightOn(sequence[i]);
  delay(400);
  lightOff(sequence[i]);
  delay(200);
}

Un bool chiamato playing ricorda che il gioco è iniziato, così solo la prima pressione lo avvia.

challenge icon

Sfida

Medio

Fai riprodurre una sequenza alla scheda:

  • aggiungi int sequence[4]; e bool playing = false;
  • quando rilasci un pulsante e playing è false: inizializza il generatore, riempi l'array con random(4), imposta playing su true e riproduci la sequenza
  • la sequenza: attendi 500 ms, poi riproduci ogni colore con la relativa nota per 400 ms, seguiti da 200 ms di silenzio

In seguito, i pulsanti si illuminano e suonano come prima. Premi Run, premi un pulsante, poi Check.

Provalo tu

// Una voce per colore: rosso, verde, blu, giallo
const int ledPins[4] = {9, 10, 11, 12};
const int buttonPins[4] = {2, 3, 4, 5};
const int notes[4] = {262, 330, 392, 523};  // C, E, G e C acuto
const int buzzerPin = 8;

int lastState[4] = {HIGH, HIGH, HIGH, HIGH};  // l'ultima lettura di ciascun pulsante

// Accendi il colore i e suona la sua nota.
void lightOn(int i) {
  digitalWrite(ledPins[i], HIGH);
  tone(buzzerPin, notes[i]);
}

// Spegni il colore i e interrompi il suono.
void lightOff(int i) {
  digitalWrite(ledPins[i], LOW);
  noTone(buzzerPin);
}

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(ledPins[i], OUTPUT);
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
}

void loop() {
  for (int i = 0; i < 4; i++) {
    int state = digitalRead(buttonPins[i]);
    if (state == LOW && lastState[i] == HIGH) {  // premuto
      lightOn(i);
    }
    if (state == HIGH && lastState[i] == LOW) {  // rilasciato
      lightOff(i);
    }
    lastState[i] = state;
  }
}
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