// Define pins for ultrasonic sensors
const int trigPin1 = 9;
const int echoPin1 = 10;
const int trigPin2 = 11;
const int echoPin2 = 12;
// Define pins for traffic light 1 (Lane 1)
const int redLight1 = 2;
const int yellowLight1 = 3;
const int greenLight1 = 4;
// Define pins for traffic light 2 (Lane 2)
const int redLight2 = 5;
const int yellowLight2 = 6;
const int greenLight2 = 7;
// Define variables for distance
long duration1, distance1;
long duration2, distance2;
// Define threshold distance for object detection (in cm)
const int thresholdDistance = 30;
// Define states for traffic lights
enum TrafficLightState { RED, YELLOW, GREEN };
TrafficLightState state1 = RED;
TrafficLightState state2 = RED;
unsigned long previousMillis = 0;
const long interval = 5000; // 5 seconds interval for each green light
bool lane1Detected = false;
bool lane2Detected = false;
void setup() {
// Initialize serial communication
Serial.begin(9600);
// Set pin modes for ultrasonic sensors
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
// Set pin modes for traffic lights
pinMode(redLight1, OUTPUT);
pinMode(yellowLight1, OUTPUT);
pinMode(greenLight1, OUTPUT);
pinMode(redLight2, OUTPUT);
pinMode(yellowLight2, OUTPUT);
pinMode(greenLight2, OUTPUT);
// Initialize traffic lights to red
digitalWrite(redLight1, HIGH);
digitalWrite(redLight2, HIGH);
}
void loop() {
// Measure distance from sensor 1
distance1 = measureDistance(trigPin1, echoPin1);
Serial.print("Distance 1: ");
Serial.print(distance1);
Serial.print(" cm, ");
// Measure distance from sensor 2
distance2 = measureDistance(trigPin2, echoPin2);
Serial.print("Distance 2: ");
Serial.print(distance2);
Serial.println(" cm");
// Check for object detection
if (distance1 < thresholdDistance) {
lane1Detected = true;
}
if (distance2 < thresholdDistance) {
lane2Detected = true;
}
// Traffic light logic
if (lane1Detected && !lane2Detected) {
if (state1 != GREEN) {
setTrafficLight(1, GREEN);
setTrafficLight(2, RED);
previousMillis = millis();
state1 = GREEN;
state2 = RED;
}
} else if (lane2Detected && !lane1Detected) {
if (state2 != GREEN) {
setTrafficLight(2, GREEN);
setTrafficLight(1, RED);
previousMillis = millis();
state2 = GREEN;
state1 = RED;
}
}else if(lane1Detected && lane2Detected){
if(state1 != GREEN && state2 != RED){
setTrafficLight(1, GREEN);
setTrafficLight(2, RED);
previousMillis = millis();
state1 = GREEN;
state2 = RED;
}
}
// Automatic traffic light switching after a delay
if (state1 == GREEN && millis() - previousMillis >= interval) {
setTrafficLight(1, YELLOW);
delay(2000);
setTrafficLight(1, RED);
setTrafficLight(2, GREEN);
state1 = RED;
state2 = GREEN;
previousMillis = millis();
} else if (state2 == GREEN && millis() - previousMillis >= interval){
setTrafficLight(2, YELLOW);
delay(2000);
setTrafficLight(2, RED);
setTrafficLight(1, GREEN);
state2 = RED;
state1 = GREEN;
previousMillis = millis();
}
// Reset detection flags after switching
if (state1 == GREEN || state2 == GREEN) {
lane1Detected = false;
lane2Detected = false;
}
delay(100); // Small delay to avoid rapid readings
}
// Function to measure distance using ultrasonic sensor
long measureDistance(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration1 = pulseIn(echoPin, HIGH);
return duration1 * 0.034 / 2;
}
// Function to set traffic light state
void setTrafficLight(int lightNumber, TrafficLightState state) {
int redPin, yellowPin, greenPin;
if (lightNumber == 1) {
redPin = redLight1;
yellowPin = yellowLight1;
greenPin = greenLight1;
} else {
redPin = redLight2;
yellowPin = yellowLight2;
greenPin = greenLight2;
}
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
switch (state) {
case RED:
digitalWrite(redPin, HIGH);
break;
case YELLOW:
digitalWrite(yellowPin, HIGH);
break;
case GREEN:
digitalWrite(greenPin, HIGH);
break;
}
}