Botão sem ruído

Este exemplo demonstra o uso de um interruptor como uma chave: cada vez que é pressionado, o LED (ou o que for) é ligado (se estiver desligado) e vice-versa. Além disso, também funciona como filtro para o ruído mecânico característico dos interruptores, sem o qual, ao pressionar o interruptor, detectaríamos uma seqüência de múltiplos toques. O código a seguir faz uso da função millis() para acompanhar o momento em que o interruptor é pressionado.

Circuito

O interruptor no pino 7 e o LED no pino 13.

Código


int inPin = 7;         // o número do pino de entrada
int outPin = 13;       // número do pino de saída

int state = HIGH;      // estado atual do pino de saída
int reading;           // estado atual do pino de entrada
int previous = LOW;    // estado anterior do pino de entrada

// as seguintes variáveis são do tipo ''long'' porque o tempo,
// medido em milissegundos,
// transformar-se-á logo em um valor grande demais para um ''int''
long time = 0;         // último momento em que o pino de saída foi atualizado
long debounce = 200;   // tempo do filtro, aumente se ocorrer irregularidades

void setup()
{
  pinMode(inPin, INPUT);
  pinMode(outPin, OUTPUT);
}

void loop()
{
  reading = digitalRead(inPin);

  // se acabamos de pressionar o interruptor (isto é, se a entrada
  // foi de LOW para HIGH), e esperamos o bastante desde o
  // último toque de forma a ignorar o ruído...  
  if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    // ... inverta a saída
    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;

    // ... e lembre-se do momento do último toque
    time = millis();    
  }

  digitalWrite(outPin, state);

  previous = reading;
}

Share