const int buttonPin = 53; // Active-low button input
const int analogPins[] = {A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15};
const int digitalPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
50, 51, 52, };
int currentOutputIndex = 0;
bool isOscillating = false;
unsigned long lastToggleTime = 0;
bool pinState = LOW;
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // Active-low button
for (int i = 0; i < sizeof(analogPins) / sizeof(int); i++) {
pinMode(analogPins[i], OUTPUT);
}
for (int i = 0; i < sizeof(digitalPins) / sizeof(int); i++) {
pinMode(digitalPins[i], OUTPUT);
}
}
void loop() {
static bool lastButtonState = HIGH;
bool buttonState = digitalRead(buttonPin);
// Check for falling edge
if (lastButtonState == HIGH && buttonState == LOW) {
// Turn off previous pin
setCurrentPin(LOW);
// Move to next pin
currentOutputIndex++;
int totalPins = sizeof(analogPins) / sizeof(int) + sizeof(digitalPins) / sizeof(int);
if (currentOutputIndex >= totalPins) {
currentOutputIndex = 0;
}
// Start oscillation
isOscillating = true;
pinState = LOW;
lastToggleTime = millis();
}
lastButtonState = buttonState;
// Oscillate selected pin
if (isOscillating && millis() - lastToggleTime >= 500) { // 1Hz = toggle every 500ms
pinState = !pinState;
setCurrentPin(pinState);
lastToggleTime = millis();
}
}
void setCurrentPin(bool state) {
int totalAnalog = sizeof(analogPins) / sizeof(int);
if (currentOutputIndex < totalAnalog) {
digitalWrite(analogPins[currentOutputIndex], state);
} else {
digitalWrite(digitalPins[currentOutputIndex - totalAnalog], state);
}
}