Yet Another Button Library (for Arduino).
This library augments the popular debounce library Bounce2 with the ability to set callbacks or easily check for the following button events:
- Press
- Release
- Hold
- Tap
- Double-tap
Setting up the button starts off the same way as setting up with Bounce2. Here is how you would set up a button on pin 6, set the pin mode to pull-up and check whether it is initially pressed down:
#include <Yabl.h>
Button button;
void setup() {
button.attach(6, INPUT_PULLUP);
if (button.down()) {
// button is down while switching on, prompt user to perform a factory reset
factoryResetPrompt();
}
}Button assumes the switch is normally-open and connected to ground which means pressing it will cause the pin to go LOW. This is the default inverted mode. If, on the other hand, the pin is set up to go HIGH when the button is pressed, call button.inverted(false) in setup().
The following code snippet sets up a callback for button press and release events:
void setup() {
button.attach(6, INPUT_PULLUP);
button.callback(onButtonPress, PRESS);
button.callback(onButtonRelease, RELEASE);
}
void onButtonPress() {
// ...
}
void onButtonRelease() {
// ...
}Callbacks are triggered when the button's state is updated by calling update() in the main loop:
void loop() {
button.update();
// ...
}Callbacks can be also be added for the events SHORT_RELEASE, LONG_RELEASE, HOLD, SINGLE_TAP and DOUBLE_TAP. In fact, sometimes you may want to have a single callback handle all events:
void setup() {
button.attach(6, INPUT_PULLUP);
button.callback(onButtonEvent);
}
void onButtonEvent(const EventInfo& info) {
switch (info.event) {
case SINGLE_TAP: /* ... */ break;
case DOUBLE_TAP: /* ... */ break;
case HOLD: /* ... */ break;
}
}An alternative to using callbacks is to check the button for activity after each update():
Button button;
void setup() {
button.attach(6, INPUT_PULLUP);
}
void loop() {
if (button.update()) {
// an event was triggered
if (button.triggered(SINGLE_TAP))
// ...
else if (button.triggered(DOUBLE_TAP))
// ...
else if (button.triggered(HOLD))
// ...
}
}Button also has two convenience functions for checking if a button was pressed or released:
void loop() {
button.update();
if (button.pressed())
digitalWrite(LED_BUILTIN, HIGH);
else if (button.released())
digitalWrite(LED_BUILTIN, LOW);
}This code is available under the MIT License.