Single, double, triple press button to control LED - control problem
hi all,
i need 1 me solve problem since i'm stuck while.
i'm writing program control 3 leds single press button.
by pressing once --> green led on
by pressing twice ---> red led on
by pressing thrice ---> blue led on
ect.
i found tutorial. however, didn't work me when putting 2 parts together. i'm new bee. can 1 please have quick see whether they @ appropriate position. program complied however, there no response on neither leds or press button when running program.
thanks
http://jmsarduino.blogspot.ca/2009/10/4-way-button-click-double-click-hold.html
i need 1 me solve problem since i'm stuck while.
i'm writing program control 3 leds single press button.
by pressing once --> green led on
by pressing twice ---> red led on
by pressing thrice ---> blue led on
ect.
i found tutorial. however, didn't work me when putting 2 parts together. i'm new bee. can 1 please have quick see whether they @ appropriate position. program complied however, there no response on neither leds or press button when running program.
thanks
http://jmsarduino.blogspot.ca/2009/10/4-way-button-click-double-click-hold.html
code: [select]
#define buttonpin 28 // analog input pin use digital input on arduino uno board a5 pin
#define ledpin1 12 // digital output pin led 1
#define ledpin2 13 // digital output pin led 2
#define ledpin3 15 // digital output pin led 3
#define ledpin4 14 // digital output pin 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
//=================================================
// button timing variables
int debounce = 20; // ms debounce period prevent flickering when pressing or releasing button
int dcgap = 250; // max ms between clicks double click event
int holdtime = 2000; // ms hold period: how long wait press+hold event
int longholdtime = 5000; // ms long hold period: how long wait press+hold event
// other button variables
boolean buttonval = high; // value read button
boolean buttonlast = high; // buffered value of button's previous state
boolean dcwaiting = false; // whether we're waiting double click (down)
boolean dconup = false; // whether register double click on next release, or whether wait , click
boolean singleok = true; // whether it's ok single click
long downtime = -1; // time button pressed down
long uptime = -1; // time button released
boolean ignoreup = false; // whether ignore button release because click+hold triggered
boolean waitforup = false; // when held, whether wait event
boolean holdeventpast = false; // whether or not hold event happened already
boolean longholdeventpast = false;// whether or not long hold event happened already
int checkbutton()
{
int event = 0;
// read state of button
buttonval = digitalread(buttonpin);
// button pressed down
if (buttonval == low && buttonlast == high && (millis() - uptime) > debounce) {
downtime = millis();
ignoreup = false;
waitforup = false;
singleok = true;
holdeventpast = false;
longholdeventpast = false;
if ((millis()-uptime) < dcgap && dconup == false && dcwaiting == true) dconup = true;
else dconup = false;
dcwaiting = false;
}
// button released
else if (buttonval == high && buttonlast == low && (millis() - downtime) > debounce) {
if (not ignoreup) {
uptime = millis();
if (dconup == false) dcwaiting = true;
else {
event = 2;
dconup = false;
dcwaiting = false;
singleok = false;
}
}
}
// test normal click event: dcgap expired
if ( buttonval == high && (millis()-uptime) >= dcgap && dcwaiting == true && dconup == false && singleok == true) {
event = 1;
dcwaiting = false;
}
// test hold
if (buttonval == low && (millis() - downtime) >= holdtime) {
// trigger "normal" hold
if (not holdeventpast) {
event = 3;
waitforup = true;
ignoreup = true;
dconup = false;
dcwaiting = false;
//downtime = millis();
holdeventpast = true;
}
// trigger "long" hold
if ((millis() - downtime) >= longholdtime) {
if (not longholdeventpast) {
event = 4;
longholdeventpast = true;
}
}
}
buttonlast = buttonval;
return event;
}
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);
serial.begin(9600);
}
void loop()
{
// button event , act accordingly
int b = checkbutton();
if (b == 1) clickevent();
if (b == 2) doubleclickevent();
if (b == 3) holdevent();
if (b == 4) longholdevent();
}
//=================================================
// events trigger click , press+hold
void clickevent() {
ledval1 = !ledval1;
digitalwrite(ledpin1, ledval1);
serial.print("i'm here 1");
}
void doubleclickevent() {
ledval2 = !ledval2;
digitalwrite(ledpin2, ledval2);
serial.print("i'm here 2");
}
void holdevent() {
ledval3 = !ledval3;
digitalwrite(ledpin3, ledval3);
}
void longholdevent() {
ledval4 = !ledval4;
digitalwrite(ledpin4, ledval4);
}
which board using? pin have attached pushbutton switch?
code: [select]
#define buttonpin 28 // analog input pin use digital input on arduino uno board a5 pin
Arduino Forum > Using Arduino > LEDs and Multiplexing > Single, double, triple press button to control LED - control problem
arduino
Comments
Post a Comment