// Dichiarazione di costanti e pin utilizzati
const int buttonPin[] = {2, 4, 7, 8, 9, 10, 11, 12};
const int pinR = 3;
const int pinG = 5;
const int pinB = 6;
const int pinSTART = 13;
const int pinSTOP = 14;
const int numButtons = 8;
const int combination[] = {1, 2, 3, 4, 5}; // Sequenza combinazione
int enteredSequence[sizeof(combination) / sizeof(combination[0])] = {0};
unsigned long lastButtonPressTime = 0;
const unsigned long debounceDelay = 300;
// Colori associati a ciascun pulsante (RGB)
const int RedLed = 8;
const int GreenLed = 9;
const int colors[][3] = {
{0, 0, 255}, // Blu
{255, 255, 0}, // Giallo
{0, 255, 255}, // Ciano
{255, 0, 255}, // Magenta
{255, 165, 0}, // Arancione
{128, 0, 0}, // Marrone
{0, 128, 128}, // Verde acqua
{128, 128, 255}, // Lavanda
{255, 0, 0}, // Rosso
{0, 255, 0} // Verde
};
bool buttonState[numButtons] = {false}; // Stato corrente dei pulsanti
bool lastButtonState[numButtons] = {false}; // Stato precedente dei pulsanti
int lastButtonIndex = -1; // Indice dell'ultimo pulsante premuto
bool hasRunLEDSequence = false; // Stato se il ciclo dei LED è già stato eseguito
void setup() {
// Imposta la modalità dei pin e inizializza il LED RGB
pinMode(pinR, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinSTART, INPUT);
pinMode(pinSTOP, OUTPUT);
digitalWrite(pinSTOP, LOW); // Imposta pinSTOP a LOW all'inizio
for (int i = 0; i < numButtons; i++) {
pinMode(buttonPin[i], INPUT_PULLUP);
}
turnOffRGB();
}
void loop() {
static int sequenceIndex = 0;
// Controlla lo stato di pinSTART
if (digitalRead(pinSTART) == LOW) {
// Se pinSTART è LOW, resetta la sequenza e metti in attesa
sequenceIndex = 0;
memset(enteredSequence, 0, sizeof(enteredSequence));
lastButtonIndex = -1; // Reimposta l'indice dell'ultimo pulsante premuto
turnOffRGB();
hasRunLEDSequence = false; // Reset dello stato del ciclo LED
return; // Esce dal loop finché pinSTART non è HIGH
} else {
if (digitalRead(pinSTART) == HIGH && !hasRunLEDSequence) {
for (int i = 0; i < numButtons; i++) {
setRGBColor(colors[i][0], colors[i][1], colors[i][2]);
delay(300);
}
turnOffRGB();
hasRunLEDSequence = true; // Imposta lo stato come eseguito
}
}
unsigned long currentTime = millis();
for (int i = 0; i < numButtons; i++) {
buttonState[i] = digitalRead(buttonPin[i]) == LOW;
if (buttonState[i] && !lastButtonState[i] && (currentTime - lastButtonPressTime) > debounceDelay) {
if (i != lastButtonIndex) { // Verifica che il pulsante corrente sia diverso dall'ultimo pulsante premuto
enteredSequence[sequenceIndex++] = i + 1;
setRGBColor(colors[i][0], colors[i][1], colors[i][2]);
delay(1000);
turnOffRGB();
lastButtonPressTime = currentTime;
lastButtonIndex = i; // Aggiorna l'indice dell'ultimo pulsante premuto
}
}
lastButtonState[i] = buttonState[i];
}
if (sequenceIndex == sizeof(combination) / sizeof(combination[0])) {
bool correctSequence = true;
for (int i = 0; i < sizeof(combination) / sizeof(combination[0]); i++) {
if (enteredSequence[i] != combination[i]) {
correctSequence = false;
break;
}
}
for (int i = 0; i < 4; i++) {
setRGBColor(colors[correctSequence ? GreenLed : RedLed][0], colors[correctSequence ? GreenLed : RedLed][1], colors[correctSequence ? GreenLed : RedLed][2]);
delay(500);
turnOffRGB();
delay(500);
}
if (correctSequence) {
digitalWrite(pinSTOP, HIGH); // Imposta pinSTOP a HIGH quando la sequenza è corretta
while (true) {
delay(10000);
/* SBLOCCATO! */
}
}
delay(1000);
turnOffRGB();
sequenceIndex = 0;
memset(enteredSequence, 0, sizeof(enteredSequence));
lastButtonIndex = -1; // Reimposta l'indice dell'ultimo pulsante premuto
}
}
void setRGBColor(int red, int green, int blue) {
analogWrite(pinR, red);
analogWrite(pinG, green);
analogWrite(pinB, blue);
}
void turnOffRGB() {
analogWrite(pinR, 0);
analogWrite(pinG, 0);
analogWrite(pinB, 0);
}