#include <Servo.h>
#include <LiquidCrystal_I2C.h>
int seconds = 0;
int redled = 11;
int yellowled = 12;
int greenled = 13;
int red_pedestrian = 5;
int green_pedestrian = 6;
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo servo_motor;
void setup() {
lcd.begin(16, 2);
servo_motor.attach(9, 500, 2500);
pinMode(redled, OUTPUT);
pinMode(yellowled, OUTPUT);
pinMode(greenled, OUTPUT);
}
void loop() {
lcd.setBacklight(1);
initial_display();
delay(2000);
lcd.clear();
red_for_stop();
countdown(60);
lcd.clear();
green_for_go();
countdown(60);
lcd.clear();
yellow_for_wait();
countdown(5);
lcd.clear();
}
void red_for_stop() {
digitalWrite(redled, HIGH);
digitalWrite(greenled, LOW);
digitalWrite(yellowled, LOW);
digitalWrite(red_pedestrian, LOW);
digitalWrite(green_pedestrian, HIGH);
lcd.setCursor(0, 0);
lcd.print("STOP!");
barrier_stop();
}
void yellow_for_wait() {
digitalWrite(redled, LOW);
digitalWrite(greenled, LOW);
digitalWrite(yellowled, HIGH);
digitalWrite(red_pedestrian, LOW);
digitalWrite(green_pedestrian, HIGH);
lcd.setCursor(0, 0);
lcd.print("WAIT!");
barrier_stop();
}
void green_for_go() {
digitalWrite(redled, LOW);
digitalWrite(greenled, HIGH);
digitalWrite(yellowled, LOW);
digitalWrite(green_pedestrian, LOW);
digitalWrite(red_pedestrian, HIGH);
lcd.setCursor(0, 0);
lcd.print("GO!");
barrier_go();
}
void countdown(int start_seconds) {
for (int seconds = start_seconds; seconds >= 1; seconds--) {
lcd.setCursor(0, 1);
if (seconds < 10) {
lcd.print(" ");
}
lcd.print(seconds);
delay(1000);
}
}
void initial_display() {
digitalWrite(redled, LOW);
digitalWrite(greenled, LOW);
digitalWrite(yellowled, LOW);
lcd.setCursor(0, 0);
lcd.print(" TRAFFIC LIGHT");
lcd.setCursor(0, 1);
lcd.print(" SYSTEM");
}
void barrier_stop() {
servo_motor.write(0);
}
void barrier_go() {
servo_motor.write(90);
}