update() calls attach() on first run

attach() is now called the first time update() is run so the pin setup
is before attach(). I also removed previous_millis_retrigger to save 4
bytes. Also updated retrigger.ino example with a few more comments.
This commit is contained in:
Albert Phan
2015-03-27 10:16:17 -07:00
parent d75d7d0bba
commit de9fb2d9c0
4 changed files with 81 additions and 74 deletions
+2 -1
View File
@@ -2,4 +2,5 @@ examples/retrigger/Debug/Makefile
*.atsuo
examples/retrigger/retrigger.cppproj
*.xml
examples/retrigger/Visual Micro/.retrigger.vsarduino.h
examples/retrigger/Visual Micro/.retrigger.vsarduino.h
*.a
+73 -66
View File
@@ -11,15 +11,17 @@
#define UNSTABLE_STATE 1
#define STATE_CHANGED 3
#define STATE_HELD_ON 4
#define FIRSTUPDATE 5
Bounce::Bounce(int pin, uint16_t interval_millis, uint16_t interval_retrigger, uint16_t interval_hold)
{
attach(pin);
this->pin = pin;
interval(interval_millis);
holdinterval(interval_hold);
retriggerinterval(interval_retrigger);
previous_millis_retrigger = 0;
state = _BV(FIRSTUPDATE);
}
void Bounce::attach(int pin) {
@@ -53,77 +55,82 @@ void Bounce::retriggerinterval(uint16_t interval_retrigger)
bool Bounce::update()
{
#ifdef BOUNCE_LOCK_OUT
state &= ~_BV(STATE_CHANGED);
// Ignore everything if we are locked out
if (millis() - previous_millis >= interval_millis) {
// Attaches the pin the first time update is called
if(state & _BV(FIRSTUPDATE))
{
attach(pin);
state &= _BV(FIRSTUPDATE);
}
else
{
#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);
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);
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) {
// If the reading is different from last reading, reset the debounce counter
if ( currentState != (bool)(state & _BV(UNSTABLE_STATE)) ) {
previous_millis = millis();
state ^= _BV(DEBOUNCED_STATE);
state |= _BV(STATE_CHANGED);
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);
}
}
}
#endif
//code for checking if state has been held on >= 500ms or interval_hold
// If state has changed and has not been held on previously
if(state & _BV(STATE_CHANGED) && !(state & _BV(STATE_HELD_ON)))
{
//If state has been changed before 500ms since last change, reset state change timer
if(millis() - previous_millis_state_changed < interval_hold)
{
previous_millis_state_changed = 0;
}
else
{
previous_millis_state_changed = millis();
}
}
// If state has changed and has been held on previously
else if(state & _BV(STATE_CHANGED) && (state & _BV(STATE_HELD_ON)))
{
// Immediately turn off held on state
state &= ~_BV(STATE_HELD_ON);
previous_millis_state_changed = 0;
}
else if(previous_millis_state_changed != 0)
{
//if button has been at a debounced state for >= 500ms
if(millis() - previous_millis_state_changed >= interval_hold)
#endif
//code for checking if state has been held on >= 500ms or interval_hold
// If state has changed and has not been held on previously
if(state & _BV(STATE_CHANGED) && !(state & _BV(STATE_HELD_ON)))
{
state |= _BV(STATE_HELD_ON);
//If state has been changed before 500ms since last change, reset state change timer
if(millis() - previous_millis_state_changed < interval_hold)
{
previous_millis_state_changed = 0;
}
else
{
previous_millis_state_changed = millis();
}
}
// If state has changed and has been held on previously
else if(state & _BV(STATE_CHANGED) && (state & _BV(STATE_HELD_ON)))
{
// Immediately turn off held on state
state &= ~_BV(STATE_HELD_ON);
previous_millis_state_changed = 0;
}
else if(previous_millis_state_changed != 0)
{
//if button has been at a debounced state for >= 500ms
if(millis() - previous_millis_state_changed >= interval_hold)
{
state |= _BV(STATE_HELD_ON);
previous_millis_state_changed = 0;
}
}
return state & _BV(STATE_CHANGED);
}
return state & _BV(STATE_CHANGED);
}
bool Bounce::retrigger()
@@ -131,19 +138,19 @@ bool Bounce::retrigger()
// if button is being held
if(this->held())
{
if(previous_millis_retrigger != 0)
if(previous_millis_state_changed != 0)
{
// Checks if it has been longer that retrigger time
if (millis() - previous_millis_retrigger >= interval_retrigger)
if (millis() - previous_millis_state_changed >= interval_retrigger)
{
previous_millis_retrigger = millis();
previous_millis_state_changed = millis();
return true;
}
}
else
{
// sets the millis when first going into function
previous_millis_retrigger = millis();
previous_millis_state_changed = millis();
return false;
}
+1 -2
View File
@@ -75,13 +75,12 @@ class Bounce
// Returns 0 if not
bool held();
// After the button has been held down, retriggers every interval_repeat(default is 50 ms)
// After the button has been held down, returns a 1 every interval_repeat(default is 50 ms)
bool retrigger();
protected:
unsigned long previous_millis;
unsigned long previous_millis_state_changed;
unsigned long previous_millis_retrigger;
uint16_t interval_hold;
uint16_t interval_retrigger;
uint16_t interval_millis;
+5 -5
View File
@@ -31,7 +31,6 @@ unsigned long buttonPressTimeStamp;
unsigned char ledState = 0;
void setup() {
Serial.begin(57600);
// Setup the button
@@ -47,15 +46,16 @@ void loop() {
// Update the debouncer
debouncer.update();
// If button had a rising transition, turn on led.
if(debouncer.rose())
{
ledState = 1;
digitalWrite(LED_PIN, ledState);
buttonPressTimeStamp = millis();
buttonPressTimeStamp = millis();
Serial.print(buttonPressTimeStamp);
Serial.println(" Button rose!");
}
// toggle led everytime it retriggers
// After holding down the button, retrigger returns a 1 every interval_hold (default = 50 ms)
if (debouncer.retrigger())
{
buttonPressTimeStamp = millis();
@@ -65,12 +65,12 @@ void loop() {
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
}
// When button has a falling transition, turn off led.
if(debouncer.fell())
{
ledState = 0;
digitalWrite(LED_PIN, ledState);
buttonPressTimeStamp = millis();
buttonPressTimeStamp = millis();
Serial.print(buttonPressTimeStamp);
Serial.println(" Button fell!");
}