🔘 Arduino • Pulsante • Debounce

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.

IngressoPulsante D7
UscitaLED D13
Debounce50 ms
In poche parole: il programma non cambia lo stato del LED appena vede una variazione sul pulsante. Aspetta che il segnale rimanga stabile per almeno 50 ms, così i piccoli rimbalzi meccanici non vengono interpretati come più pressioni.

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.

Arduino debounce antirimbalzo pulsante

Esempio del fenomeno di rimbalzo dei contatti.

Materiale necessario

🔌 Arduino Uno
💡 Diodo LED
🔘 Pulsante microinterruttore
Ω Resistenza da 10 kΩ
Ω Resistenza da 220 Ω
🔗 Cavetti di collegamento
🧩 Breadboard

🧰 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 consigliato

Link 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 Arduino

Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

Schema di collegamento

Schema Arduino pulsante come interruttore con debounce

Schema del pulsante su D7 e LED controllato via software.

Collegamenti principali

ElementoPin Arduino
PulsanteD7
LEDD13

Codice Arduino commentato

Pulsante come interruttore con debounce
/*
  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.

Toggle: l’istruzione 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 è:

Tempo antirimbalzo
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:

Ingresso con pull-up interno
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.