Início Atividade 2
2
BÁSICO

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)

o estado de um pino: retorna HIGH (3.3V) ou LOW (0V).

🎧 Analogia: É como perguntar ao pino: "Tem sinal chegando aí?" A resposta é sim (HIGH) ou não (LOW).

INPUT vs OUTPUT

OUTPUT: O pino envia energia (usado no LED)
INPUT: O pino recebe/lê energia (usado no botão)

💡 Lembre: LED = fala (OUTPUT), Botão = escuta (INPUT)

⚠️ 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

botao_led.ino
/************************************************
* 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

📖 Lê o botão
Botão pressionado?
(LOW = Sim)
⏱️ Espera 30ms (debounce)
Alterna o LED
(liga ↔ desliga)
🔄 Espera soltar o botão
Volta ao início

🏆 Desafios

FÁCIL

Adicione Serial

Imprima "LED Ligado" ou "LED Desligado" no Monitor Serial.

MÉDIO

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...