#105Principiante

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.

4.6(39)
56 completato
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

Controllo LED ESP32 con pulsante (Toggle) - Circuit

Codice sorgente

Arduino (C++)
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}
38

FAQ

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.

Controllo LED ESP32 con pulsante (Toggle) | BlueGrays