Simon: Ripeti il modello
Fa parte della sezione Progetti del percorso Arduino di Coddy. Lezione 15 di 24.
Dopo che la scheda ha riprodotto la sequenza, tocca a te: ripeti i quattro colori nello stesso ordine. Lo sketch ha bisogno di un altro numero, step, che conta quanti colori hai ripetuto finora. Il colore che devi premere dopo è sequence[step].
Conta una pressione quando rilasci il pulsante, come fa già il gioco per avviarsi. A quel punto la luce e la nota sono spente e lo sketch può reagire senza problemi:
void checkPress(int i) {
if (i != sequence[step]) {
Serial.println("Wrong!");
playing = false;
return;
}
step++;
if (step == 4) {
Serial.println("Well done!");
playing = false;
}
}return esce subito dalla funzione, quindi dopo un colore sbagliato non viene eseguito nulla di ciò che segue. Impostare di nuovo playing su false termina il gioco e la pressione successiva ne avvia uno nuovo.
Ogni nuova partita deve ricominciare a contare dall'inizio: imposta step = 0 in startGame().
Sfida
DifficileLascia che il giocatore risponda:
- un
int step = 0;, reimpostato a 0 instartGame() - quando si rilascia un pulsante e il gioco è
playing, chiamacheckPress(i) - un colore errato stampa
Wrong!e termina il gioco - dopo quattro colori corretti, stampa
Well done!e termina il gioco
Avvia Serial in setup(). Premi Esegui, osserva, ripeti lo schema, poi Verifica.
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 alto
const int buzzerPin = 8;
int lastState[4] = {HIGH, HIGH, HIGH, HIGH}; // l'ultima lettura di ciascun pulsante
int sequence[4]; // i colori riprodotti dalla scheda
bool playing = false; // false finché una pressione non avvia il gioco
// Accendi il colore i e riproduci 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);
}
// Riproduci la sequenza: ogni colore per 400 ms, poi 200 ms di silenzio.
void playSequence() {
delay(500);
for (int i = 0; i < 4; i++) {
lightOn(sequence[i]);
delay(400);
lightOff(sequence[i]);
delay(200);
}
}
// Scegli una nuova sequenza casuale e riproducila.
void startGame() {
randomSeed(micros());
for (int i = 0; i < 4; i++) {
sequence[i] = random(4);
}
playing = true;
playSequence();
}
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);
if (playing == false) {
startGame();
}
}
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