11 Apr 2013
A slightly more complicated example now with some more logic using the same simple pushbutton circuit
/* short push toggle led on or off long push makes it blink */ int Led = 13; int Button = 7; int lastVal = LOW; int state = 0; int debug = 1; int onTime = 0; int T = 100; // 100ms 10Hz int ledOnTime = 0; int ledState = LOW; void blink() { if(state == 0) { ledState = LOW; } else if(state == 1) { ledState = HIGH; } else if(state == 2) { int time = millis(); int delta = time-ledOnTime; if(delta>T) { ledOnTime = time; // reset time point if(ledState == LOW) // toggle state { ledState = HIGH; } else { ledState = LOW; } } } digitalWrite(Led, ledState); } void setup() { if(debug) { Serial.begin(9600); } pinMode(Button, INPUT); pinMode(Led, OUTPUT); } void loop() { int val = digitalRead(Button); if(lastVal != val) // changed { if(lastVal != val && val == LOW) // falling front { int offTime = millis(); int delta = offTime-onTime; if(delta>1000) { state = 2; } else { // toggle state if(state == 0) { state = 1; } else if(state == 1) { state = 0; } else { state = 0; } } if(debug) { Serial.println(state); } } else // rising front { onTime = millis(); } } lastVal = val; blink(); }