hola, tengo un pequeño problema, y es que tengo un codigo el cual funciona bien, hace lo que debe hacer sin embargo al momento de presionar cualquiera de mis 2 botones, no interrumpe el ciclo como debería, y quisiera saber si alguien puede ayudarme, les dejare el código por aquí:
/*
SEMAFORO 2 UNIDADES
NIBBLE BOT
CONEXIONES DE LOS LEDS:
- PIN 13 LED VERDE 1
- PIN 12 LED AMARILLO 1
- PIN 11 LED ROJO 1
- PIN 10 LED VERDE 2
- PIN 9 LED AMARILLO 2
- PIN 8 LED ROJO 2
- PIN 7 BOTON PASO PEATON 1
- PIN 6 BOTON PASO PEATON 2
- PIN 5 LED VERDE PEATON 1
- PIN 4 LED VERDE PEATON 2
-PIN 2 LED AMARILLO PEATON1
-PIN 3 LED AMARILLO PEATON1
*/
// Definir pines de salidas para los semáforos
// SEMÁFORO 1
const int ledVerde1 = 13;
const int ledAmarillo1 = 12;
const int ledRojo1 = 11;
// SEMÁFORO 2
const int ledVerde2 = 10;
const int ledAmarillo2 = 9;
const int ledRojo2 = 8;
// Definir pines de los botones
const int botonPeaton1 = 7; // Botón para paso de peatón en la vía 1
const int botonPeaton2 = 6; // Botón para paso de peatón en la vía 2
// Definir pines de los LEDs verdes para peatones
const int ledVerdePeaton1 = 5; // LED verde de peatón en la vía 1
const int ledVerdePeaton2 = 4; // LED verde de peatón en la vía 2
const int ledAmarilloPeaton1 = 3; // LED verde de peatón en la vía 1
const int ledAmarilloPeaton2 = 2; // LED verde de peatón en la vía 2
void setup() {
// Configurar los pines como salidas para los LEDs
pinMode(ledVerde1, OUTPUT);
pinMode(ledAmarillo1, OUTPUT);
pinMode(ledRojo1, OUTPUT);
pinMode(ledVerde2, OUTPUT);
pinMode(ledAmarillo2, OUTPUT);
pinMode(ledRojo2, OUTPUT);
// Configurar los pines como entradas para los botones
pinMode(botonPeaton1, INPUT_PULLUP);
pinMode(botonPeaton2, INPUT_PULLUP);
// Configurar los pines como salidas para los LEDs verdes y amarillos de peatones
pinMode(ledVerdePeaton1, OUTPUT);
pinMode(ledVerdePeaton2, OUTPUT);
pinMode(ledAmarilloPeaton1, OUTPUT);
pinMode(ledAmarilloPeaton2, OUTPUT);
}
void loop() {
// Verificar si se presiona cualquiera de los botones
if (digitalRead(botonPeaton1) == LOW || digitalRead(botonPeaton2) == LOW) {
// Si se presiona cualquier botón, realizar el cruce de peatones
crucePeatonal();
} else {
// De lo contrario, ejecutar el ciclo normal de los semáforos
cicloSemaforo();
}
}
// Función que simula el cruce de peatones
void crucePeatonal() {
// Cambiar los semáforos a amarillo y hacerlos parpadear simultáneamente
blinkSimultaneo(ledAmarillo1, ledAmarillo2, 5, 500);
// Cambiar los semáforos a rojo para que los peatones crucen
digitalWrite(ledRojo1, HIGH);
digitalWrite(ledRojo2, HIGH);
digitalWrite(ledVerde1, LOW);
digitalWrite(ledVerde2, LOW);
digitalWrite(ledVerdePeaton1, HIGH);
digitalWrite(ledVerdePeaton2, HIGH);
delay(20000); // Los peatones tienen 20 segundos para cruzar
// Apagar los LEDs verdes de peatones
digitalWrite(ledVerdePeaton1, LOW);
digitalWrite(ledVerdePeaton2, LOW);
// Parpadeo rápido de los LEDs amarillos de peatones durante 5 segundos
blinkSimultaneo(ledAmarilloPeaton1, ledAmarilloPeaton2, 5, 500);
// Después de 5 segundos, regresar a la secuencia normal
}
// Función que maneja el ciclo normal de los semáforos
void cicloSemaforo() {
// SEMÁFORO 1 - Fase verde
digitalWrite(ledVerde1, HIGH); // LED VERDE 1
digitalWrite(ledRojo1, LOW); // APAGA LED ROJO 1
digitalWrite(ledRojo2, HIGH); // LED ROJO 2
delay(5000); // Mantener el verde por 5 segundos
digitalWrite(ledVerde1, LOW);
// Parpadeo rápido de verde
blink(ledVerde1, 5, 500);
// SEMÁFORO 1 - Fase amarilla
digitalWrite(ledAmarillo1, HIGH); // LED AMARILLO 1
delay(500);
digitalWrite(ledAmarillo1, LOW);
blink(ledAmarillo1, 5, 500);
// Cambiar a rojo
digitalWrite(ledRojo1, HIGH);
digitalWrite(ledRojo2, LOW);
// SEMÁFORO 2 - Fase verde
digitalWrite(ledVerde2, HIGH); // LED VERDE 2
delay(5000); // Mantener el verde por 5 segundos
digitalWrite(ledVerde2, LOW);
// Parpadeo rápido de verde
blink(ledVerde2, 5, 500);
// SEMÁFORO 2 - Fase amarilla
digitalWrite(ledAmarillo2, HIGH); // LED AMARILLO 2
delay(500);
digitalWrite(ledAmarillo2, LOW);
blink(ledAmarillo2, 5, 500);
// Cambiar a rojo
digitalWrite(ledRojo1, LOW);
}
// Función para encender y apagar un LED con una secuencia rápida
void blink(int pin, int times, int delayTime) {
for (int i = 0; i < times; i++) {
digitalWrite(pin, HIGH);
delay(delayTime);
digitalWrite(pin, LOW);
delay(delayTime);
}
}
// Función para hacer parpadear dos LEDs simultáneamente
void blinkSimultaneo(int pin1, int pin2, int times, int delayTime) {
for (int i = 0; i < times; i++) {
digitalWrite(pin1, HIGH);
digitalWrite(pin2, HIGH);
delay(delayTime);
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
delay(delayTime);
}
}