// Definición de pines
const int rojo = 8; // LED rojo para semáforo vehicular
const int amarillo = 9; // LED amarillo para semáforo vehicular
const int verde = 10; // LED verde para semáforo vehicular
const int buzzer = 11; // Buzzer para peatones
const int botonPeaton1 = 2; // Pulsador peatonal 1
const int botonPeaton2 = 3; // Pulsador peatonal 2
const int botonTest = 4; // Pulsador de prueba
// Variables de estado
unsigned long tiempoUltimoCruce = 0;
const unsigned long tiempoEspera = 10000; // 10 segundos entre cruces
void setup() {
// Configurar pines de entrada
pinMode(botonPeaton1, INPUT);
pinMode(botonPeaton2, INPUT);
pinMode(botonTest, INPUT);
// Configurar pines de salida
pinMode(rojo, OUTPUT);
pinMode(amarillo, OUTPUT);
pinMode(verde, OUTPUT);
pinMode(buzzer, OUTPUT);
// Estado inicial: semáforo en verde, buzzer apagado
digitalWrite(verde, HIGH);
digitalWrite(amarillo, LOW);
digitalWrite(rojo, LOW);
noTone(buzzer);
}
void loop() {
// Verificar si se presionó el botón de prueba
if (digitalRead(botonTest) == HIGH) {
testLucesSonido();
}
// Verificar si se presionó algún botón peatonal y ha pasado el tiempo de espera
if ((digitalRead(botonPeaton1) == HIGH || digitalRead(botonPeaton2) == HIGH) &&
(millis() - tiempoUltimoCruce) > tiempoEspera) {
iniciarSecuenciaCruce();
tiempoUltimoCruce = millis();
}
}
void iniciarSecuenciaCruce() {
// Paso 1: Cambiar a amarillo inmediatamente
digitalWrite(verde, LOW);
digitalWrite(amarillo, HIGH);
delay(2000); // Esperar 2 segundos
// Paso 2: Cambiar a rojo y activar buzzer
digitalWrite(amarillo, LOW);
digitalWrite(rojo, HIGH);
tone(buzzer, 1000); // Activar buzzer a 1000 Hz
delay(10000); // Esperar 10 segundos (peatones cruzan)
// Paso 3: Apagar buzzer y cambiar a amarillo
noTone(buzzer);
digitalWrite(rojo, LOW);
digitalWrite(amarillo, HIGH);
delay(4000); // Esperar 4 segundos
// Paso 4: Volver a verde
digitalWrite(amarillo, LOW);
digitalWrite(verde, HIGH);
}
void testLucesSonido() {
// Secuencia de prueba: enciende todas las luces y activa el buzzer
digitalWrite(verde, HIGH);
delay(500);
digitalWrite(verde, LOW);
digitalWrite(amarillo, HIGH);
delay(500);
digitalWrite(amarillo, LOW);
digitalWrite(rojo, HIGH);
delay(500);
digitalWrite(rojo, LOW);
tone(buzzer, 1000);
delay(1000);
noTone(buzzer);
}