Chave Táctil (Push Button): Terminais, Bounce e Debounce — 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.
🔘 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)
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 = HIGHResistor 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 = LOWResistor 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)
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
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()— nuncadelay() - 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
// ⚠️ 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; }
// ✅ 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; }
#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
-
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.
-
Prefira INPUT_PULLUP no Arduino. É de graça (pull-up interno ~20 kΩ), economiza um resistor externo e funciona perfeitamente na maioria dos casos.
-
Sempre implemente debounce. Use
millis()— nuncadelay()para debounce, pois o delay() trava o microcontrolador e impede outras tarefas. -
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.
-
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.
-
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