Pulsante Arduino come interruttore con debounce antirimbalzo
Usiamo un pulsante come vero interruttore software: alla prima pressione il LED si accende, alla seconda si spegne, evitando i falsi cambi di stato grazie al debounce.
Perché serve il debounce
Un pulsante meccanico non passa istantaneamente da aperto a chiuso. Nei primi millisecondi i contatti possono rimbalzare, generando una rapida sequenza di HIGH e LOW.
Arduino è abbastanza veloce da leggere questi rimbalzi come più pressioni consecutive. Il risultato è un LED che cambia stato più volte anche se il pulsante è stato premuto una sola volta.
Esempio del fenomeno di rimbalzo dei contatti.
Materiale necessario
🧰 Kit Arduino consigliato
Un kit completo è utile per avere breadboard, cavetti, resistenze, LED, pulsanti e molti componenti necessari per sperimentare con Arduino.
👉 Guarda il kit Arduino consigliatoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
📘 Vuoi imparare Arduino passo dopo passo?
Se vuoi approfondire e realizzare progetti più completi, puoi dare un’occhiata anche ai miei libri dedicati ad Arduino. All’interno troverai spiegazioni semplici, schemi chiari e molti progetti pratici pensati per chi parte da zero.
👉 Scopri i miei libri su ArduinoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
Schema di collegamento
Schema del pulsante su D7 e LED controllato via software.
Collegamenti principali
| Elemento | Pin Arduino |
|---|---|
| Pulsante | D7 |
| LED | D13 |
Codice Arduino commentato
/*
PULSANTE COME INTERRUTTORE CON DEBOUNCE
Pulsante -> D7
LED -> D13
Funzionamento:
- prima pressione: LED ON
- seconda pressione: LED OFF
- il debounce software evita falsi cambi di stato
dovuti al rimbalzo meccanico del pulsante
*/
const int LED_PIN = 13;
const int BUTTON_PIN = 7;
// Stato corrente del LED
bool ledState = LOW;
// Stato stabile riconosciuto del pulsante
bool buttonState = LOW;
// Ultima lettura grezza del pulsante
bool lastReading = LOW;
// Tempo minimo per considerare stabile una variazione
const unsigned long DEBOUNCE_DELAY = 50;
// Istante dell'ultima variazione rilevata
unsigned long lastDebounceTime = 0;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
digitalWrite(LED_PIN, ledState);
}
void loop() {
// Legge lo stato istantaneo del pulsante
bool reading = digitalRead(BUTTON_PIN);
// Se la lettura cambia, azzera il timer di debounce
if (reading != lastReading) {
lastDebounceTime = millis();
}
// Se il segnale è rimasto stabile abbastanza a lungo...
if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY) {
// ...e lo stato stabile è realmente cambiato
if (reading != buttonState) {
buttonState = reading;
// Cambia stato del LED soltanto sul fronte di pressione
if (buttonState == HIGH) {
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
}
}
}
// Memorizza la lettura per il ciclo successivo
lastReading = reading;
}
Come funziona lo sketch
1. Lettura del pulsante
Ad ogni ciclo Arduino legge D7 e confronta il valore appena ottenuto con la lettura precedente.
2. Avvio del timer di debounce
Quando il valore cambia, viene memorizzato l’istante con millis(). Da quel momento il programma aspetta che il segnale rimanga stabile.
3. Soglia di 50 ms
Dopo almeno 50 ms senza ulteriori cambi, la nuova lettura viene considerata valida.
4. Cambio di stato del LED
Il LED cambia stato soltanto quando viene riconosciuta una nuova pressione stabile del pulsante.
ledState = !ledState; trasforma HIGH in LOW e LOW in HIGH. È il cuore del comportamento da interruttore.Perché il codice cambia stato solo alla pressione
Il programma reagisce quando il pulsante passa allo stato HIGH stabile. Il rilascio viene comunque registrato, ma non modifica il LED. In questo modo una pressione completa corrisponde a un solo cambio di stato.
Valore del debounce
La soglia utilizzata è:
const unsigned long DEBOUNCE_DELAY = 50;
50 ms è un valore prudente per molti pulsanti meccanici. Puoi sperimentare con valori più bassi, per esempio 20–30 ms, se il pulsante risulta stabile.
Alternativa con INPUT_PULLUP
È possibile semplificare il circuito eliminando la resistenza esterna da 10 kΩ e usando la resistenza di pull-up interna di Arduino:
pinMode(BUTTON_PIN, INPUT_PULLUP);
In questa configurazione il pulsante va collegato tra pin e GND, e la logica si inverte: rilasciato = HIGH, premuto = LOW.
Simulazione Tinkercad
▶️ Apri la simulazione Tinkercad
Scarica lo sketch
⬇️ Scarica pulsante_come_interruttore_con_debounce.ino
Debug rapido
- se il LED cambia stato più volte, aumenta leggermente il debounce;
- se il pulsante non risponde, controlla il collegamento su D7;
- se il LED non si accende, verifica polarità e resistenza;
- se l’ingresso sembra casuale, controlla la resistenza da 10 kΩ;
- se usi INPUT_PULLUP, ricorda di invertire la logica;
- evita
delay()lunghi se vuoi mantenere il programma reattivo.
Varianti del progetto
- controllare un relè invece del LED;
- usare più pulsanti con debounce indipendente;
- aggiungere una pressione lunga;
- distinguere singolo clic e doppio clic;
- salvare lo stato in EEPROM;
- usare un interrupt per applicazioni specifiche;
- creare una libreria riutilizzabile per la gestione dei pulsanti.
Cosa devi ricordare
- Il pulsante è collegato a D7.
- Il LED è controllato da D13.
- Il debounce filtra i rimbalzi meccanici.
- Il tempo usato è 50 ms.
- Ogni pressione valida cambia lo stato del LED una sola volta.
millis()permette di realizzare il filtro senza bloccare il programma.
Domande frequenti
Perché il LED si accende e spegne con lo stesso pulsante?
Il programma memorizza lo stato del LED e lo inverte a ogni nuova pressione valida.
Cos’è il bounce di un pulsante?
È il rapido alternarsi dei contatti nei primi millisecondi dopo una pressione o un rilascio. Arduino può interpretarlo come più eventi.
Posso eliminare la resistenza da 10 kΩ?
Sì, usando INPUT_PULLUP e collegando il pulsante verso GND. La logica di lettura va però invertita.
Posso usare questo sistema per un relè?
Sì. Basta sostituire il LED con un’uscita verso un modulo relè adatto, mantenendo la stessa logica di toggle.

