#105Iniciante

Controle de LED com botão no ESP32 (alternância)

Cada vez que o botão é pressionado, o estado do LED muda: se estiver aceso, apaga; se estiver apagado, acende. É o padrão clássico de alternância. Com debounce, eliminamos o ruído mecânico dos contatos do botão para garantir uma única mudança a cada pressionamento.

4.6(39)
57 concluído
Controle de LED com botão no ESP32 (alternância)
Pressione o botão uma vez e o LED acende; pressione de novo e ele apaga, como o interruptor de luz da sua casa. O ESP32 detecta o momento exato do pressionamento e ignora as pequenas oscilações dos contatos do botão, garantindo uma única mudança por vez. Aqui você aprende a lógica do botão liga/desliga presente em quase todo dispositivo.

Vídeo

Esquema do circuito

Controle de LED com botão no ESP32 (alternância) - Circuit

Código-fonte

Arduino (C++)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   ESP32 LED Control with Pushbutton (Toggle)
4// ─────────────────────────────────────────
5// Each press of the button toggles the LED: on becomes off, off becomes
6// on. A 50 ms debounce makes sure one press gives exactly one toggle.
7//
8// Pins:
9//   GPIO 5 -> Red LED (with a 220 ohm resistor)
10//   GPIO 4 -> Button (other leg to GND)
11
12const int LED_PIN = 5;      // LED output
13const int BUTTON_PIN = 4;   // Button input
14
15bool ledState = false;               // Is the LED on now
16bool lastButton = HIGH;              // Previous button reading
17bool stableButton = HIGH;            // Stable (debounced) button state
18unsigned long lastChange = 0;        // Last time the reading changed (ms)
19const unsigned long DEBOUNCE = 50;   // Debounce time (ms)
20
21void setup() {
22  pinMode(LED_PIN, OUTPUT);
23  pinMode(BUTTON_PIN, INPUT_PULLUP);  // Reads HIGH when not pressed
24}
25
26void loop() {
27  bool buttonState = digitalRead(BUTTON_PIN);
28
29  // Restart the timer whenever the reading changes
30  if (buttonState != lastButton) lastChange = millis();
31
32  // A reading that stays the same for DEBOUNCE ms counts as stable. The LED toggles once, only when
33  // the stable state turns LOW (a new press).
34  if (millis() - lastChange > DEBOUNCE && buttonState != stableButton) {
35    stableButton = buttonState;
36    if (stableButton == LOW) {
37      ledState = !ledState;
38      digitalWrite(LED_PIN, ledState);
39    }
40  }
41  lastButton = buttonState;
42}
43

Perguntas frequentes

Qual deve ser o tempo de debounce?▾

Para a maioria dos botões, 20–50 ms são suficientes. Se o tempo for curto demais, as oscilações dos contatos ainda serão detectadas; se for longo demais, pressionamentos rápidos e consecutivos não serão detectados.

Qual estado devo detectar para alternar o LED?▾

Detecte apenas o instante em que o botão é pressionado (a transição de HIGH para LOW, se estiver usando INPUT_PULLUP). Para evitar que o LED alterne repetidamente enquanto o botão estiver pressionado, armazene o estado anterior do botão em uma variável.

É correto usar `delay()` para debounce?▾

Funciona em projetos simples, mas delay() pausa a execução atual de loop(), atrasando outras operações no mesmo fluxo. Outras tarefas do ESP32 podem continuar em execução. A temporização com millis() é adequada para executar operações dentro de loop() sem bloqueá-lo.

É possível lembrar o último estado do LED após desligar e ligar?▾

Sim, no ESP32, você pode usar a biblioteca Preferences para gravar o estado na memória não volátil e lê-lo na inicialização. Assim, mesmo que a alimentação seja interrompida e volte, o LED inicia no último estado.