Chave Táctil (Push Button): Terminais, Bounce e Debounce | Eletrônica Básica
Eletrônica Básica

Chave TáctilPush Button · Debounce · Pull-up / Pull-down

Você aperta uma vez, mas o circuito às vezes lê vários cliques — isso é o bounce. Entenda os 4 terminais, como tratar o problema e por que usar pull-up ou pull-down.

#chavetactil #pushbutton #debounce #pull-up #pull-down #arduino #eletronica-basica

🔘 O que é uma Chave Táctil?

A chave táctil (push button ou tact switch) é um componente que abre ou fecha um circuito quando pressionado. Ao soltar, volta ao estado original — é um contato momentâneo, não travado.

É um dos componentes mais usados em projetos com Arduino, Raspberry Pi e qualquer sistema embarcado. Simples na aparência, mas com alguns detalhes importantes que fazem toda a diferença no código.

📌 Os 4 Terminais — Como São Ligados

O push button mais comum tem 4 pinos, mas eles são ligados 2 a 2 internamente. Na prática, você só precisa usar 2 pinos (um de cada par):

Diagrama Interno — 4 Terminais (2 pares ligados)

pressionar 1 2 sempre ligados 3 4 sempre ligados contato abre/fecha Par A Par B Use 1 pino do par A + 1 pino do par B Ex: pino 1 (ou 2) → GND | pino 3 (ou 4) → pino Arduino

Os pinos 1 e 2 são sempre conectados entre si. Os pinos 3 e 4 são sempre conectados entre si. Ao pressionar, os dois pares se unem — o circuito fecha.

⬆️⬇️ Pull-up e Pull-down — Por Que São Necessários?

Sem pull-up ou pull-down, o pino de leitura do Arduino fica "flutuando" quando o botão não está pressionado — e lê valores aleatórios. O resistor garante um estado definido (HIGH ou LOW) em repouso:

⬆️ Pull-up (RECOMENDADO)

Repouso = HIGH

Resistor entre VCC e o pino. Em repouso, o pino lê HIGH. Ao pressionar, conecta ao GND → lê LOW.

  • Arduino tem pull-up interno → use INPUT_PULLUP
  • Lógica invertida: solto = HIGH, pressionado = LOW
  • Mais comum e mais simples no Arduino

⬇️ Pull-down

Repouso = LOW

Resistor entre GND e o pino. Em repouso, o pino lê LOW. Ao pressionar, conecta ao VCC → lê HIGH.

  • Arduino não tem pull-down interno → precisa de resistor externo (10 kΩ)
  • Lógica direta: solto = LOW, pressionado = HIGH
  • Use quando preferir lógica direta

Circuito Pull-up Interno do Arduino (INPUT_PULLUP)

Arduino Pino 2 INPUT_PULLUP pull-up ~20kΩ interno ativo GND BTN táctil GND Solto → lê HIGH (1) Pressionado → lê LOW (0) só 2 fios! (sem R externo)

Com pinMode(pino, INPUT_PULLUP) o Arduino ativa internamente um resistor de ~20 kΩ entre VCC e o pino. Você só precisa ligar o botão entre o pino e o GND — sem resistor externo.


⚡ O Problema do Bounce

Quando você aperta um botão, o contato mecânico vibra (oscila) várias vezes em poucos milissegundos antes de estabilizar. O Arduino é tão rápido que lê cada oscilação como um clique separado:

Sinal Real vs Sinal Esperado — Bounce

HIGH LOW tempo (ms) esperado sinal real (bounce!) oscilações ~5–20 ms de bounce

O Arduino pode ler dezenas de transições em milissegundos. Para um contador de cliques, isso seria catastrófico — um único toque conta como 10 cliques.

🛡️ Debounce — Como Resolver

💻 Debounce por Software

A abordagem mais comum. Após detectar a primeira transição, ignora leituras por ~20 ms — tempo suficiente para o bounce acabar.

  • Sem componentes extras
  • Use millis() — nunca delay()
  • Funciona para a maioria dos projetos

🔧 Debounce por Hardware

Um capacitor (100nF) em paralelo com o botão filtra as oscilações rápidas.

  • Requer capacitor externo
  • Combina com software para máxima confiabilidade
  • Ideal para projetos críticos

💻 Na Prática com Arduino

botao_sem_debounce.ino — ⚠️ problema com bounce
// ⚠️ ESTE CÓDIGO TEM BOUNCE — serve para demonstrar o problema
// Monte: botão entre pino 2 e GND (usa pull-up interno)

