Função para debounce de botão de pressão

Desta vez decidi reinventar a roda para perceber e experimentar o exemplo de debounce que se encontra no site do Arduino e recordar como funcionam as passagens por ponteiro ou por valor nas funções em C.

Existe uma biblioteca Arduino que implementa o mesmo algoritmo ou também se pode usar um condensador de 100 nF nos terminais do botão de pressão como solução por hardware.

Quando for necessário fazer o debounce de mais que um botão de pressão num sketch posso sempre recorrer a esta função e simplificar o código.

Sketch

/*
 * Debounce function test program
 *
 * 20111126 Luis Sismeiro
 */

/* Arduino pin definition */
const int pinButton1 = 9; // Switch pin
const int pinLed1 = 13; // LED pin

/* Switch debounce variables */
int switchValueBefore1 = 0; // aux var
int buttonStatus1 = 0; // Debounced status of switch
long debounceBegin1 = 0; // aux var
long debounceTime1 = 50; // Debounce time

void setup() {
  pinMode(pinButton1, INPUT);
  pinMode(pinLed1, OUTPUT);
}

void loop() {
  switchDebounce(&switchValueBefore1, &debounceBegin1, &buttonStatus1, pinButton1, debounceTime1);

  if (buttonStatus1 == HIGH) {
    digitalWrite(pinLed1, HIGH);
  }
  else {
    digitalWrite(pinLed1, LOW);
  }
}

/*
 * Function: switch debounce
 *
 * Based on the debounce code from
 * http://www.arduino.cc/en/Tutorial/Debounce
 *
 * switchValueBefore: temporary variable for the value read before
 * debounceBegin: variable for time count when switch is pressed
 * buttonStatus: variable for the status of the switch after debounce
 * pinSwitch: pin of the switch
 * debounceTime: debounce time definition
 *
 * Output: NA
 *
 * 20111126 Luis Sismeiro
 */
void switchDebounce(int *switchValueBefore, long *debounceBegin, int *buttonStatus, int pinSwitch, long debounceTime) {
  int switchValue = 0;

  switchValue = digitalRead(pinSwitch);

  if (switchValue != *switchValueBefore) {
    *debounceBegin = millis();
  }

  if (millis() - *debounceBegin > debounceTime) {
    *buttonStatus = switchValue;
  }

  *switchValueBefore = switchValue;
}

Etiquetas: ,

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s


%d bloggers like this: