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.
Sfida
MedioFai riprodurre una sequenza alla scheda:
- aggiungi
int sequence[4];ebool playing = false; - quando rilasci un pulsante e
playingèfalse: inizializza il generatore, riempi l'array conrandom(4), impostaplayingsutruee 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;
}
}
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