Created
January 31, 2015 10:47
-
-
Save maxistar/44d1cae665a30fda3d2d to your computer and use it in GitHub Desktop.
Revisions
-
maxistar created this gist
Jan 31, 2015 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,256 @@ #define DEBOUNCE 10 // button debouncer, how many ms to debounce, 5+ ms is usually plenty #define ANIMATION_STEP 10 #define LONG_PRESS 2000 //how long to go into setup mode // here is where we define the buttons that we'll use. button "1" is the first, button "6" is the 6th, etc int light1_button = 14; int light1_led = 6; int light1_on = 0; int light1_max = 255; int light1_state = 0; //0 ready int light1_step = 0; //step to go int light1_stepSetup = 1; int light1_stepLight = 4; int light1_value = 0; int light1_target = 0; int light1_setupMode = 0; long light1_pressedTime = 0; int light2_button = 15; int light2_led = 9; int light2_on = 0; // This handy macro lets us determine how big the array up above is, by checking the size #define NUMBUTTONS 2 // we will track if a button is just pressed, just released, or 'currently pressed' byte pressed[NUMBUTTONS], justpressed[NUMBUTTONS], justreleased[NUMBUTTONS]; void setup() { byte i; // set up serial port Serial.begin(9600); Serial.print("Button checker with "); Serial.print(NUMBUTTONS, DEC); Serial.println(" buttons"); // pin13 LED pinMode(13, OUTPUT); pinMode(light1_button, INPUT); digitalWrite(light1_button, HIGH); pinMode(light1_led, OUTPUT); pinMode(light2_button, INPUT); digitalWrite(light2_button, HIGH); pinMode(light2_led, OUTPUT); } void check_switches() { static byte previousstate[NUMBUTTONS]; static byte currentstate[NUMBUTTONS]; static long lasttime; byte index; //if (millis() < lasttime) { // lasttime = millis(); // we wrapped around, lets just try again //} if ((lasttime + DEBOUNCE) > millis()) { return; // not enough time has passed to debounce } // ok we have waited DEBOUNCE milliseconds, lets reset the timer lasttime = millis(); for (index = 0; index < NUMBUTTONS; index++) { justpressed[index] = 0; // when we start, we clear out the "just" indicators justreleased[index] = 0; currentstate[0] = digitalRead(light1_button); // read the button currentstate[1] = digitalRead(light2_button); // read the button if (currentstate[index] == previousstate[index]) { if ((pressed[index] == LOW) && (currentstate[index] == LOW)) { // just pressed justpressed[index] = 1; } else if ((pressed[index] == HIGH) && (currentstate[index] == HIGH)) { // just released justreleased[index] = 1; } pressed[index] = !currentstate[index]; // remember, digital HIGH means NOT pressed } //Serial.println(pressed[index], DEC); previousstate[index] = currentstate[index]; // keep a running tally of the buttons } } void pressButton(int i) { switch(i) { case 0: light1_pressedTime = millis(); if (light1_on == 1) { light1_on = 0; light1_target = 0; light1_step = -light1_stepLight; } else { light1_on = 1; light1_target = light1_max; light1_step = light1_stepLight; } break; case 1: if (light2_on == 1) { light2_on = 0; analogWrite(light2_led, 0); } else { light2_on = 1; analogWrite(light2_led, 255); } break; } } void buttonReleased(int i) { switch(i) { case 0: light1_pressedTime = 0; if (light1_setupMode == 1) { light1_setupMode = 0; light1_max = light1_value; light1_step = 0; } break; case 1: break; } } long lasttime = 0; void doAnimation() { //if (millis() < lasttime) { // lasttime = millis(); // we wrapped around, lets just try again //} if ((lasttime + ANIMATION_STEP) > millis()) { return; // not enough time has passed } lasttime = millis(); if (light1_step == 0) return; //no need to animate if (light1_step > 0) { if (light1_value + light1_step > light1_target) { light1_value = light1_target; if (light1_setupMode == 1) { light1_step = -light1_step; light1_target = 0; Serial.println("change animation animation direction 1"); } else { Serial.println("stop on animation, value "); Serial.print(light1_value); Serial.println(""); light1_step = 0; //stop animation } } else { light1_value += light1_step; } analogWrite(light1_led, light1_value); } else { if (light1_value + light1_step < light1_target) { light1_value = light1_target; if (light1_setupMode == 1) { light1_step = -light1_step; light1_target = 255; Serial.println("change animation animation direction 2"); } else { Serial.println("stop off animation, value"); Serial.print(light1_value); Serial.println(""); light1_step = 0; //stop animation } } else { light1_value += light1_step; } analogWrite(light1_led, light1_value); } } void button1_keepPressed() { if (light1_setupMode == 1) { return; //no need it } if (light1_pressedTime + LONG_PRESS < millis()) { light1_setupMode = 1; Serial.println("enter setup mode"); if (light1_value == 0) { Serial.println("start switch on"); light1_step = light1_stepSetup; light1_target = 255; } else { Serial.println("start switch off"); light1_step = -light1_stepSetup; light1_target = 0; } } } void loop() { check_switches(); // when we check the switches we'll get the current state if (justpressed[0]) { Serial.print(0, DEC); Serial.println(" Just pressed"); pressButton(0); // remember, check_switches() will CLEAR the 'just pressed' flag } if (justreleased[0]) { Serial.print(0, DEC); Serial.println(" Just released"); buttonReleased(0); // remember, check_switches() will CLEAR the 'just pressed' flag } if (pressed[0]) { //Serial.print(0, DEC); //Serial.println(" pressed"); button1_keepPressed(); // is the button pressed down at this moment } //button2 if (justpressed[1]) { Serial.print(1, DEC); Serial.println(" Just pressed"); pressButton(1); // remember, check_switches() will CLEAR the 'just pressed' flag } if (justreleased[1]) { Serial.print(1, DEC); Serial.println(" Just released"); buttonReleased(1); // remember, check_switches() will CLEAR the 'just pressed' flag } if (pressed[1]) { //Serial.print(1, DEC); //Serial.println(" pressed"); //button1_keepPressed(); // is the button pressed down at this moment } doAnimation(); }