InΓ­cioβ€ΊBreadboardβ€ΊBotΓ£o com Debounce
⬀ Iniciante

πŸ”˜ BotΓ£o com Debounce

⏱️ 30 min🧩 Botão · 10kΩ pull-up · LED · Mini breadboard

Nesta pΓ‘gina

πŸ“‹
Ler um botΓ£o com resistΓͺncia pull-up e implementar debounce por software. O debounce Γ© essencial porque botΓ΅es mecΓ’nicos produzem mΓΊltiplos pulsos rΓ‘pidos numa ΓΊnica pressΓ£o.

⬆️ Pull-up vs. Pull-down

ConfiguraΓ§Γ£oBotΓ£o solto β†’ lΓͺBotΓ£o premido β†’ lΓͺResistΓͺncia
Pull-up externo (10kΞ© β†’ VCC)HIGH (5V)LOW (0V, vai a GND)Entre pino e 5V
Pull-up interno (INPUT_PULLUP)HIGHLOWInterna ao Arduino (~20–50kΞ©)
Pull-down (10kΞ© β†’ GND)LOW (0V)HIGH (5V, vai a VCC)Entre pino e GND
πŸ’‘
O Arduino tem resistΓͺncias pull-up internas activΓ‘veis com pinMode(pino, INPUT_PULLUP). Isto elimina a necessidade de resistΓͺncia externa e Γ© a abordagem mais simples para botΓ΅es.

πŸ”Œ Circuito com Pull-up Interno

1

BotΓ£o

Insere o botΓ£o na breadboard. Conecta um terminal ao pino D2 do header. Conecta o outro terminal ao GND.

2

INPUT_PULLUP

No cΓ³digo usa pinMode(2, INPUT_PULLUP) β€” activa a resistΓͺncia pull-up interna. NΓ£o precisas de resistΓͺncia externa.

3

LED de saΓ­da

Fio D13 β†’ 220Ξ© β†’ LED β†’ GND. O LED alterna de estado a cada pressΓ£o.

❌ O Problema do Bounce

ex_botao_sem_debounce.ino
// SEM DEBOUNCE β€” conta mΓΊltiplas pressΓ΅es por toque
#define BTN_PIN 2
int cont = 0;
bool estado = false;

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

void loop() {
  if (digitalRead(BTN_PIN) == LOW) { // Premido
    estado = !estado;
    digitalWrite(13, estado);
    cont++;
    Serial.println(cont);  // VΓͺs nΓΊmeros a saltar?
  }
}
⚠️
Um ΓΊnico toque no botΓ£o pode incrementar o contador vΓ‘rias (ou dezenas de) vezes. Isto Γ© o bounce β€” o contacto metΓ‘lico do botΓ£o vibra mecanicamente por alguns milissegundos.

βœ… Debounce por Software

ex_botao_debounce.ino
#define BTN_PIN       2
#define DEBOUNCE_MS   50   // 50 ms de debounce

bool          ledState      = false;
bool          lastBtnState  = HIGH;
unsigned long lastDebounce  = 0;
bool          reading        = HIGH;

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

void loop() {
  bool current = digitalRead(BTN_PIN);

  if (current != lastBtnState) {
    lastDebounce = millis();  // Reinicia temporizador
  }

  if ((millis() - lastDebounce) > DEBOUNCE_MS) {
    if (current == LOW && reading == HIGH) {
      ledState = !ledState;
      digitalWrite(13, ledState);
      Serial.println(ledState ? "ON" : "OFF");
    }
    reading = current;
  }
  lastBtnState = current;
}

πŸ† Para ir mais longe

PR.FT7_5 Β· Protoshield Β· Arduino UNO Rev3 Β· InΓ­cio Β· led.dge.medu.pt