// Define pins for ultrasonic sensors
const int trigPinNorth = 5;
const int echoPinNorth = 18;
const int trigPinSouth = 19;
const int echoPinSouth = 21;
// Define pins for traffic light LEDs
const int redNorth = 12;
const int yellowNorth = 14;
const int greenNorth = 27;
const int redSouth = 26;
const int yellowSouth = 15;
const int greenSouth = 2;
long durationNorth, distanceNorth;
long durationSouth, distanceSouth;
int countNorth = 0;
int countSouth = 0;
enum State {
NORTH_GREEN,
NORTH_YELLOW,
SOUTH_GREEN,
SOUTH_YELLOW
};
State currentState = NORTH_GREEN;
void setup() {
Serial.begin(115200);
pinMode(trigPinNorth, OUTPUT);
pinMode(echoPinNorth, INPUT);
pinMode(trigPinSouth, OUTPUT);
pinMode(echoPinSouth, INPUT);
pinMode(redNorth, OUTPUT);
pinMode(yellowNorth, OUTPUT);
pinMode(greenNorth, OUTPUT);
pinMode(redSouth, OUTPUT);
pinMode(yellowSouth, OUTPUT);
pinMode(greenSouth, OUTPUT);
digitalWrite(redNorth, LOW);
digitalWrite(yellowNorth, LOW);
digitalWrite(greenNorth, LOW);
digitalWrite(redSouth, LOW);
digitalWrite(yellowSouth, LOW);
digitalWrite(greenSouth, LOW);
}
void loop() {
unsigned long currentMillis = millis();
// Measure distance and count vehicles for the north side
distanceNorth = measureDistance(trigPinNorth, echoPinNorth);
if (distanceNorth < 50) { // Vehicle detected
countNorth++;
delay(500); // Debounce delay
}
// Measure distance and count vehicles for the south side
distanceSouth = measureDistance(trigPinSouth, echoPinSouth);
if (distanceSouth < 50) { // Vehicle detected
countSouth++;
delay(500); // Debounce delay
}
// Traffic light control logic
if (countNorth > countSouth) {
if (currentState != NORTH_GREEN) {
// Transition to yellow light
digitalWrite(greenNorth, LOW);
digitalWrite(redNorth, LOW);
digitalWrite(redSouth, LOW);
digitalWrite(greenSouth, LOW);
digitalWrite(yellowNorth, HIGH);
digitalWrite(yellowSouth, HIGH);
delay(2000);
digitalWrite(yellowNorth, LOW);
digitalWrite(yellowSouth, LOW);
currentState = NORTH_GREEN;
}
digitalWrite(greenNorth, HIGH);
digitalWrite(redNorth, LOW);
digitalWrite(greenSouth, LOW);
digitalWrite(redSouth, HIGH);
}
else {
if (currentState != SOUTH_GREEN) {
// Transition to yellow light
digitalWrite(greenNorth, LOW);
digitalWrite(redNorth, LOW);
digitalWrite(redSouth, LOW);
digitalWrite(greenSouth, LOW);
digitalWrite(yellowNorth, HIGH);
digitalWrite(yellowSouth, HIGH);
delay(2000);
digitalWrite(yellowNorth, LOW);
digitalWrite(yellowSouth, LOW);
currentState = SOUTH_GREEN;
}
digitalWrite(greenNorth, LOW);
digitalWrite(redNorth, HIGH);
digitalWrite(greenSouth, HIGH);
digitalWrite(redSouth, LOW);
}
// Display counts
Serial.print("North Count: ");
Serial.println(countNorth);
Serial.print("South Count: ");
Serial.println(countSouth);
delay(100);
}
long measureDistance(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
long distance = duration * 0.034 / 2;
return distance;
}