#include <LiquidCrystal.h>
#define buttonP 2
#define crossP 9
#define redP 12
#define yellowP 11
#define greenP 10
#define buttonC 3
#define crossC 4
#define redC 7
#define yellowC 6
#define greenC 5
#define delay_Time 500
#define green_Time 5
#define yellow_Time 3
#define red_Time 5
volatile bool button_stateP = false;
volatile bool button_stateC = false;
int seconds = 0;
LiquidCrystal lcd_1{47, 49, 51, 53, 52, 50};
int i = 0;
int Flag;
int Flag2;
int Light_State;
void setup() {
lcd_1.begin(16, 2);
pinMode(crossP, OUTPUT);
pinMode(redP, OUTPUT);
pinMode(yellowP, OUTPUT);
pinMode(greenP, OUTPUT);
pinMode(buttonP, INPUT_PULLUP);
pinMode(crossC, OUTPUT);
pinMode(redC, OUTPUT);
pinMode(yellowC, OUTPUT);
pinMode(greenC, OUTPUT);
pinMode(buttonC, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonP), setFlag1, CHANGE);
attachInterrupt(digitalPinToInterrupt(buttonC), setFlag2, CHANGE);
Serial.begin(9600);
Flag = 0;
Flag2 = 0;
}
void loop() {
LOOP:
//Green light
digitalWrite(crossP, LOW);
digitalWrite(redP, LOW);
digitalWrite(yellowP, LOW);
digitalWrite(greenP, HIGH);
digitalWrite(crossC, LOW);
digitalWrite(redC, HIGH);
digitalWrite(yellowC, LOW);
digitalWrite(greenC, LOW);
for(i = 0; i <= green_Time; i++){
delay(delay_Time);
if(Flag == 1){
Light_State = 1;
Pedestrian();
goto LOOP;
}
else if (Flag2 == 1) {
Light_State = 3;
Pedestrian2();
goto LOOP;
}
}
//Yellow light
digitalWrite(yellowP, HIGH);
digitalWrite(greenP, LOW);
digitalWrite(yellowC, HIGH);
digitalWrite(redC, LOW);
for(i = 0; i <= red_Time; i++){
delay(delay_Time);
if(Flag == 1){
Light_State = 2;
Pedestrian();
goto LOOP;
}
else if (Flag2 == 1) {
Light_State = 2;
Pedestrian2();
goto LOOP;
}
}
//red light
digitalWrite(yellowP, LOW);
digitalWrite(redP, HIGH);
digitalWrite(yellowC, LOW);
digitalWrite(greenC, HIGH);
for(i = 0; i <= yellow_Time; i++){
delay(delay_Time);
if(Flag == 1){
Light_State = 3;
Pedestrian();
goto LOOP;
}
else if (Flag2 == 1) {
Light_State = 1;
Pedestrian2();
goto LOOP;
}
}
}
void setFlag1(void)
{ Flag = 1; }
void setFlag2(void)
{ Flag2 = 1; }
void Pedestrian(void){
switch(Light_State){
case 1: {//off green on yellow
digitalWrite(greenP, LOW);
digitalWrite(yellowP, HIGH);
lcd_1.clear();
lcd_1.print("Wait Pedestrian");
digitalWrite(redC, LOW);
digitalWrite(yellowC, HIGH);
delay(2000);
//set red on a pedestrian on
digitalWrite(yellowP, LOW);
digitalWrite(redP, HIGH);
digitalWrite(crossP, HIGH);
lcd_1.clear();
lcd_1.print("Cross Pedestrian");
digitalWrite(yellowC, LOW);
digitalWrite(greenC, HIGH);
delay(2000);
break;
}
case 2: {//Yellow state
delay(500);//keep yellow half a second
delay(1000);
//set red on a pedestrian on
digitalWrite(yellowP, LOW);
digitalWrite(redP, HIGH);
digitalWrite(crossP, HIGH);
lcd_1.clear();
lcd_1.print("Cross Pedestrian");
digitalWrite(yellowC, LOW);
digitalWrite(greenC, HIGH);
delay(5000);
break;
}
case 3: {//Pedestrian on, red on
digitalWrite(redP, HIGH);
digitalWrite(crossP, HIGH);
lcd_1.clear();
lcd_1.print("Cross Pedestrian");
digitalWrite(greenC, HIGH);
delay(3000);
break;
}
default:{};
}
for (i = 30; i>= 0; i--){
digitalWrite(crossP, LOW);
lcd_1.setCursor(0,1);
lcd_1.print(i);
delay(500);
digitalWrite(crossP, HIGH);
delay(500);
}
lcd_1.clear();
Flag = 0;
button_stateP = false;
}
void Pedestrian2(void) {
switch(Light_State){
case 1: {//off green on yellow
digitalWrite(greenC, LOW);
digitalWrite(yellowC, HIGH);
lcd_1.clear();
lcd_1.print("Wait Pedestrian");
digitalWrite(redP, LOW);
digitalWrite(yellowP, HIGH);
delay(2000);
//set red on a pedestrian on
digitalWrite(yellowC, LOW);
digitalWrite(redC, HIGH);
digitalWrite(crossC, HIGH);
lcd_1.clear();
lcd_1.print("Wait Pedestrian");
digitalWrite(yellowP, LOW);
digitalWrite(greenP, HIGH);
delay(5000);
break;
}
case 2: {//Yellow state
delay(500);//keep yellow half a second
delay(1000);
//set red on a pedestrian on
digitalWrite(yellowC, LOW);
digitalWrite(redC, HIGH);
digitalWrite(crossC, HIGH);
lcd_1.clear();
lcd_1.print("Cross Pedestrian");
digitalWrite(yellowP, LOW);
digitalWrite(greenP, HIGH);
delay(2000);
break;
}
case 3: {//Pedestrian on, red on
digitalWrite(redC, HIGH);
digitalWrite(crossC, HIGH);
lcd_1.clear();
lcd_1.print("Cross Pedestrian");
digitalWrite(greenP, HIGH);
delay(2000);
break;
}
default:{};
}
for (i = 30; i>= 0; i--){
lcd_1.setCursor(0,1);
digitalWrite(crossC, LOW);
lcd_1.print(i);
delay(500);
digitalWrite(crossC, HIGH);
delay(500);
if (i <= 10){
lcd_1.clear();
for(i = 10; i>= 0; i--)
{
digitalWrite(crossC, LOW);
lcd_1.print(i);
delay(500);
digitalWrite(crossC, HIGH);
delay(500);
}
}
}
lcd_1.clear();
Flag = 0;
button_stateC = false;
}