Come collegare un pulsante ad Arduino: pull-up, pull-down e debounce
Come si collega un pulsante ad Arduino? L'interno del pulsante a 4 piedini, resistenze di pull-up e pull-down, INPUT_PULLUP, debounce e un esempio per accendere e spegnere un LED.
Il pulsante è il componente più semplice per portare il tocco dell'utente in un progetto Arduino. Premuto unisce due contatti, rilasciato li separa. Per quanto sembri semplice, se collegato male dà letture casuali o conta una pressione più volte. In questa guida spieghiamo come collegarlo e leggerlo correttamente.

L'interno di un pulsante a 4 piedini
Il pulsante tattile da 6×6 mm, il più usato sulla breadboard, ha 4 piedini ma solo 2 punti di collegamento: le coppie di piedini opposti sono già collegate all'interno. Premendo si uniscono le due coppie. Se monti il pulsante a cavallo del canale centrale della breadboard, ogni coppia finisce in file diverse e l'orientamento giusto è facile da trovare.
Perché serve una resistenza di pull-up o pull-down?
Quando il pulsante non è premuto, il pin di ingresso di Arduino non è collegato a nulla; si parla di ingresso flottante. Un pin così raccoglie il rumore elettrico e legge HIGH o LOW a caso. La soluzione è portare il pin a un livello fisso tramite una resistenza:
| Metodo | Collegamento | Non premuto | Premuto |
|---|---|---|---|
| Pull-down | 10 kΩ pin → GND, pulsante pin → 5V | LOW | HIGH |
| Pull-up (esterna) | 10 kΩ pin → 5V, pulsante pin → GND | HIGH | LOW |
| INPUT_PULLUP (interna) | Pulsante pin → GND, nessuna resistenza | HIGH | LOW |
Il modo più pratico è usare pinMode(pin, INPUT_PULLUP): si attiva la resistenza interna di Arduino, di circa 20–50 kΩ, e colleghi solo il pulsante tra il pin e GND. L'unica differenza è che la logica si inverte: premendo si legge LOW.
Debounce: perché una pressione viene contata più volte?
Nell'istante in cui i contatti metallici si toccano, vibrano per qualche millisecondo e il circuito si apre e si chiude più volte. Poiché Arduino legge molto velocemente, può vedere una pressione come 3–5 pressioni. È il cosiddetto rimbalzo dei contatti. Per risolverlo via software si ignorano i cambiamenti per circa 50 ms dopo l'ultimo cambiamento.
const int BUTTON_PIN = 2; // buton pin ile GND arasında / button between pin and GND
const int LED_PIN = 13; // karttaki LED / onboard LED
bool ledOn = false;
int lastReading = HIGH;
int stableState = HIGH;
unsigned long lastChange = 0;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP); // dahili pull-up / internal pull-up
pinMode(LED_PIN, OUTPUT);
}
void loop() {
int reading = digitalRead(BUTTON_PIN);
if (reading != lastReading) lastChange = millis(); // değişti / changed
if (millis() - lastChange > 50 && reading != stableState) {
stableState = reading; // 50 ms kararlı / stable for 50 ms
if (stableState == LOW) { // basıldı / pressed
ledOn = !ledOn; // LED'i değiştir / toggle LED
digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
}
}
lastReading = reading;
}Questo codice cambia lo stato del LED una volta per pressione; tenendo premuto non continua a cambiare. Poiché usa millis() invece di delay(), il ciclo non si blocca e può fare altro nel frattempo.
Errori comuni
- Montare il pulsante al contrario: se usi una coppia di piedini già collegata, il pulsante risulta sempre premuto. Ruotalo di 90°.
- Non usare la resistenza: senza pull-up o pull-down la lettura cambia a caso.
- Aspettarsi la logica sbagliata con INPUT_PULLUP: premendo si legge LOW, non HIGH; scrivi le condizioni di conseguenza.
- Usare un lungo delay() come debounce: il programma non può fare nulla in quel tempo; è meglio temporizzare con millis().
- Usare i pin 34–39 dell'ESP32: non hanno pull-up interno; aggiungi una resistenza esterna o scegli un altro pin.
Per posizionare bene pulsante e resistenza sulla breadboard leggi Che cos'è una breadboard?; per capire i valori di pull-up, Che cos'è una resistenza?.
Domande frequenti
Che resistenza serve per un pulsante?
10 kΩ è il valore standard per pull-up o pull-down. Con INPUT_PULLUP non serve nessuna resistenza esterna.
Perché il pulsante legge LOW quando lo premo?
Con INPUT_PULLUP o un pull-up esterno il pin è normalmente HIGH; il pulsante lo collega a GND, quindi premendo legge LOW. È il comportamento previsto.
Quanto deve durare il debounce?
20–50 ms bastano per la maggior parte dei pulsanti. Quelli vecchi o di bassa qualità possono richiedere 80–100 ms.
Come leggo più pulsanti?
Collega ogni pulsante a un proprio pin e impostali tutti come INPUT_PULLUP. Per molti pulsanti si usa un tastierino (keypad) o si leggono su un solo pin analogico con resistenze diverse.
Progetti da realizzare dopo questo articolo
Vedi tutti i progetti
Bruciatura a led con pulsante (Push)
Progetto di controllo istantaneo (push) che accende il LED quando il pulsante viene premuto e lo spegne quando viene rilasciato. Insegna l'uso della lettura dei pulsanti e dell'espressione condizional

