Added possibility to attach the pin and auto set the pinMode. Attach and pinMode can now be done in 1 step. just call Bounce.attach(pin, INPUT_PULLUP) etc Fixed Header file and made all mode possible.
99 lines
2.4 KiB
C++
99 lines
2.4 KiB
C++
// Please read Bounce2.h for information about the liscence and authors
|
|
|
|
#if defined(ARDUINO) && ARDUINO >= 100
|
|
#include "Arduino.h"
|
|
#else
|
|
#include "WProgram.h"
|
|
#endif
|
|
#include "Bounce2.h"
|
|
|
|
#define DEBOUNCED_STATE 0
|
|
#define UNSTABLE_STATE 1
|
|
#define STATE_CHANGED 3
|
|
|
|
|
|
Bounce::Bounce()
|
|
: previous_millis(0)
|
|
, interval_millis(10)
|
|
, state(0)
|
|
, pin(0)
|
|
{}
|
|
|
|
void Bounce::attach(int pin) {
|
|
this->pin = pin;
|
|
bool read = digitalRead(pin);
|
|
state = 0;
|
|
if (digitalRead(pin)) {
|
|
state = _BV(DEBOUNCED_STATE) | _BV(UNSTABLE_STATE);
|
|
}
|
|
#ifdef BOUNCE_LOCK_OUT
|
|
previous_millis = 0;
|
|
#else
|
|
previous_millis = millis();
|
|
#endif
|
|
}
|
|
|
|
void Bounce::attach(int pin, int mode){
|
|
pinMode(pin, mode);
|
|
|
|
this->attach(pin);
|
|
}
|
|
|
|
void Bounce::interval(uint16_t interval_millis)
|
|
{
|
|
this->interval_millis = interval_millis;
|
|
}
|
|
|
|
bool Bounce::update()
|
|
{
|
|
#ifdef BOUNCE_LOCK_OUT
|
|
state &= ~_BV(STATE_CHANGED);
|
|
// Ignore everything if we are locked out
|
|
if (millis() - previous_millis >= interval_millis) {
|
|
bool currentState = digitalRead(pin);
|
|
if ((bool)(state & _BV(DEBOUNCED_STATE)) != currentState) {
|
|
previous_millis = millis();
|
|
state ^= _BV(DEBOUNCED_STATE);
|
|
state |= _BV(STATE_CHANGED);
|
|
}
|
|
}
|
|
return state & _BV(STATE_CHANGED);
|
|
#else
|
|
// Read the state of the switch in a temporary variable.
|
|
bool currentState = digitalRead(pin);
|
|
state &= ~_BV(STATE_CHANGED);
|
|
|
|
// If the reading is different from last reading, reset the debounce counter
|
|
if ( currentState != (bool)(state & _BV(UNSTABLE_STATE)) ) {
|
|
previous_millis = millis();
|
|
state ^= _BV(UNSTABLE_STATE);
|
|
} else
|
|
if ( millis() - previous_millis >= interval_millis ) {
|
|
// We have passed the threshold time, so the input is now stable
|
|
// If it is different from last state, set the STATE_CHANGED flag
|
|
if ((bool)(state & _BV(DEBOUNCED_STATE)) != currentState) {
|
|
previous_millis = millis();
|
|
state ^= _BV(DEBOUNCED_STATE);
|
|
state |= _BV(STATE_CHANGED);
|
|
}
|
|
}
|
|
|
|
return state & _BV(STATE_CHANGED);
|
|
#endif
|
|
}
|
|
|
|
bool Bounce::read()
|
|
{
|
|
return state & _BV(DEBOUNCED_STATE);
|
|
}
|
|
|
|
bool Bounce::rose()
|
|
{
|
|
return ( state & _BV(DEBOUNCED_STATE) ) && ( state & _BV(STATE_CHANGED));
|
|
}
|
|
|
|
bool Bounce::fell()
|
|
{
|
|
return !( state & _BV(DEBOUNCED_STATE) ) && ( state & _BV(STATE_CHANGED));
|
|
}
|