// Definiamo i pin per i 4 ingressi
const int pulsantiPin[] = {2, 3, 4, 5};
const int numPulsanti = 4;
const int pinRele1 = 12;
const int pinRele2 = 11;
const int pinRele3 = 10;
const int pinRele4 = 9;
const int pinRele5 = 8;
const int pinRele6 = 7;
const int pinRele7 = 6;
int statoRele1 = HIGH;
int statoRele2 = HIGH;
int statoRele3 = HIGH;
int statoRele4 = HIGH;
int statoRele5 = LOW;
int statoRele6 = LOW;
int statoRele7 = LOW;
// Variabili per la gestione del debounce
int statoPulsanti[numPulsanti]; // Stato corrente filtrato
int ultimoStatoLettura[numPulsanti]; // Ultima lettura istantanea
unsigned long ultimoTempoDebounce[numPulsanti];
unsigned long ritardoDebounce = 1000; // Millisecondi di filtro
void setup() {
pinMode (pinRele1, OUTPUT);
pinMode (pinRele2, OUTPUT);
pinMode (pinRele3, OUTPUT);
pinMode (pinRele4, OUTPUT);
Serial.begin(9600);
for (int i = 0; i < numPulsanti; i++) {
pinMode(pulsantiPin[i], INPUT_PULLUP);
statoPulsanti[i] = HIGH;
ultimoStatoLettura[i] = HIGH;
ultimoTempoDebounce[i] = 0;
}
}
void loop() {
for (int i = 0; i < numPulsanti; i++) {
// 1. Leggi il valore istantaneo dal pin
int lettura = digitalRead(pulsantiPin[i]);
// 2. Se la lettura è cambiata (per rumore o pressione), resetta il timer
if (lettura != ultimoStatoLettura[i]) {
ultimoTempoDebounce[i] = millis();
}
// 3. Se è passato abbastanza tempo, la lettura è stabile
if ((millis() - ultimoTempoDebounce[i]) > ritardoDebounce) {
// Se lo stato è effettivamente cambiato
if (lettura != statoPulsanti[i]) {
statoPulsanti[i] = lettura;
// Azione alla pressione (essendo PULLUP, lo stato stabile premuto è LOW)
if (statoPulsanti[i] == LOW) {
Serial.print("Pulsante sul pin ");
Serial.print(pulsantiPin[i]);
Serial.println(" PREMUTO!");
if (pulsantiPin[i]== 3 ){
digitalWrite(pinRele1, HIGH);
delay(1000);
digitalWrite(pinRele2, statoRele2);
statoRele2 = !statoRele2;
digitalWrite(pinRele1, LOW);
if (pulsantiPin[i]== 3 ){
Serial.print("okay ");
digitalWrite(pinRele3, statoRele3);
statoRele3 = !statoRele3;
delay(3000);
digitalWrite(pinRele3, statoRele3);
digitalWrite(pinRele4, statoRele4);
statoRele4 = !statoRele4;
delay(3000);
digitalWrite(pinRele4, statoRele4);
digitalWrite(pinRele5, HIGH);
delay(3000);
digitalWrite(pinRele5, LOW);
}
}
}
}
}
// Salva la lettura per il prossimo ciclo
ultimoStatoLettura[i] = lettura;
}
}