Debounce

Ciao a tutti, oggi parliamo del debounce ossia in italiano anti-rimbalzo. Nel terzo tutorial abbiamo visto come è possibile far accendere e spegnere un led tramite un pulsante, se noi quel pulsante lo premiamo e lo rilasciamo molto velocemente possiamo notare delle cose strane, ad esempio il led rimane sempre acceso o viceversa. Questo fenomeno capita a causa della velocita di lettura del pulsante. In parole semplici per brevi tempi arduino non capisce se abbiamo effettivamente premuto il pulsante oppure no. La cosa migliore da fare, per risolvere il problema, è fare uso della funzione millis() per tenere traccia del tempo in cui si preme il pulsante. Il circuito da fare rimane lo stesso del tutorial 3. Vediamo ora il codice da scrivere sull’IDE:

#define inPin 2  //INPUT PULSANTE
#define outPin 13  //OUTPUT LED
#define debounce 200  //Tempo di rimbalzo
int state = HIGH;  //Stato del pin OUTPUT LED
int reading;  //Lettura corrente del pin INPUT PULSANTE
int previous = LOW;  //Lettura precedente del pin INPUT PULSANTE
long time = 0;  //Ultimo tempo in cui il pin di OUTPUT è stato attivato

void setup()
{
     pinMode(inPin, INPUT);  //Imposto il pulsante come INPUT
     pinMode(outPin, OUTPUT);  //Imposto il LED come OUTPUT
}

void loop()
{
     reading = digitalRead(inPin);  //Leggo il valore in ingresso dato dal pulsante

     //Se abbiamo premuto in pulsante (HIGH) e la volta prima il suo stato
     //era LOW ed è trascorso il tempo necessario
     if (reading == HIGH && previous == LOW && millis() - time > debounce) {

         //Inverte l'OUTPUT
         if (state == HIGH)
             state = LOW;
         else
             state = HIGH;

         //Ricorda quando l'ultima volta è stato premuto il pulsante  
         time = millis();
     }

 digitalWrite(outPin, state);  //Scrivo lo stato sul LED

 previous = reading;
}

In pratica il programma legge il valore del pulsante poi passa dentro l’IF  e controlla lo stato della lettura e guarda se è trascorso il tempo necessario, se la condizione è vera allora esegue le azioni al suo interno invertendo lo stato di uscita per il led, altrimenti esce e registra lo stato corrente nelle stato passato, è un pò difficile da spiegare ma spero si sia capito 😉

Ora per chi non sa cosa sia questo simbolo && integro qui dentro la spiegazione degli operatori booleani:

&&  = (and) in italiano e

|| = (or) in italiano o

! = (not) in italiano no

E’ piu semplice spiegarli con degli esempi:

&&:     if ( a == 2 && b == 3)     Se a è uguale a 2 e b è uguale a 3

||:     if ( a == 2 || b == 3)     Se a è uguale a 2 o b è uguale a 3

!:     if (!x){Azioni}   La condizione è vera se x è falsa, ossia vengono eseguite le azioni tra le parentesi {} solo le x è falsa