#define BTN_PIN 2

int contador = 0;
int estado_anterior = HIGH;

void setup() {
  pinMode(BTN_PIN, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  int estado = digitalRead(BTN_PIN);
  if (estado == LOW && estado_anterior == HIGH) {
    contador++;
    Serial.print("Cliques: ");
    Serial.println(contador);
    // ⚠️ Sem debounce → pode contar 5-10 cliques por apertar!
  }
  estado_anterior = estado;
}
botao_com_debounce.ino — ✅ debounce correto com millis()
// ✅ Debounce correto usando millis() — não trava o programa
// Monte: botão entre pino 2 e GND (usa pull-up interno)

#define BTN_PIN      2
#define DEBOUNCE_MS  20

int           estado_anterior  = HIGH;
int           estado_estavel   = HIGH;
unsigned long ultima_mudanca   = 0;
int           contador         = 0;

void setup() {
  pinMode(BTN_PIN, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  int leitura = digitalRead(BTN_PIN);
  if (leitura != estado_anterior) ultima_mudanca = millis();

  if ((millis() - ultima_mudanca) > DEBOUNCE_MS) {
    if (leitura != estado_estavel) {
      estado_estavel = leitura;
      if (estado_estavel == LOW) {
        contador++;
        Serial.print("✅ Clique #");
        Serial.println(contador);
      }
    }
  }
  estado_anterior = leitura;
}
toggle_led.ino — LED liga/desliga a cada toque
#define BTN_PIN      2
#define LED_PIN      13
#define DEBOUNCE_MS  20

bool          led_estado = false;
int           estado_ant = HIGH;
int           estado_est = HIGH;
unsigned long t_mudanca  = 0;

void setup() {
  pinMode(BTN_PIN, INPUT_PULLUP);
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  int leitura = digitalRead(BTN_PIN);
  if (leitura != estado_ant) t_mudanca = millis();
  if (millis() - t_mudanca > DEBOUNCE_MS) {
    if (leitura != estado_est) {
      estado_est = leitura;
      if (estado_est == LOW) {
        led_estado = !led_estado;
        digitalWrite(LED_PIN, led_estado);
      }
    }
  }
  estado_ant = leitura;
}

💡 Dica: Use a biblioteca Bounce2

Para projetos com vários botões, a biblioteca Bounce2 encapsula todo o debounce de forma elegante. Instale pelo Gerenciador de Bibliotecas do Arduino IDE: Sketch → Incluir Biblioteca → Gerenciar Bibliotecas → "Bounce2".


🌍 Onde a Chave Táctil É Usada

🎮

Controles e Joysticks

Botões de ação, reset, start — todo controle usa push buttons.

🔔

Campainha / Alarme

Aciona buzzers, relés ou notificações ao ser pressionado.

💡

Liga/Desliga

Toggle de LEDs, lâmpadas, motores e relés em projetos maker.

🖥️

Menus e Interfaces

Navegar em menus de displays LCD/OLED e selecionar opções.


✅ Boas Práticas com Push Button

  • 1
    Sempre use pull-up ou pull-down. Nunca deixe o pino flutuando — você vai ter leituras aleatórias que parecem bugs de software mas são problemas de hardware.
  • 2
    Prefira INPUT_PULLUP no Arduino. É de graça (pull-up interno ~20 kΩ), economiza um resistor externo e funciona perfeitamente na maioria dos casos.
  • 3
    Sempre implemente debounce. Use millis() — nunca delay() para debounce, pois o delay() trava o microcontrolador e impede outras tarefas.
  • 4
    Verifique a orientação na protoboard. A chave táctil mais comum tem 4 pinos: os 2 pinos de um lado pertencem ao mesmo par. Conecte os pinos em lados opostos da ponte central da protoboard.
  • 5
    Teste com o Monitor Serial antes de integrar ao projeto. Imprima os valores e confirme que HIGH/LOW batem com o esperado — e que o debounce está funcionando.
  • 6
    Para múltiplos botões, use a biblioteca Bounce2. Manter debounce manual para 4+ botões complica o código. A Bounce2 encapsula tudo com elegância.

🛒 Chaves, Botões e Protoboards na Mamute

Passa na loja! Rua Vitória, 125 — Santa Efigênia/SP ☕

🔘 Pronto para o projeto com botão?

Chaves tácteis, resistores, protoboards e Arduino — tudo na Mamute. Ou passa pessoalmente: Rua Vitória, 125 — Santa Efigênia/SP ☕

🛒 Ver Chaves e Botões na Mamute