Blame | Last modification | View Log | RSS feed
/** Copyright (c) 2019, ArduinoGetStarted.com. All rights reserved.** Redistribution and use in source and binary forms, with or without* modification, are permitted provided that the following conditions* are met:** - Redistributions of source code must retain the above copyright* notice, this list of conditions and the following disclaimer.** - Redistributions in binary form must reproduce the above copyright* notice, this list of conditions and the following disclaimer in the* documentation and/or other materials provided with the distribution.** - Neither the name of the ArduinoGetStarted.com nor the names of its* contributors may be used to endorse or promote products derived from* this software without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY ARDUINOGETSTARTED.COM "AS IS" AND ANY EXPRESS OR* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE* DISCLAIMED. IN NO EVENT SHALL ARDUINOGETSTARTED.COM BE LIABLE FOR ANY DIRECT,* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE* POSSIBILITY OF SUCH DAMAGE.*/#include <ezButton.h>ezButton::ezButton(int pin): ezButton(pin, INTERNAL_PULLUP) {};ezButton::ezButton(int pin, int mode) {btnPin = pin;debounceTime = 0;count = 0;countMode = COUNT_FALLING;if (mode == INTERNAL_PULLUP || mode == INTERNAL_PULLDOWN) {pinMode(btnPin, mode);} else if (mode == EXTERNAL_PULLUP || mode == EXTERNAL_PULLDOWN) {pinMode(btnPin, INPUT); // External pull-up/pull-down, set as INPUT}// Set the pressed and unpressed states based on the modeif (mode == INTERNAL_PULLDOWN || mode == EXTERNAL_PULLDOWN) {pressedState = HIGH;unpressedState = LOW;} else {pressedState = LOW;unpressedState = HIGH;}previousSteadyState = digitalRead(btnPin);lastSteadyState = previousSteadyState;lastFlickerableState = previousSteadyState;lastDebounceTime = 0;}void ezButton::setDebounceTime(unsigned long time) {debounceTime = time;}int ezButton::getState(void) {return lastSteadyState;}int ezButton::getStateRaw(void) {return digitalRead(btnPin);}bool ezButton::isPressed(void) {if(previousSteadyState == unpressedState && lastSteadyState == pressedState)return true;elsereturn false;}bool ezButton::isReleased(void) {if(previousSteadyState == pressedState && lastSteadyState == unpressedState)return true;elsereturn false;}void ezButton::setCountMode(int mode) {countMode = mode;}unsigned long ezButton::getCount(void) {return count;}void ezButton::resetCount(void) {count = 0;}void ezButton::loop(void) {// read the state of the switch/button:int currentState = digitalRead(btnPin);unsigned long currentTime = millis();// check to see if you just pressed the button// (i.e. the input went from LOW to HIGH), and you've waited long enough// since the last press to ignore any noise:// If the switch/button changed, due to noise or pressing:if (currentState != lastFlickerableState) {// reset the debouncing timerlastDebounceTime = currentTime;// save the the last flickerable statelastFlickerableState = currentState;}if ((currentTime - lastDebounceTime) >= debounceTime) {// whatever the reading is at, it's been there for longer than the debounce// delay, so take it as the actual current state:// save the the steady statepreviousSteadyState = lastSteadyState;lastSteadyState = currentState;}if(previousSteadyState != lastSteadyState){if(countMode == COUNT_BOTH)count++;else if(countMode == COUNT_FALLING){if(previousSteadyState == HIGH && lastSteadyState == LOW)count++;}else if(countMode == COUNT_RISING){if(previousSteadyState == LOW && lastSteadyState == HIGH)count++;}}}