#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define ECHO_PIN1 12
#define TRIG_PIN1 11
#define ECHO_PIN2 A1
#define TRIG_PIN2 A0
#define ECHO_PIN3 A3
#define TRIG_PIN3 A2
#define RED1 2
#define YELLOW1 3
#define GREEN1 4
#define RED2 5
#define YELLOW2 6
#define GREEN2 7
#define RED3 8
#define YELLOW3 9
#define GREEN3 10
LiquidCrystal_I2C lcd(0x27, 16, 2);
int changes1 = 0;
int changes2 = 0;
int changes3 = 0;
void setup() {
pinMode(RED1, OUTPUT);
pinMode(YELLOW1, OUTPUT);
pinMode(GREEN1, OUTPUT);
pinMode(RED2, OUTPUT);
pinMode(YELLOW2, OUTPUT);
pinMode(GREEN2, OUTPUT);
pinMode(RED3, OUTPUT);
pinMode(YELLOW3, OUTPUT);
pinMode(GREEN3, OUTPUT);
pinMode(TRIG_PIN1, OUTPUT);
pinMode(ECHO_PIN1, INPUT);
pinMode(TRIG_PIN2, OUTPUT);
pinMode(ECHO_PIN2, INPUT);
pinMode(TRIG_PIN3, OUTPUT);
pinMode(ECHO_PIN3, INPUT);
lcd.begin();
lcd.backlight();
startTrafficLight(1);
}
void loop() {
int distance1 = getDistance(TRIG_PIN1, ECHO_PIN1);
int distance2 = getDistance(TRIG_PIN2, ECHO_PIN2);
int distance3 = getDistance(TRIG_PIN3, ECHO_PIN3);
if (distance1 < 20) {
changeTrafficLight(1);
} else if (distance2 < 20) {
changeTrafficLight(2);
} else if (distance3 < 20) {
changeTrafficLight(3);
}
updateLCD();
}
void startTrafficLight(int light) {
switch(light) {
case 1:
digitalWrite(RED1, LOW);
digitalWrite(YELLOW1, LOW);
digitalWrite(GREEN1, HIGH);
digitalWrite(RED2, HIGH);
digitalWrite(YELLOW2, LOW);
digitalWrite(GREEN2, LOW);
digitalWrite(RED3, HIGH);
digitalWrite(YELLOW3, LOW);
digitalWrite(GREEN3, LOW);
break;
case 2:
digitalWrite(RED1, HIGH);
digitalWrite(YELLOW1, LOW);
digitalWrite(GREEN1, LOW);
digitalWrite(RED2, LOW);
digitalWrite(YELLOW2, LOW);
digitalWrite(GREEN2, HIGH);
digitalWrite(RED3, HIGH);
digitalWrite(YELLOW3, LOW);
digitalWrite(GREEN3, LOW);
break;
case 3:
digitalWrite(RED1, HIGH);
digitalWrite(YELLOW1, LOW);
digitalWrite(GREEN1, LOW);
digitalWrite(RED2, HIGH);
digitalWrite(YELLOW2, LOW);
digitalWrite(GREEN2, LOW);
digitalWrite(RED3, LOW);
digitalWrite(YELLOW3, LOW);
digitalWrite(GREEN3, HIGH);
break;
}
}
void changeTrafficLight(int light) {
if (light == 1) {
startTrafficLight(1);
changes1++;
delay(10000); // wait for 10 seconds
} else if (light == 2) {
startTrafficLight(2);
changes2++;
delay(10000); // wait for 10 seconds
} else if (light == 3) {
startTrafficLight(3);
changes3++;
delay(10000); // wait for 10 seconds
}
}
int getDistance(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
int distance = duration * 0.034 / 2;
return distance;
}
void updateLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("S1:");
lcd.print(changes1);
lcd.setCursor(6, 0);
lcd.print("S2:");
lcd.print(changes2);
lcd.setCursor(12, 0);
lcd.print("S3:");
lcd.print(changes3);
}