#define LED1 13
#define LED2 12
#define LED3 11
#define LED4 10
#define LED5 9
#define LED6 8
#define LED7 7
#define LED8 6
const byte leds[] = {LED1, LED2, LED3, LED4, LED5, LED6, LED7, LED8};
const byte buttons[] = {5, 4, 3, 2};
byte lastButtons[] = {1, 1, 1, 1};
unsigned long lastReads[] = {0, 0, 0, 0};
byte currentState = 0;
byte currentStep = 0;
unsigned long lastStep = 0;
unsigned long stepDelay = 1000ul;
void setup() {
for (int i = 0; i < sizeof(leds); i++) {
pinMode(leds[i], OUTPUT);
}
for (int i = 0; i < sizeof (buttons); i++) {
pinMode(buttons[i], INPUT_PULLUP);
}
}
void loop() {
//what time is it now..
unsigned long now = millis();
//read all button, debounce at 50ms on change
for ( int i = 0; i < sizeof(buttons); i++) {
if (now - lastReads[i] >= 50) {
byte btn = digitalRead(buttons[i]);
if (btn != lastButtons[i]) {
lastReads[i] = now; //start debouncing..
lastButtons[i] = btn;
if (btn == LOW) {
currentState = i + 1;
currentStep = 0;
AllOff();
}
}
}
}
//check to see if button is held down..
bool someDown = false;
for (int i=0; i<sizeof (buttons);i++){
if (lastButtons[i]== 0){
someDown = true;
}
}
//if not still down, drop the press..
//comment next out if you don't want to hold down button..
if (!someDown){
currentState = 0;
}
//currentState is the current button held down/pressed..
switch (currentState) {
case 0: AllOff(); break;
case 1: {
switch (currentStep) {
case 0: digitalWrite(LED1, HIGH); lastStep = now; currentStep++; break;
case 1: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 2: digitalWrite(LED2, HIGH); lastStep = now; currentStep++; break;
case 3: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 4: digitalWrite(LED1, LOW);
digitalWrite(LED3, HIGH);
lastStep = now; currentStep++; break;
case 5: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 6: digitalWrite(LED2, LOW);
digitalWrite(LED4, HIGH);
lastStep = now; currentStep++; break;
case 7: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 8: digitalWrite(LED3, LOW);
digitalWrite(LED5, HIGH);
lastStep = now; currentStep++; break;
case 9: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 10: digitalWrite(LED4, LOW);
digitalWrite(LED6, HIGH);
lastStep = now; currentStep++; break;
case 11: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 12: digitalWrite(LED5, LOW);
digitalWrite(LED7, HIGH);
lastStep = now; currentStep++; break;
case 13: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 14: digitalWrite(LED6, LOW);
digitalWrite(LED8, HIGH);
lastStep = now; currentStep++; break;
case 15: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 16: digitalWrite(LED7, LOW); lastStep = now; currentStep++; break;
case 17: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 18: digitalWrite(LED7, LOW); currentStep++; break;
case 19: AllOff(); currentStep++; break;
}
} break;
case 2: {
switch (currentStep) {
case 0: digitalWrite(LED1, HIGH); lastStep = now; currentStep++; break;
case 1: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 2: digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
lastStep = now; currentStep++; break;
case 3: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 4: digitalWrite(LED2, LOW);
digitalWrite(LED1, HIGH);
digitalWrite(LED3, HIGH);
lastStep = now; currentStep++; break;
case 5: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 6: digitalWrite(LED1, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED2, HIGH);
digitalWrite(LED4, HIGH);
lastStep = now; currentStep++; break;
case 7: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 8: digitalWrite(LED2, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
lastStep = now; currentStep++; break;
case 9: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 10: digitalWrite(LED3, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED4, HIGH);
digitalWrite(LED6, HIGH);
lastStep = now; currentStep++; break;
case 11: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 12: digitalWrite(LED4, LOW);
digitalWrite(LED6, LOW);
digitalWrite(LED5, HIGH);
digitalWrite(LED7, HIGH);
lastStep = now; currentStep++; break;
case 13: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 14: digitalWrite(LED5, LOW);
digitalWrite(LED7, LOW);
digitalWrite(LED6, HIGH);
digitalWrite(LED8, HIGH);
lastStep = now; currentStep++; break;
case 15: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 16: digitalWrite(LED6, LOW);
digitalWrite(LED8, LOW);
digitalWrite(LED7, HIGH);
lastStep = now; currentStep++; break;
case 17: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 18: digitalWrite(LED7, LOW);
digitalWrite(LED8, HIGH);
lastStep = now; currentStep++; break;
case 19: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 20: digitalWrite(LED8, LOW);
lastStep = now; currentStep++; break;
case 21: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 22: digitalWrite(LED8, LOW);
currentStep++; break;
case 23: AllOff(); currentStep++; break;
}
} break;
case 3: {
switch (currentStep) {
case 0: digitalWrite(LED1, HIGH);
lastStep = now; currentStep++; break;
case 1: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 2: digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
lastStep = now; currentStep++; break;
case 3: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 4: digitalWrite(LED2, LOW);
digitalWrite(LED3, HIGH);
lastStep = now; currentStep++; break;
case 5: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 6: digitalWrite(LED3, LOW);
digitalWrite(LED4, HIGH);
lastStep = now; currentStep++; break;
case 7: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 8: digitalWrite(LED4, LOW);
digitalWrite(LED5, HIGH);
lastStep = now; currentStep++; break;
case 9: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 10: digitalWrite(LED5, LOW);
digitalWrite(LED6, HIGH);
lastStep = now; currentStep++; break;
case 11: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 12: digitalWrite(LED6, LOW);
digitalWrite(LED7, HIGH);
lastStep = now; currentStep++; break;
case 13: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 14: digitalWrite(LED7, LOW);
digitalWrite(LED8, HIGH);
lastStep = now; currentStep++; break;
case 15: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 16: digitalWrite(LED8, LOW);
digitalWrite(LED7, HIGH);
lastStep = now; currentStep++; break;
case 17: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 18: digitalWrite(LED7, LOW);
digitalWrite(LED6, HIGH);
lastStep = now; currentStep++; break;
case 19: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 20: digitalWrite(LED6, LOW);
digitalWrite(LED5, HIGH);
lastStep = now; currentStep++; break;
case 21: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 22: digitalWrite(LED5, LOW);
digitalWrite(LED4, HIGH);
lastStep = now; currentStep++; break;
case 23: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 24: digitalWrite(LED4, LOW);
digitalWrite(LED3, HIGH);
lastStep = now; currentStep++; break;
case 25: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 26: digitalWrite(LED3, LOW);
digitalWrite(LED2, HIGH);
lastStep = now; currentStep++; break;
case 27: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 28: digitalWrite(LED2, LOW);
digitalWrite(LED1, HIGH);
lastStep = now; currentStep++; break;
case 29: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 30: AllOff(); currentStep++; break;
}
} break;
case 4: {
switch (currentStep) {
case 0: digitalWrite(LED1, HIGH);
lastStep = now; currentStep++; break;
case 1: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 2: digitalWrite(LED2, HIGH);
lastStep = now; currentStep++; break;
case 3: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 4: digitalWrite(LED3, HIGH);
lastStep = now; currentStep++; break;
case 5: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 6: digitalWrite(LED4, HIGH);
lastStep = now; currentStep++; break;
case 7: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 8: digitalWrite(LED5, HIGH);
lastStep = now; currentStep++; break;
case 9: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 10: digitalWrite(LED6, HIGH);
lastStep = now; currentStep++; break;
case 11: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 12: digitalWrite(LED7, HIGH);
lastStep = now; currentStep++; break;
case 13: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 14: digitalWrite(LED8, HIGH);
lastStep = now; currentStep++; break;
case 15: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 16: digitalWrite(LED8, LOW);
lastStep = now; currentStep++; break;
case 17: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 18: digitalWrite(LED7, LOW);
lastStep = now; currentStep++; break;
case 19: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 20: digitalWrite(LED6, LOW);
lastStep = now; currentStep++; break;
case 21: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 22: digitalWrite(LED5, LOW);
lastStep = now; currentStep++; break;
case 23: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 24: digitalWrite(LED4, LOW);
lastStep = now; currentStep++; break;
case 25: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 26: digitalWrite(LED3, LOW);
lastStep = now; currentStep++; break;
case 27: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 28: digitalWrite(LED2, LOW);
lastStep = now; currentStep++; break;
case 29: if (now - lastStep >= stepDelay) {
currentStep++;
} break;
case 30: AllOff(); currentStep++; break;
}
} break;
}
}
void AllOff() {
for (int i = 0; i < sizeof(leds); i++) {
digitalWrite(leds[i], LOW);
}
}