Menu
CoddyTech

Eliminar o bouncing de um botão

Parte da seção Entradas do Journey de Arduino da Coddy. Lição 6 de 22.

O botão desta lição é um botão de verdade, e o código inicial é o seu contador da lição anterior. Execute-o e pressione o botão uma vez: a contagem aumenta mais de uma unidade.

Dentro de um botão, dois contatos metálicos se encostam. Quando se encontram, eles quicam: por cerca de um milissegundo, se tocam, se afastam como uma mola e se tocam novamente. Soltar o botão causa o mesmo efeito. loop() lê o pino várias vezes nesse milissegundo e conta cada quique como um pressionamento.

A solução é chamada de debouncing: quando a leitura muda, aja uma vez com base nela e, em seguida, espere cerca de 20 ms para os contatos se estabilizarem antes de ler novamente. Uma pessoa nunca percebe 20 ms.

if (reading != lastReading) {
  if (reading == LOW) {
    presses++;
    Serial.println(presses);
  }
  delay(20);
}
lastReading = reading;

Espere após cada mudança, não apenas após um pressionamento: ao soltar, os contatos também quicam, e cada quique ao voltar parece um novo pressionamento.

challenge icon

Desafio

Médio

Corrija o contador para que cada pressionamento seja contado uma vez:

  • quando reading for diferente de lastReading, conte se for um pressionamento (LOW) e, em seguida, aguarde 20 ms
  • continue salvando lastReading no final de loop()

Pressione Run, pressione o botão algumas vezes e observe a contagem; em seguida, Check.

Experimente você mesmo

const int buttonPin = 2;

int presses = 0;
int lastReading = HIGH;

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

void loop() {
  int reading = digitalRead(buttonPin);
  if (reading == LOW && lastReading == HIGH) {
    presses++;
    Serial.println(presses);
  }
  lastReading = reading;
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Entradas

Pratique por conta própria: Playground de Arduino