// programma per animazione anitra sant anna
// lo scopo è collegare i relè di un ricevitore rf a 4 canali soggetto a distrubi
// causati da altre apparecchiature elettroniche per animare l'anitra
// Definiamo i pin per i 4 ingressi pulsante 1 pin 2 , puls2 pin3, puls3 pin4, puls4 pin5
const int pulsantiPin[] = {2, 3, 4, 5};
const int numPulsanti = 4;
const int pinRele1 = 13;
const int pinRele2 = 12;
const int pinRele3 = 11;
const int pinRele4 = 10;
const int pinRele5 = 9;
const int pinRele6 = 8;
const int pinRele7 = 7;
const int pinRele8 = 6;
int statoRele2 = HIGH; //serve per ricordare lo stato del relè per fare il relè passo-passo
int statoRele8 = HIGH; //serve per ricordare lo stato del relè per fare il relè passo-passo
// 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); // sgancio ali
pinMode (pinRele2, OUTPUT); // movimento ali
pinMode (pinRele3, OUTPUT); // sparo 1
pinMode (pinRele4, OUTPUT); // sparo 2
pinMode (pinRele5, OUTPUT); // sparo 3
pinMode (pinRele6, OUTPUT); // sparo 4 predisposto
pinMode (pinRele7, OUTPUT); // sparo 5 coda
pinMode (pinRele8, OUTPUT); // predisposizione funzionante
Serial.begin(9600); // attivo seriele per controllo programma
for (int i = 0; i < numPulsanti; i++) {// faccio il giro di tutti i pulsanti
pinMode(pulsantiPin[i], INPUT_PULLUP); // li dichiaro tutti con +5v
statoPulsanti[i] = HIGH; // anche la loro memeoria di stato la metto high
ultimoStatoLettura[i] = HIGH; // la memoria della lettura la metto alta cosi parto allinenato
ultimoTempoDebounce[i] = 0; // il conteggio del tempo di controllo, che verrà poi confrontato lo metto a 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 inizia a contare
if (lettura != ultimoStatoLettura[i]) {
ultimoTempoDebounce[i] = millis();
}
//Serial.print("ultimotempoDebounce "); // mi serviva per monitor
//Serial.println(ultimoTempoDebounce[i]);
//Serial.print(" tempo trascorso di millis ");
//Serial.println(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) {
// attivo il seriale per il controllo del programma
Serial.print("Pulsante sul pin "); // leggo nella seriale che pulsante è stao premuto
Serial.print(pulsantiPin[i]);
Serial.println(" PREMUTO!");
if (pulsantiPin[i]== 2 ){ // se il pulsante 2 è stao premuto
digitalWrite(pinRele1, HIGH); // attiva lo sblocco e aspetta 5s
delay(5000);
digitalWrite(pinRele2, statoRele2); // dipende dallo statoRele2 se accende o spegne
digitalWrite(pinRele1, LOW); // spegni lo sblocco ali
statoRele2 = !statoRele2; // cambia stato , se era high diventa low e viceversa
Serial.println("fine ciclo pulsante1 pin2 "); // mi avvisa sulla seriale che è finito
}
if (pulsantiPin[i]== 3 ){ // se il pulsante è il 3 in low
// accendi un relè alla volta per 2 secondi e si attivano in sequenta gli sparacoriandoli sul dorso
digitalWrite(pinRele3, HIGH);
delay(2000);
digitalWrite(pinRele3, LOW);
digitalWrite(pinRele4, HIGH);
delay(2000);
digitalWrite(pinRele4, LOW);
digitalWrite(pinRele5, HIGH);
delay(2000);
digitalWrite(pinRele5, LOW);
digitalWrite(pinRele6, HIGH);
delay(2000);
digitalWrite(pinRele6, LOW);
Serial.println("fine ciclo pulsante 2 pin3 ");
}
if (pulsantiPin[i]== 4 ){ // se il pin 4 è low
// accendi il relè per 2 secondi e si attiva lo sparo sulla coda
digitalWrite(pinRele7, HIGH);
delay(2000);
digitalWrite(pinRele7, LOW);
Serial.println("fine ciclo pulsante3 pin 4 ");
}
if (pulsantiPin[i]== 5 ){ // se il pulsante 4 è stato premuto attiva la sequenza relè passp-passo
digitalWrite(pinRele8, statoRele8); // dipende dallo statoRele8 se accende o spegne
statoRele8 = !statoRele8; // cambia stato , se era high diventa low e viceversa
Serial.println("fine ciclo pul4 pin5 "); // mi avvisa sulla seriale che è finito
}
}
}
}
// mette a 0 il tempo di ultimoStatoLettura per il prossimo confornto di debounce
// se non è trascorso abbanza tempo del cambio di stato in questo punto azzera
ultimoStatoLettura[i] = lettura;
}
}