#10Iniciante

Ligar e desligar um LED com botão

4.8(100)
167 concluído
Ligar e desligar um LED com botão
Pressione o botão uma vez para acender a luz e outra vez para apagar, como o interruptor do seu quarto. O Arduino detecta cada toque e inverte o estado do LED, aguardando um breve instante para que as pequenas oscilações dos contatos do botão não interfiram no funcionamento. É a forma mais simples de ligar e desligar com um único botão.

Vídeo

Esquema do circuito

Ligar e desligar um LED com botão - Circuit

Código-fonte

C++ (Arduino IDE)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   Ligar e desligar um LED com botão
4// ─────────────────────────────────────────
5// Cada toque no botão alterna o LED uma vez (liga/desliga). O código só
6// detecta o momento do toque (LOW -> HIGH); manter o botão pressionado não
7// faz o LED piscar. A espera de 50 ms ignora o bounce do botão.
8//
9// Pinos:
10//   D13 -> Botão, outra perna em 5V
11//   D13 -> Resistor de 10k para GND (pull-down)
12//   D7  -> LED (com resistor de 330 ohm)
13
14int ledState = 0;     // Estado do LED: 0 = desligado, 1 = ligado
15int lastButton = 0;   // Leitura anterior do botão
16
17void setup() {
18  pinMode(13, INPUT);   // Entrada do botão (pull-down externo)
19  pinMode(7, OUTPUT);   // Saída do LED
20}
21
22void loop() {
23  int button = digitalRead(13);   // Lê o botão
24  if (button != lastButton) {     // O estado do botão mudou
25    if (button == 1) {            // Só no toque (LOW -> HIGH)
26      ledState = !ledState;       // Inverte o estado
27      digitalWrite(7, ledState);
28    }
29    delay(50);                    // Espera curta para pular o bounce
30    lastButton = button;          // Guarda esta leitura
31  }
32}
33

Perguntas frequentes

O que é debounce e por que ele é necessário?

Quando um botão mecânico é pressionado, seus contatos abrem e fecham várias vezes durante alguns milissegundos (repique). O Arduino pode interpretar isso como vários toques, deixando o LED em um estado aleatório. O debounce ignora esses repiques ao aguardar um curto intervalo (por exemplo, 50 ms) após uma mudança de estado.

Por que às vezes o LED não muda de estado ou muda duas vezes?

Geralmente, o debounce está ausente ou é curto demais. Além disso, é preciso detectar apenas o instante em que o botão é "pressionado" (estado anterior: LOW, novo estado: HIGH); se o estado mudar a cada ciclo enquanto o botão estiver pressionado, o LED vai piscar e ficar em um estado aleatório.

Para que serve uma variável de estado?

Ela guarda na memória se o LED está ligado ou desligado. A cada toque válido, a variável é invertida (ledStatus = !ledStatus), e o LED é ajustado conforme esse valor.

Posso controlar LEDs diferentes com vários botões?

Sim, basta manter um pino, um estado anterior e uma variável de estado do LED separados para cada botão. Se você usar muitos botões, arrays e um código de debounce baseado em millis() deixam tudo mais organizado.