#define pinRosso 11
#define pinVerde 10
#define pinBlu 9
#define pulsanteCambioColore 2
#define pulsanteSpegnimento 4
#define pulsanteSuono 7 // Questo è il tasto di VERIFICA della combinazione
#define pinBuzzer 12
// Stati colore: 0 spento, 1 rosso, 2 verde, 3 blu, 4 viola
int statoLampada = 0;
// Livelli del gioco:
// 0 = deve indovinare il VERDE
// 1 = deve indovinare il VIOLA
// 2 = deve indovinare il ROSSO (Vittoria!)
int livelloGioco = 0;
int valorePulsanteCambioColore;
int valorePulsanteSpegnimento;
int valorePulsanteSuono;
// Variabili per evitare letture doppie dei pulsanti (Debounce)
int ultimoStatoSuono = 0;
int ultimoStatoCambio = 0;
void setup() {
pinMode(pinRosso, OUTPUT);
pinMode(pinVerde, OUTPUT);
pinMode(pinBlu, OUTPUT);
pinMode(pulsanteCambioColore, INPUT);
pinMode(pulsanteSpegnimento, INPUT);
pinMode(pulsanteSuono, INPUT);
pinMode(pinBuzzer, OUTPUT);
Serial.begin(9600);
Serial.println("Gioco Iniziato! Trova il 1° colore (Verde) e premi Verifica.");
}
void loop() {
// Lettura degli input
valorePulsanteCambioColore = digitalRead(pulsanteCambioColore);
valorePulsanteSpegnimento = digitalRead(pulsanteSpegnimento);
valorePulsanteSuono = digitalRead(pulsanteSuono);
// 1. GESTIONE PULSANTE CAMBIO COLORE (Cicla tra i colori)
if (valorePulsanteCambioColore == 1 && ultimoStatoCambio == 0) {
statoLampada++;
if (statoLampada > 4) {
statoLampada = 0; // Se supera il viola, torna a spento
}
delay(50); // Piccolo anti-rimbalzo
}
ultimoStatoCambio = valorePulsanteCambioColore;
// 2. GESTIONE PULSANTE SPEGNIMENTO MANUALMENTE
if (valorePulsanteSpegnimento == 1) {
resetGioco();
}
// 3. GESTIONE PULSANTE SUONO (IL TASTO DI VERIFICA)
if (valorePulsanteSuono == 1 && ultimoStatoSuono == 0) {
// --- VERIFICA LIVELLO 1: Deve essere VERDE (statoLampada == 2) ---
if (livelloGioco == 0) {
if (statoLampada == 2) {
// Corretto!
tone(pinBuzzer, 1000, 300); // Fa un "bip" di conferma
livelloGioco = 1; // Passa al livello successivo
Serial.println("1° Colore Corretto (Verde)! Ora trova il 2° colore.");
} else {
// Sbagliato!
Serial.println("Errore al 1° colore! Lampada spenta.");
resetGioco();
}
}
// --- VERIFICA LIVELLO 2: Deve essere VIOLA (statoLampada == 4) ---
else if (livelloGioco == 1) {
if (statoLampada == 4) {
// Corretto!
tone(pinBuzzer, 1000, 300); // Altro "bip"
livelloGioco = 2; // Passa all'ultimo livello
Serial.println("2° Colore Corretto (Viola)! Ora trova il 3° colore.");
} else {
// Sbagliato!
Serial.println("Errore al 2° colore! Lampada spenta.");
resetGioco();
}
}
// --- VERIFICA LIVELLO 3: Deve essere ROSSO (statoLampada == 1) ---
else if (livelloGioco == 2) {
if (statoLampada == 1) {
// HAI VINTO LA COMBINAZIONE FINALE!
Serial.println("COMPLIMENTI! Hai indovinato tutta la combinazione (Verde-Viola-Rosso)!");
// Suono di vittoria (Melodia)
tone(pinBuzzer, 1200, 200); delay(250);
tone(pinBuzzer, 1500, 200); delay(250);
tone(pinBuzzer, 1800, 500); delay(600);
resetGioco();
} else {
// Sbagliato!
Serial.println("Errore all'ultimo colore! Lampada spenta.");
resetGioco();
}
}
delay(50); // Piccolo anti-rimbalzo
}
ultimoStatoSuono = valorePulsanteSuono;
// 4. AGGIORNAMENTO FISICO DEI LED
switch (statoLampada) {
case 0: setOff(); break;
case 1: setRosso(); break;
case 2: setVerde(); break;
case 3: setBlu(); break;
case 4: setViola(); break;
}
}
// Funzione per spegnere tutto e resettare il gioco all'inizio
void resetGioco() {
statoLampada = 0;
livelloGioco = 0;
noTone(pinBuzzer);
delay(500); // Pausa prima di ricominciare
}
// --- Funzioni Colori (Anodo Comune) ---
void setRosso() {
analogWrite(pinRosso, 0); analogWrite(pinVerde, 255); analogWrite(pinBlu, 255);
}
void setVerde() {
analogWrite(pinRosso, 255); analogWrite(pinVerde, 0); analogWrite(pinBlu, 255);
}
void setBlu() {
analogWrite(pinRosso, 255); analogWrite(pinVerde, 255); analogWrite(pinBlu, 0);
}
void setViola() {
analogWrite(pinRosso, 0); analogWrite(pinVerde, 255); analogWrite(pinBlu, 0);
}
void setOff() {
analogWrite(pinRosso, 255); analogWrite(pinVerde, 255); analogWrite(pinBlu, 255);
}
Pulsante di cambio colore
Pulsante di spegnimento