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

Video
Schema circuito

Codice sorgente
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Controllo LED ESP32 con pulsante (Toggle)
4// ─────────────────────────────────────────
5// Ogni pressione del pulsante commuta il LED: da acceso diventa spento, da
6// spento diventa acceso. Un antirimbalzo di 50 ms garantisce che una
7// pressione dia esattamente una commutazione.
8//
9// Pin:
10// GPIO 5 -> LED rosso (con una resistenza da 220 ohm)
11// GPIO 4 -> Pulsante (altro piedino a GND)
12
13const int LED_PIN = 5; // Uscita del LED
14const int BUTTON_PIN = 4; // Ingresso del pulsante
15
16bool ledState = false; // Il LED è acceso ora?
17bool lastButton = HIGH; // Lettura precedente del pulsante
18unsigned long lastPress = 0; // Ultima pressione valida (ms)
19const unsigned long DEBOUNCE = 50; // Tempo di antirimbalzo (ms)
20
21void setup() {
22 pinMode(LED_PIN, OUTPUT);
23 pinMode(BUTTON_PIN, INPUT_PULLUP); // Legge HIGH quando non è premuto
24}
25
26void loop() {
27 bool buttonState = digitalRead(BUTTON_PIN);
28
29 // Commutare solo su un fronte HIGH -> LOW (una nuova pressione) e quando è passato il tempo di
30 // antirimbalzo
31 if (buttonState == LOW && lastButton == HIGH && (millis() - lastPress > DEBOUNCE)) {
32 ledState = !ledState;
33 digitalWrite(LED_PIN, ledState);
34 lastPress = millis();
35 }
36 lastButton = buttonState;
37}
38FAQ
Quanto dovrebbe essere il tempo di debounce?▾
Per la maggior parte dei pulsanti sono sufficienti 20–50 ms. Se il tempo è troppo breve, si continuano a rilevare i salti; se è troppo lungo, si perdono le pressioni rapide consecutive.
Quale stato devo intercettare per il toggle?▾
Rileva solo il momento in cui il pulsante viene "premuto" (passaggio da HIGH a LOW, se utilizzi INPUT_PULLUP). Per evitare di cambiare ripetutamente lo stato del LED mentre il pulsante rimane premuto, memorizza lo stato precedente del pulsante in una variabile.
È corretto utilizzare la funzione `delay()` per il debounce?▾
Funziona nei progetti semplici, ma durante il tempo di delay() l'ESP32 non può eseguire altre operazioni. Il debounce, ottenuto tenendo traccia del tempo dell'ultimo cambiamento tramite millis(), è più indicato per evitare interruzioni in operazioni come il Wi-Fi.
Il LED è in grado di ricordare il suo stato più recente quando viene spento e poi riacceso?▾
Sì, con la libreria Preferences su ESP32 puoi salvare lo stato nella memoria permanente e leggerlo all'avvio. In questo modo, anche se dovesse esserci un'interruzione di corrente, il LED si accenderà nell'ultimo stato in cui si trovava.
