unsigned long tic, tac;
int pulsador = 18; // Pin para el botón
int contador = 0; // Variable para registrar el estado del botón
// Define la función ISR_pulsador antes de usarla
void IRAM_ATTR ISR_pulsador() {
contador = 1; // Cambia el contador cuando se presiona el botón
}
void setup() {
Serial.begin(115200);
Serial.println("Esperando el pulsador");
// Configura los pines de los LEDs
pinMode(23, OUTPUT); // Rojo coches
pinMode(22, OUTPUT); // Amarillo coches
pinMode(21, OUTPUT); // Verde coches
pinMode(2, OUTPUT); // Verde peatones
pinMode(4, OUTPUT); // Rojo peatones
// Configura el botón con pull-up interno (ya que está conectado a GND)
pinMode(pulsador, INPUT_PULLUP); // Activamos el pull-up interno
// Configura la interrupción para el pulsador
attachInterrupt(digitalPinToInterrupt(pulsador), ISR_pulsador, FALLING);
}
void secuencia_luces(unsigned long tiempo_espera, int ledpinV, int ledpinP, boolean intermitencia) {
tic = millis();
if (intermitencia) {
// Parpadeo de los LEDs
do {
tac = millis();
if (ledpinV == 23 && ledpinP == 2) {
digitalWrite(ledpinV, HIGH);
digitalWrite(ledpinP, HIGH);
delay(500);
digitalWrite(ledpinP, LOW);
delay(500);
} else {
digitalWrite(ledpinP, HIGH);
digitalWrite(ledpinV, HIGH);
delay(500);
digitalWrite(ledpinP, LOW);
digitalWrite(ledpinV, LOW);
delay(500);
}
} while ((tac - tic) < tiempo_espera);
digitalWrite(ledpinP, LOW);
digitalWrite(ledpinV, LOW);
} else {
// LEDs encendidos sin parpadeo
do {
tac = millis();
digitalWrite(ledpinP, HIGH);
digitalWrite(ledpinV, HIGH);
} while ((tac - tic) < tiempo_espera);
digitalWrite(ledpinP, LOW);
digitalWrite(ledpinV, LOW);
}
}
void loop() {
// Si el pulsador ha sido presionado, ejecuta la secuencia
digitalWrite(4, HIGH);
digitalWrite(2, LOW);
digitalWrite(23, LOW);
digitalWrite(22, LOW);
digitalWrite(21, HIGH);
if (contador == 1) {
Serial.println("Pulsador presionado, iniciando secuencia.");
// Secuencia de LEDs según el estado del botón
secuencia_luces(3000, 21, 4, true); // Verde coches, Rojo peatones (parpadeo)
secuencia_luces(4000, 22, 4, true); // Amarillo coches, Rojo peatones (parpadeo)
secuencia_luces(8000, 23, 2, false); // Rojo coches, Verde peatones (fijo)
secuencia_luces(4000, 23, 2, true); // Rojo coches, Verde peatones (parpadeo)
// Después de completar la secuencia, restablece el contador
contador = 0;
// Vuelve a habilitar la interrupción para escuchar nuevamente el botón
attachInterrupt(digitalPinToInterrupt(pulsador), ISR_pulsador, FALLING);
}
// Si el botón no ha sido presionado, el programa espera
delay(100); // Pequeña espera para evitar que el programa consuma demasiados recursos
}