// Definición de pines
const int PB0 = 8; // LED rojo 1
const int PB1 = 9; // LED rojo 2
const int PC0 = 14; // LED verde
const int PC1 = 15; // LED amarillo
const int PD2 = 2; // Interrupción INT0
const int PD3 = 3; // Interrupción INT1
// Variables para control de estados
volatile bool parpadeoVerdeExtra = false;
volatile bool parpadeoAmarilloExtra = false;
unsigned long tiempoAnterior = 0;
void setup() {
// Configurar pines de salida
pinMode(PB0, OUTPUT);
pinMode(PB1, OUTPUT);
pinMode(PC0, OUTPUT);
pinMode(PC1, OUTPUT);
// Configurar pines de entrada con pull-up
pinMode(PD2, INPUT_PULLUP);
pinMode(PD3, INPUT_PULLUP);
// Configurar interrupciones
attachInterrupt(digitalPinToInterrupt(PD2), parpadeoVerde, FALLING);
attachInterrupt(digitalPinToInterrupt(PD3), parpadeoAmarillo, FALLING);
}
// Rutina de interrupción para LED verde
void parpadeoVerde() {
parpadeoVerdeExtra = true;
}
// Rutina de interrupción para LED amarillo
void parpadeoAmarillo() {
parpadeoAmarilloExtra = true;
}
void loop() {
unsigned long tiempoActual = millis();
// Programa principal: LEDs rojos a 1Hz
if (tiempoActual - tiempoAnterior >= 1000) {
digitalWrite(PB0, !digitalRead(PB0));
digitalWrite(PB1, !digitalRead(PB1));
tiempoAnterior = tiempoActual;
}
// Manejar LED verde (1.25 Hz)
static unsigned long tiempoVerdeAnterior = 0;
if (tiempoActual - tiempoVerdeAnterior >= 400) {
digitalWrite(PC0, !digitalRead(PC0));
tiempoVerdeAnterior = tiempoActual;
}
// Manejar LED amarillo (2.5 Hz)
static unsigned long tiempoAmarilloAnterior = 0;
if (tiempoActual - tiempoAmarilloAnterior >= 200) {
digitalWrite(PC1, !digitalRead(PC1));
tiempoAmarilloAnterior = tiempoActual;
}
// Manejar interrupción del LED verde
if (parpadeoVerdeExtra) {
for (int i = 0; i < 4; i++) { // 2 ciclos completos
digitalWrite(PC0, HIGH);
delay(400);
digitalWrite(PC0, LOW);
delay(400);
}
parpadeoVerdeExtra = false;
}
// Manejar interrupción del LED amarillo
if (parpadeoAmarilloExtra) {
digitalWrite(PC1, HIGH);
delay(200);
digitalWrite(PC1, LOW);
delay(200);
parpadeoAmarilloExtra = false;
}
}