// Definición de pines de los semáforos
const int Luz_V[5] = {3, 6, 9, 12,15};
const int Luz_A[5] = {4, 7, 10, 13,15};
const int Luz_R[5] = {5, 8, 11, 14,16};
//const int P_LV = 15;
//const int P_LR = 16;
// Definición de sensores IR
const int Sensor_IR[5] = {30, 31, 32, 33,17};
void setup() {
for (int i = 0; i < 5; i++) {
pinMode(Luz_V[i], OUTPUT);
pinMode(Luz_A[i], OUTPUT);
pinMode(Luz_R[i], OUTPUT);
pinMode(Sensor_IR[i], INPUT_PULLUP);
}
// pinMode(P_LV, OUTPUT);
// pinMode(P_LR, OUTPUT);
// Inicializar todos los semáforos en rojo
setAllRed();
}
void loop() {
int vehiculos[5] = {0, 0, 0, 0,0};
int contadorVehiculos = 0;
// Leer sensores
for (int i = 0; i < 5; i++) {
vehiculos[i] = digitalRead(Sensor_IR[i]);
if (vehiculos[i] == LOW) contadorVehiculos++;
}
switch (contadorVehiculos) {
case 0:
setAllRed();
break;
case 1:
processSingleVehicle(vehiculos);
case 2:
processSingleVehicle(vehiculos);
case 3:
processSingleVehicle(vehiculos);
case 4:
processSingleVehicle(vehiculos);
default:
processSingleVehicle(vehiculos);
break;
}
}
void setAllRed() {
for (int i = 0; i < 5; i++) {
digitalWrite(Luz_R[i], HIGH);
digitalWrite(Luz_V[i], LOW);
digitalWrite(Luz_A[i], LOW);
}
// digitalWrite(15, HIGH);
// digitalWrite(16, LOW);
// delay(4000);
}
void processSingleVehicle(int vehiculos[]) {
for (int i = 0; i < 5; i++) {
if (vehiculos[i] == LOW) {
// digitalWrite(P_LV, LOW);
// digitalWrite(P_LR, HIGH);
digitalWrite(Luz_R[i], LOW);
digitalWrite(Luz_V[i], HIGH);
delay(3000);
digitalWrite(Luz_V[i], LOW);
blinkAmber(i);
delay(200);
digitalWrite(Luz_R[i], HIGH);
}
}
}
void blinkAmber(int p) {
for (int j = 0; j < 3; j++) {
digitalWrite(Luz_A[p], HIGH);
delay(500);
digitalWrite(Luz_A[p], LOW);
delay(500);
}
}