PrettyPrint

domenica 31 maggio 2020

Semplice funzione di debounce per Arduino

Una semplice funzione per la gestione della lettura di un pulsante, con Arduino ma anche con Raspberry Pi (WiringPI), che rende sintatticamente più comprensibile il codice, soprattutto quando ci sono molti pulsanti.

La funzione esegue due compiti: attendere il termine del rimbalzo dei contatti del pulsante, con una durata di tempo determinata, e attendere il rilascio del pulsante, con una durata di tempo indeterminata (governata da un ciclo while) , evitando così di eseguire nuovamente il blocco di istruzioni previsto alla pressione del pulsante e quindi provocare eventuali false letture.

E' di tipo bloccante, quindi va usata in quei sistemi in cui non sia necessaria un'esecuzione real-time, anche se il tempo di pausa è sicuramente trascurabile nella maggioranza delle applicazioni. Può essere ovviamente anche usata su un segnale ON/OFF proveniente da una fotocellula dove va acquisita solo la prima transizione.

Il tempo di attesa del rimbalzo va trovato sperimentalmente; nel mio caso 10ms sono risultati più che suffcienti.

Il programma di prova, quando si preme il tasto commuta lo stato di un LED e incrementa una variabile n stampandola sul monitor seriale

Per quanto riguarda l'hardware: il pin 4 è collegato a massa mediante un resistore pull-down da 10kΩ e il pulsante NO fra il pin 4 e +5V.  Il LED (rosso) è collegato al pin 9 mediante un classico resistore di limitazione da 220Ω .. 270Ω


const int pin_led = 9;
const int pin_btn = 4;                  
int stato_led=0;
int n=0;

void setup()
{ pinMode(pin_btn, INPUT); pinMode(pin_led, OUTPUT);
   digitalWrite(pin_led, stato_led);
   Serial.begin(9600);
}

void loop()
{
   if (btnPressed(pin_btn, HIGH))
{ stato_led = !stato_led; digitalWrite(pin_led, stato_led); Serial.println(++n); } } // LEVEL è il livello logico associato alla pressione del pulsante int btnPressed(const int pin_btn, const int LEVEL) { int res=0; if (digitalRead(pin_btn)==LEVEL) { delay(10); // aspetta esaurirsi rimbalzo if (digitalRead(pin_btn)==LEVEL) // rimbalzo terminato res = 1; while (digitalRead(pin_btn)==LEVEL) // aspetta rilascio pulsante delay(1); } return res; }


Sintassi evidenzata by hilite.me (emacs style)

Nessun commento:

Posta un commento