#define SWITCH_PIN 4 // Pin de entrada con Pull-Up para el interruptor
// Pines de salida para los LEDs
#define LED1_PIN 13
#define LED2_PIN 32
#define LED3_PIN 12
#define LED4_PIN 33
#define LED5_PIN 14
#define LED6_PIN 25
#define LED7_PIN 27
#define LED8_PIN 26
// Variables para el sistema anti-rebotes
unsigned long lastDebounceTime = 0; // Último tiempo de cambio de estado
unsigned long debounceDelay = 50; // Tiempo para filtrar rebotes (50ms)
int lastSwitchState = HIGH; // Estado previo del interruptor
int currentState = HIGH; // Estado actual filtrado del interruptor
// Variables para manejar las secuencias
bool sequenceState = true; // true: secuencia ascendente, false: descendente
unsigned long lastUpdateTime = 0; // Última actualización de los LEDs
unsigned long sequenceDelay = 400; // Tiempo entre pasos de la secuencia
int step = 0; // Paso actual de la secuencia
void setup() {
// Configuración del pin del interruptor con resistencia Pull-Up interna
pinMode(SWITCH_PIN, INPUT_PULLUP);
// Configurar los pines de los LEDs como salida
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
pinMode(LED4_PIN, OUTPUT);
pinMode(LED5_PIN, OUTPUT);
pinMode(LED6_PIN, OUTPUT);
pinMode(LED7_PIN, OUTPUT);
pinMode(LED8_PIN, OUTPUT);
// Apagar todos los LEDs al inicio
apagarTodosLosLEDs();
}
void loop() {
// Leer el estado del interruptor y filtrar rebotes
int reading = digitalRead(SWITCH_PIN);
if (reading != lastSwitchState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
currentState = reading; // Actualizar estado filtrado
}
lastSwitchState = reading;
// Verificar si el interruptor está encendido (LOW) para activar la secuencia
if (currentState == LOW) {
// Solo cambiar la secuencia cuando el estado cambia de ON a OFF o viceversa
if (millis() - lastUpdateTime >= sequenceDelay) {
lastUpdateTime = millis();
if (!sequenceState) { // Cambia a secuencia ascendente mientras está encendido
secuenciaAscendente();
} else { // Cambia a secuencia descendente mientras está encendido
secuenciaDescendente();
}
}
} else {
// Continuar con la secuencia original cuando el interruptor está apagado
if (millis() - lastUpdateTime >= sequenceDelay) {
lastUpdateTime = millis();
if (sequenceState) {
secuenciaAscendente();
} else {
secuenciaDescendente();
}
}
}
}
// Función para apagar todos los LEDs
void apagarTodosLosLEDs() {
digitalWrite(LED1_PIN, LOW);
digitalWrite(LED2_PIN, LOW);
digitalWrite(LED3_PIN, LOW);
digitalWrite(LED4_PIN, LOW);
digitalWrite(LED5_PIN, LOW);
digitalWrite(LED6_PIN, LOW);
digitalWrite(LED7_PIN, LOW);
digitalWrite(LED8_PIN, LOW);
}
// Función para la secuencia ascendente
void secuenciaAscendente() {
apagarTodosLosLEDs();
switch (step) {
case 0: digitalWrite(LED1_PIN, HIGH); break;
case 1: digitalWrite(LED2_PIN, HIGH); break;
case 2: digitalWrite(LED3_PIN, HIGH); break;
case 3:digitalWrite(LED4_PIN, HIGH); break;
case 4: digitalWrite(LED8_PIN, HIGH); break;
case 5 :digitalWrite(LED7_PIN, HIGH); break;
case 6: digitalWrite(LED6_PIN, HIGH); break;
case 7: digitalWrite(LED5_PIN, HIGH); break;
}
step = (step + 1) % 8; // Avanzar al siguiente paso
}
// Función para la secuencia descendente
void secuenciaDescendente() {
apagarTodosLosLEDs();
switch (step) {
case 0: digitalWrite(LED1_PIN, HIGH); break;
case 1: digitalWrite(LED5_PIN, HIGH); break;
case 2: digitalWrite(LED6_PIN, HIGH); break;
case 3:digitalWrite(LED7_PIN, HIGH); break;
case 4: digitalWrite(LED8_PIN, HIGH); break;
case 5 :digitalWrite(LED4_PIN, HIGH); break;
case 6: digitalWrite(LED3_PIN, HIGH); break;
case 7: digitalWrite(LED2_PIN, HIGH); break;
}
step = (step + 1) % 8; // Avanzar al siguiente paso
}