// 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};
int IR01= 0;
int IR02= 0;
int IR03= 0;
int IR04= 0;
int Pul= 0;
int Suma = 0;
int Ciclo = 0;
void setup() {
Serial.begin(9600);
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() {
if (digitalRead(Sensor_IR[0])== LOW){ IR01 = 1;}
else {IR01 = 0;}
if (digitalRead(Sensor_IR[1])== LOW){ IR02 = 1;}
else {IR02 = 0;}
if (digitalRead(Sensor_IR[2])== LOW){ IR03 = 1;}
else {IR03 = 0;}
if (digitalRead(Sensor_IR[3])== LOW){ IR04 = 1;}
else {IR04 = 0;}
if (digitalRead(Sensor_IR[4])== LOW){ Pul = 1;}
else {Pul = 0;}
Suma = IR01 +IR02 +IR03 +IR04 +Pul;
// Ninguno
if (Suma == 0 ){ processSingleVehicle(4);}
// Interceccion 1
if (Ciclo == 0 ){
Serial.println(Ciclo+ String(" ")+IR01);
if (IR01==1) {
processSingleVehicle(0);
Ciclo = 1; }
else{Ciclo = 1;} }
// Interceccion 2
if (Ciclo == 1 ){
Serial.println(Ciclo+ String(" ")+IR02);
if (IR02==1) {
processSingleVehicle(1);
Ciclo = 2; }
else{Ciclo = 2;} }
// Interceccion 3
if (Ciclo == 2 ){
Serial.println(Ciclo+ String(" ")+IR03);
if (IR03==1) {
processSingleVehicle(2);
Ciclo = 3; }
else{Ciclo = 3;} }
// Interceccion 4
if (Ciclo == 3 ){
Serial.println(Ciclo+ String(" ")+IR04);
if (IR04==1) {
processSingleVehicle(3);
Ciclo = 4; }
else{Ciclo = 4;} }
// Peaton
if (Ciclo == 4 ){
Serial.println(Ciclo+ String(" ")+Pul);
if (Pul==1) {
processSingleVehicle(4);
Ciclo = 0; }
else{Ciclo = 0;} }
}
void setAllRed() {
for (int i = 0; i < 5; i++) {
digitalWrite(Luz_R[i], HIGH);
digitalWrite(Luz_V[i], LOW);
digitalWrite(Luz_A[i], LOW);
}
}
void processSingleVehicle(int Pin) {
// if ((millis()-TA01)>= 500)
digitalWrite(Luz_R[Pin], LOW);
digitalWrite(Luz_V[Pin], HIGH);
delay(3000);
digitalWrite(Luz_V[Pin], LOW);
blinkAmber(Pin);
delay(200);
digitalWrite(Luz_R[Pin], 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);
}
}