// Road A sensor
#define TRIG1 3
#define ECHO1 2
// Road B sensor
#define TRIG2 4
#define ECHO2 5
// Road A LEDs
#define GREEN_A 10
#define YELLOW_A 11
#define RED_A 12
// Road B LEDs
#define GREEN_B 13
#define YELLOW_B 14
#define RED_B 15
long duration;
int distance1, distance2;
void setup() {
// Sensors
pinMode(TRIG1, OUTPUT);
pinMode(ECHO1, INPUT);
pinMode(TRIG2, OUTPUT);
pinMode(ECHO2, INPUT);
// Road A LEDs
pinMode(GREEN_A, OUTPUT);
pinMode(YELLOW_A, OUTPUT);
pinMode(RED_A, OUTPUT);
// Road B LEDs
pinMode(GREEN_B, OUTPUT);
pinMode(YELLOW_B, OUTPUT);
pinMode(RED_B, OUTPUT);
Serial.begin(9600);
}
// Generic function to measure distance
int getDistance(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
return duration * 0.034 / 2; // Convert to cm
}
void loop() {
// Read both sensors
distance1 = getDistance(TRIG1, ECHO1);
distance2 = getDistance(TRIG2, ECHO2);
Serial.print("Road A distance: ");
Serial.println(distance1);
Serial.print("Road B distance: ");
Serial.println(distance2);
if (distance1 < 20 && distance2 >= 20) {
// Road A priority
Serial.println("Road A has priority");
digitalWrite(GREEN_A, HIGH);
digitalWrite(RED_B, HIGH); // Road B stays red
delay(6000);
digitalWrite(GREEN_A, LOW);
digitalWrite(YELLOW_A, HIGH);
delay(2000);
digitalWrite(YELLOW_A, LOW);
digitalWrite(RED_A, HIGH);
digitalWrite(RED_B, LOW); // Switch to Road B
delay(4000);
digitalWrite(RED_A, LOW);
} else if (distance2 < 20 && distance1 >= 20) {
// Road B priority
Serial.println("Road B has priority");
digitalWrite(GREEN_B, HIGH);
digitalWrite(RED_A, HIGH); // Road A stays red
delay(6000);
digitalWrite(GREEN_B, LOW);
digitalWrite(YELLOW_B, HIGH);
delay(2000);
digitalWrite(YELLOW_B, LOW);
digitalWrite(RED_B, HIGH);
digitalWrite(RED_A, LOW); // Switch to Road A
delay(4000);
digitalWrite(RED_B, LOW);
} else {
// Balanced or no vehicles → default cycle
Serial.println("Balanced traffic or no vehicles");
// Road A green, Road B red
digitalWrite(GREEN_A, HIGH);
digitalWrite(RED_B, HIGH);
delay(4000);
digitalWrite(GREEN_A, LOW);
digitalWrite(RED_B, LOW);
digitalWrite(YELLOW_A, HIGH);
delay(2000);
digitalWrite(YELLOW_A, LOW);
digitalWrite(RED_A, HIGH);
digitalWrite(GREEN_B, HIGH);
delay(4000);
digitalWrite(RED_A, LOW);
digitalWrite(GREEN_B, LOW);
digitalWrite(YELLOW_B, HIGH);
delay(2000);
digitalWrite(YELLOW_B, LOW);
digitalWrite(RED_B, HIGH);
}
}