I nailed down code to process a button in different ways and thought it might be handy for other folks too.
This "4-way button" of "multi click" example shows four different ways to use one button-- click, double click, hold, and "long hold." LEDs light up according to the event triggered.
The motivation is getting the most input from the least physical input devices-- one button and a rotary up/down controller. Using the button for multiple functions, branching menu and value setting UIs can be built in software.
Video demo showing four events: 4-Way Button | Using a single button's timing for four funct… | Flickr
The "long hold" was an afterthought-- keep holding the button down so it does something else after a while-- and limited since it has to trigger the "normal" hold event first. It would be easy to have longer holds trigger more events, but they would all include the shorter hold events, since holds trigger when the button is held down. Wouldn't be tough to add a triple-click either, by extending the double-click logic and timekeeping, but that's not a common way to interact with a button.
The bulk of the code just sets up the button and test LEDs and events, the real content being the checkButton() function and its variables, after "MULTI-CLICK." I tried to make the sketch easy to read and the function as general as possible by only returning an event code, but welcome any suggestions for improvement.
Here's the first tab:
/* 4-Way Button: Click, Double-Click, Press+Hold, and Press+Long-Hold Test Sketch
By Jeff Saltzman
Oct. 13, 2009To keep a physical interface as simple as possible, this sketch demonstrates generating four output events from a single push-button.
- Click: rapid press and release
- Double-Click: two clicks in quick succession
- Press and Hold: holding the button down
- Long Press and Hold: holding the button for a long time
*/#define buttonPin 19 // analog input pin to use as a digital input
#define ledPin1 17 // digital output pin for LED 1
#define ledPin2 16 // digital output pin for LED 2
#define ledPin3 15 // digital output pin for LED 3
#define ledPin4 14 // digital output pin for LED 4// LED variables
boolean ledVal1 = false; // state of LED 1
boolean ledVal2 = false; // state of LED 2
boolean ledVal3 = false; // state of LED 3
boolean ledVal4 = false; // state of LED 4//=================================================
void setup() {
// Set button input pin
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH );
// Set LED output pins
pinMode(ledPin1, OUTPUT);
digitalWrite(ledPin1, ledVal1);
pinMode(ledPin2, OUTPUT);
digitalWrite(ledPin2, ledVal2);
pinMode(ledPin3, OUTPUT);
digitalWrite(ledPin3, ledVal3);
pinMode(ledPin4, OUTPUT);
digitalWrite(ledPin4, ledVal4);
}void loop() {
// Get button event and act accordingly
int b = checkButton();
if (b == 1) clickEvent();
if (b == 2) doubleClickEvent();
if (b == 3) holdEvent();
if (b == 4) longHoldEvent();
}//=================================================
// Events to triggervoid clickEvent() {
ledVal1 = !ledVal1;
digitalWrite(ledPin1, ledVal1);
}
void doubleClickEvent() {
ledVal2 = !ledVal2;
digitalWrite(ledPin2, ledVal2);
}
void holdEvent() {
ledVal3 = !ledVal3;
digitalWrite(ledPin3, ledVal3);
}
void longHoldEvent() {
ledVal4 = !ledVal4;
digitalWrite(ledPin4, ledVal4);
}