#include <EEPROM.h>
int leds[16] = {2,3,4,5,6,7,8,9,10,11,12,13,A0,A1,A2,A3};
#define BTN_PIN A4 // Digital button to go next pattern + auto save
#define SPEED_PIN A5 // Speed control pot
int pattern = 0;
bool lastBtn = HIGH;
void setup() {
for (int i = 0; i < 16; i++) pinMode(leds[i], OUTPUT);
pinMode(BTN_PIN, INPUT_PULLUP);
// Load last saved pattern
pattern = EEPROM.read(0);
if (pattern > 5) pattern = 0;
}
void loop() {
int speedVal = analogRead(SPEED_PIN);
int delayTime = map(speedVal, 0, 1023, 20, 400);
// ---- NEXT PATTERN ON BUTTON PRESS ----
bool btn = digitalRead(BTN_PIN);
if (btn == LOW && lastBtn == HIGH) { // Detect falling edge
pattern++;
if (pattern > 5) pattern = 0;
EEPROM.write(0, pattern); // Auto save
delay(250); // Debounce
}
lastBtn = btn;
// ---- RUN SELECTED PATTERN ----
switch (pattern) {
case 0: pattern_normal(delayTime); break;
case 1: pattern_reverse(delayTime); break;
case 2: pattern_pingpong(delayTime); break;
case 3: pattern_inout(delayTime); break;
case 4: pattern_alternate(delayTime); break;
case 5: pattern_randomSparkle(delayTime); break;
}
}
// ---------------------------------------------------------
void pattern_normal(int d) {
for (int i = 0; i < 16; i++) {
allOff(); digitalWrite(leds[i], HIGH); delay(d);
}
}
void pattern_reverse(int d) {
for (int i = 15; i >= 0; i--) {
allOff(); digitalWrite(leds[i], HIGH); delay(d);
}
}
void pattern_pingpong(int d) {
pattern_normal(d);
pattern_reverse(d);
}
void pattern_inout(int d) {
for (int i = 0; i < 8; i++) {
allOff();
digitalWrite(leds[7 - i], HIGH);
digitalWrite(leds[8 + i], HIGH);
delay(d);
}
for (int i = 7; i >= 0; i--) {
allOff();
digitalWrite(leds[7 - i], HIGH);
digitalWrite(leds[8 + i], HIGH);
delay(d);
}
}
void pattern_alternate(int d) {
allOff();
for (int i = 0; i < 16; i += 2) digitalWrite(leds[i], HIGH);
delay(d);
allOff();
for (int i = 1; i < 16; i += 2) digitalWrite(leds[i], HIGH);
delay(d);
}
void pattern_randomSparkle(int d) {
allOff();
digitalWrite(leds[random(0,16)], HIGH);
delay(d);
}
void allOff() {
for (int i = 0; i < 16; i++) digitalWrite(leds[i], LOW);
}