Botão Acende o LED 🔘
Controle o LED com um botão físico e aprenda sobre leitura digital e debounce
🎯 Objetivo desta atividade
Cada vez que você apertar o botão, o LED vai alternar seu estado: se estava apagado, acende; se estava aceso, apaga. Isso é chamado de comportamento "toggle" - muito usado em interruptores de verdade!
📚 Novos Conceitos
digitalRead(pino)
Lê o estado de um pino: retorna HIGH (3.3V) ou LOW (0V).
INPUT vs OUTPUT
OUTPUT: O pino envia energia (usado no LED)
INPUT: O pino recebe/lê energia (usado no botão)
⚠️ O que é Debounce?
Quando você aperta um botão físico, ele não faz um contato perfeito - ele "treme" muito rápido antes de estabilizar. O ESP32 é tão rápido que pode ler vários "apertos" em uma única pressionada!
Solução: Adicionamos um pequeno delay(30)
após detectar o botão pressionado. Isso dá tempo para o contato estabilizar.
🔧 Hardware Utilizado
LED do Kit
Conectado ao GPIO 13
Botão do Kit
Conectado ao GPIO 4
💻 Código Completo
/************************************************
* RoboCore - IoT DevKit - LoRaWAN
*
* Aprendendo a utilizar o botao e o LED do kit
***********************************************/
//Declaracao da variavel do pino do LED e do botao
const int pinoLED = 13;
const int pinoBotao = 4;
//Cria a variavel que verificara o estado do botao
int estadoBotao = 0;
//Cria a variavel que salvara o estado atual do botao
int flag = 0;
void setup() {
//Informa que o pino do LED eh saida e o pino botao eh entrada
pinMode(pinoLED, OUTPUT);
pinMode(pinoBotao, INPUT);
}
void loop() {
//Grava na variavel estadoBotao o estado atual do botao
estadoBotao = digitalRead(pinoBotao);
//Se o botao estiver pressionado aguarda 30 milisegundos,
//faz nova leitura e altera o estado atual do LED
if (estadoBotao == LOW) {
delay(30); // Debounce
estadoBotao = digitalRead(pinoBotao);
if (flag == 0) {
digitalWrite(pinoLED, HIGH);
flag = 1;
} else {
digitalWrite(pinoLED, LOW);
flag = 0;
}
while(digitalRead(pinoBotao) == LOW){
// fica aqui aguardando soltar o botao
}
}
}
🔍 Entendendo o Código
A variável "flag"
A flag é uma variável que "lembra" o estado atual do LED. Se flag = 0, significa que o LED está apagado. Se flag = 1, está aceso. É como uma memória que diz: "da última vez, eu estava assim".
Por que LOW significa pressionado?
O botão do kit RoboCore usa lógica invertida. Quando solto, o pino lê HIGH. Quando pressionado, lê LOW. Isso é comum em botões com resistor pull-up interno.
O while() no final
O while(digitalRead(pinoBotao) == LOW) é um truque:
ele "trava" o programa enquanto o botão está pressionado. Só continua quando você
SOLTAR o botão. Isso evita que o LED fique alternando enquanto você mantém o botão apertado.
📊 Fluxo do Programa
(LOW = Sim)
(liga ↔ desliga)
🏆 Desafios
Adicione Serial
Imprima "LED Ligado" ou "LED Desligado" no Monitor Serial.
Contador de cliques
Conte quantas vezes o botão foi pressionado e mostre no Serial.
📝 Teste seus Conhecimentos
Quiz Gamificado
Responda às perguntas para ganhar XP e desbloquear a próxima atividade!
Carregando quiz...