Uno dei task più ripetitivi e per me “fastidiosi” che si ripresenta sistematicamente durante lo sviluppo di applicazioni per microcontrollers, è il debounce dei pulsanti.
Un pulsante viene utilizzato per cambiare lo stato di un pin da HIGH a LOW e viceversa, operazione che può sembrare banale, ma che nella pratica non lo è affatto. Durante il cambio di stato infatti, si presenta il cosidetto effetto rimbalzo: per una frazione di secondo (solitamente inferiore a 50ms) si verifica un continuo cambio di stato high/low che genera effetti indesiderati nel nostro software.
Il web è pieno di letteratura al riguardo per chi volesse approfondire e capire cosa accade fisicamente alla pressione di un pulsante. Lo scopo di questo breve articolo invece, è quello di offrire una soluzione semplice per aggirare l’ostacolo: il debounce.
Nel corso degli anni ho provato decine di esempi, diverse librerie di debounce, ma non ero mai realmente soddisfatto dei risultati ottenuti, sia per la difficoltà di implementazione, e sia perchè ho sempre ritenuto un esagerazione il dover utilizzare librerie con centinaia di righe di codice per questo scopo (magari sbagliandomi!). Nel tempo, prendendo spunto qui e li, sono arrivato a realizzare una classe minimale da aggiungere ai miei progetti, che non mi constringesse ogni volta a ristudiare tutto da zero. Purtroppo sono uno smemorato, ed è anche questo il motivo per il quale ho finalmente deciso di scrivere tutto quello che mi viene in mente su questo blog!
Anche questa classe è condivisa in un repository GitHub e mette a disposizione 3 semplici funzioni:
// inizializza il pulsante sul pin PIN_NUMBER
button.init(PIN_NUMBER);
// restituisce true al press
button.clicked();
// restituisce true al cambio di stato (sia press che release)
button.changed();
I passaggi che faccio quando voglio utilizzarla sono veramente semplici e li vediamo di seguito:
La aggiungo come libreria in platformio.ini che si occuperà di andarla a scaricare:
lib_deps = https://github.com/ZioTester/Simple-Classes
sul codice:
#include <Arduino.h>
// includo la libreria
#include "button.h"
//definisco l'oggetto button_a di tipo button
Button button_a;
void setup() {
Serial.begin(115200);
// inizializzo button_a su pin 23
button_a.init(23);
}
void loop() {
if(button_a.clicked()){
Serial.println("button clicked!!!");
}
}
Più semplice di così si muore!!