// Definición de pines para LEDs (Salidas)
const int LED1_PIN = 15;
const int LED2_PIN = 14;
const int LED3_PIN = 13;
// Definición de pines para Pulsadores (Entradas)
const int BTN1_PIN = 12;
const int BTN2_PIN = 11;
const int BTN3_PIN = 10;
// Variables volátiles para el control de rebote (debounce)
volatile unsigned long ultimo_tiempo_btn1 = 0;
volatile unsigned long ultimo_tiempo_btn2 = 0;
volatile unsigned long ultimo_tiempo_btn3 = 0;
const unsigned long tiempo_rebote = 200; // 200 milisegundos de bloqueo
// Rutina de Servicio de Interrupción (ISR) para el Pulsador 1
void isr_btn1() {
if (millis() - ultimo_tiempo_btn1 > tiempo_rebote) {
// Entrada 1: Enciende LED 1 y LED 2
digitalWrite(LED1_PIN, HIGH);
digitalWrite(LED2_PIN, HIGH);
ultimo_tiempo_btn1 = millis();
}
}
// Rutina de Servicio de Interrupción (ISR) para el Pulsador 2
void isr_btn2() {
if (millis() - ultimo_tiempo_btn2 > tiempo_rebote) {
// Entrada 2: Apaga LED 1 y enciende LED 3
digitalWrite(LED1_PIN, LOW);
digitalWrite(LED3_PIN, HIGH);
ultimo_tiempo_btn2 = millis();
}
}
// Rutina de Servicio de Interrupción (ISR) para el Pulsador 3
void isr_btn3() {
if (millis() - ultimo_tiempo_btn3 > tiempo_rebote) {
// Entrada 3: Apaga LED 2
digitalWrite(LED2_PIN, LOW);
ultimo_tiempo_btn3 = millis();
}
}
void setup() {
// Configurar los pines de los LEDs como salidas
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
// Asegurar que los LEDs inician apagados
digitalWrite(LED1_PIN, LOW);
digitalWrite(LED2_PIN, LOW);
digitalWrite(LED3_PIN, LOW);
// Configurar los pulsadores con resistencias pull-up internas
pinMode(BTN1_PIN, INPUT_PULLUP);
pinMode(BTN2_PIN, INPUT_PULLUP);
pinMode(BTN3_PIN, INPUT_PULLUP);
// Adjuntar interrupciones a los pines de los botones
// FALLING detecta el cambio de HIGH (suelto) a LOW (presionado)
attachInterrupt(digitalPinToInterrupt(BTN1_PIN), isr_btn1, FALLING);
attachInterrupt(digitalPinToInterrupt(BTN2_PIN), isr_btn2, FALLING);
attachInterrupt(digitalPinToInterrupt(BTN3_PIN), isr_btn3, FALLING);
}
void loop() {
// El loop queda completamente vacío.
// El procesador puede dedicarse a otras tareas pesadas (como leer sensores o manejar pantallas)
// o incluso ponerse en modo de bajo consumo (Sleep Mode).
}