const byte BUTTON_PIN = 2;
const byte LEDS_PIN[7] = { 13, 12, 11, 10, 9, 8, 7 };
const byte LEDS_PIN_REVERS[7] = { 7, 8, 9, 10, 11, 12, 13 };
const byte LEDS_PIN_COUNT = 7;
const byte MAX_MODE = 6;
void setup() {
//Serial.begin(115200);
for (byte led: LEDS_PIN)
pinMode(led, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
byte buttonLastState = LOW;
byte mode = 0;
void loop() {
byte buttonCurrentState = digitalRead(BUTTON_PIN);
if (buttonLastState != buttonCurrentState) {
buttonLastState = buttonCurrentState;
if (buttonCurrentState == LOW) {
mode += 1;
if (mode > MAX_MODE) mode = 0;
//Serial.println(mode);
}
}
switch (mode) {
case 1: ledLightsSolid(); break;
case 2: ledLightsOff(); ledLightsBlinkInLine(); break;
case 3: ledLightsOff(); ledLightsBlinkInLineRevers(); break;
case 4: ledLightsOff(); ledLightsBlinkInPingPong(); break;
case 5: ledLightsFadeInOut(); break;
case 6: ledLightsFromMiddleSolid(); break;
default: ledLightsOff(); // mode = 0
}
}
void ledLightsOff() {
for (byte led: LEDS_PIN)
digitalWrite(led, LOW);
}
void ledLightsSolid() {
for (byte led: LEDS_PIN)
digitalWrite(led, HIGH);
}
void ledLightsBlinkInLine() {
for (byte led: LEDS_PIN) {
digitalWrite(led, HIGH);
if (delayLoop(150)) return;
digitalWrite(led, LOW);
}
}
void ledLightsBlinkInLineRevers() {
for (byte led: LEDS_PIN_REVERS) {
digitalWrite(led, HIGH);
if (delayLoop(150)) return;
digitalWrite(led, LOW);
}
}
void ledLightsBlinkInPingPong() {
ledLightsBlinkInLine();
ledLightsBlinkInLineRevers();
}
void ledLightsFadeInOut() {
ledLightsOff();
if (delayLoop(200)) return;
ledLightsSolid();
if (delayLoop(500)) return;
}
void ledLightsFromMiddleSolid() {
byte middle = (byte) LEDS_PIN_COUNT / 2;
ledLightsOff();
if (delayLoop(200)) return;
digitalWrite(LEDS_PIN[middle], HIGH);
if (delayLoop(200)) return;
for (byte i=1; i<=middle; i++) {
digitalWrite(LEDS_PIN[middle - i], HIGH);
digitalWrite(LEDS_PIN[middle + i], HIGH);
if (delayLoop(200)) return;
}
if (delayLoop(500)) return;
}
boolean delayLoop(unsigned int delayInterval) {
unsigned long startMillis = millis();
do {
if (digitalRead(BUTTON_PIN) == LOW) return true;
} while (millis() - startMillis < delayInterval);
return false;
}