diff --git a/examples/demo/demo.ino b/examples/demo/demo.ino index 216dc07..1058e0a 100644 --- a/examples/demo/demo.ino +++ b/examples/demo/demo.ino @@ -50,6 +50,14 @@ void loop() { digitalWrite(LED2, led2State); } break; + case 4: + if (button2.hold()) { + led2State = true; + } else { + led2State = false; + } + digitalWrite(LED2, led2State); + break; default: mode = 0; break; diff --git a/keywords.txt b/keywords.txt index c4aef37..4eaecbd 100644 --- a/keywords.txt +++ b/keywords.txt @@ -17,6 +17,7 @@ press KEYWORD2 repeat KEYWORD2 longPress KEYWORD2 release KEYWORD2 +hold KEYWORD2 ####################################### # (KEYWORD3) diff --git a/library.properties b/library.properties index 30fa231..90976ed 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=debounced button -version=1.1.0 +version=1.2.0 author=serek4 maintainer=serek4 sentence=buttons library with debounce diff --git a/src/debouncedButton.cpp b/src/debouncedButton.cpp index d204a65..f5d3776 100644 --- a/src/debouncedButton.cpp +++ b/src/debouncedButton.cpp @@ -104,3 +104,29 @@ boolean button::relese() { } return _press; } + +boolean button::hold(int _pressDelay) { + _press = false; + if (!_buttonPressed && digitalRead(_pin) == LOW) { // press + _buttonPressed = _debounceTimer; + _pressTime = millis(); +#if DEBUG + Serial.print(_pin); + Serial.print(" hold start: "); + Serial.println(_pressTime); +#endif + } else if (_buttonPressed && millis() - _pressTime > _pressDelay && digitalRead(_pin) == LOW) { // hold + _press = true; + } else if (_buttonPressed && digitalRead(_pin) == HIGH) { // debounce + _buttonPressed++; +#if DEBUG + if (!_buttonPressed) { + _releaseTime = millis(); + Serial.print(_pin); + Serial.print(" hold stop: "); + Serial.println(_releaseTime); + } +#endif + } + return _press; +} diff --git a/src/debouncedButton.h b/src/debouncedButton.h index 36a57f9..99f3f7c 100644 --- a/src/debouncedButton.h +++ b/src/debouncedButton.h @@ -42,6 +42,11 @@ class button { * button activated on relese */ boolean relese(); + /** + * button active as long as it is pressed + * @param _pressDelay: hold time [in milliseconds], default = 0 + */ + boolean hold(int _pressDelay = 0); private: int _pin;