Debouncing per filtrare i microrimbalzi (funzione antirimbalzo)
La soluzione risiede nella seguente funzione, il cui scopo è effettuare il debouncing sugli ingressi a cui sono collegati pulsanti o altri contatti meccanici, restituendo quindi lo stato dell’ingresso solo dopo che questo è rimasto stabile per un certo intervallo di tempo. Questo è definito in millisecondi dalla variabile debounceDelay
, dove 20ms è un intervallo maggiore della durata di un singolo microrimbalzo e quindi è più che sufficiente.
Questa funzione va dichiarata all’inizio del listato insieme alle altre variabili:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//Funzione antirimbalzo int debounceDelay = 20; boolean debounce(int pin) { boolean state; boolean previousState; previousState = digitalRead(pin); for(int counter=0; counter < debounceDelay; counter++) { delay(1); state = digitalRead(pin); if( state != previousState) { counter = 0; previousState = state; } } return state; } |
Per impiegarla è sufficiente utilizzare l’istruzione debounce(pin)
in sostituzione all’istruzione digitalRead(pin)
.
Ecco quindi come è stato risolto il problema sul listato precedente. In questo caso quando viene premuto il pulsante viene atteso che lo stato dell’ingresso risulti stabile per almeno 20ms, quindi lo stato viene restituito stabile filtrando il segnale “sporco”.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
//Cambia lo stato del led (acceso/spento) in seguito alla pressione del pulsante. //I microrimbalzi vengono filtrati grazie all'apposita funzione richiamata in sostituzione a digitalRead(pin).. #define led_pin 3 #define button_pin 2 boolean led_state; boolean button_state; boolean previous_button_state; int debounceDelay = 20; boolean debounce(int pin) { boolean state; boolean previousState; previousState = digitalRead(pin); for(int counter=0; counter < debounceDelay; counter++) { delay(1); state = digitalRead(pin); if( state != previousState) { counter = 0; previousState = state; } } return state; } void setup() { pinMode(led_pin, OUTPUT); pinMode(button_pin, INPUT_PULLUP); } void loop() { button_state = debounce(button_pin); if(button_state==LOW && previous_button_state==HIGH) led_state = 1-led_state; previous_button_state = button_state; if(led_state==1) digitalWrite(led_pin, HIGH); else digitalWrite(led_pin, LOW); } |
Nel video seguente si può notare il corretto funzionamento del circuito.
48,003 total views, 7 views today