Led bruciato con pulsante (On Off)
Un progetto di commutazione che cambia lo stato del LED (acceso/spento) a ogni pressione del pulsante. Insegna la logica della variabile di stato e del debounce.

Pianoforte semplice con cicalino e pulsante
Con 8 pulsanti e cicalino, semplice progetto di pianoforte in grado di suonare note dal do al do acuto. Insegna a simulare uno strumento musicale assegnando frequenze diverse a ciascun pulsante.

Display a 7 segmenti e contatore con pulsante
Progetto di contatore che aumenta, diminuisce e azzera il numero sul display a 7 segmenti con 3 pulsanti. Insegna il controllo dei confini e la logica interattiva del contatore.

Controllo LED ESP32 con pulsante (Push)
Il LED si accende quando il pulsante viene premuto e si spegne quando viene rilasciato. Mostra come vengono utilizzati il pin di ingresso digitale dell'ESP32 e la resistenza di pull-up interna. Grazie alla modalità INPUT_PULLUP, non è necessaria alcuna resistenza esterna.

Controllo LED ESP32 con pulsante (a levetta)
Ogni volta che si preme il pulsante, lo stato del LED cambia: se è acceso si spegne, se è spento si accende. Classico schema a levetta. Con il debounce puliamo il rumore meccanico del pulsante per garantire una singola commutazione con una sola pressione.

Raspberry Pi Pico Pulsante Toggle LED (GP14 + GP2)
Pulsante + LED — livello successivo! 🔁 A differenza di #155, non serve tenere premuto. Premi e rilascia → LED acceso. Premi di nuovo → LED spento (toggle). Stesso circuito di #155, grande differenza di codice. Impara edge detection, state tracking e debounce.

Raspberry Pi Pico Pulsante Debounce: IRQ vs Software Polling (GP5 + GP4)
Una pressione e il codice conta 3-4? È contact bounce! 🔁 Confronta 2 metodi di conteggio in Serial: polling RAW (cattura bounce, conta male) vs IRQ + software debounce (preciso). Impara fisica del bounce, software debounce, Pin.irq() interrupt, IRQ_FALLING trigger, ISR handler, sicurezza delle variabili globali ISR.
Altri articoli
Scopri perché un pulsante da solo dà letture instabili, a cosa serve la resistenza di pull-up, come usare INPUT_PULLUP e come il debounce conta correttamente le pressioni.

