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. :rofl: 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!! :rofl: