#include <Wire.h>;
#include <LiquidCrystal_I2C.h>;
LiquidCrystal_I2C lcd(0x27, 16,2);
#define Red_NS 13
#define Yellow_NS 12
#define Green_NS 11
#define CrossRed_NS 10
#define CrossBlue_NS 9
#define Red_WE 8
#define Yellow_WE 7
#define Green_WE 6
#define CrossRed_WE 5
#define CrossBlue_WE 4
#define RedTime 4
#define GreenTime 4
#define YellowTime 2
#define DelayTime 1000
#define DelayTime_2 2000
#define DelayTime_4 4000
#define button_NS 2
#define button_WE 3
volatile int button_state = 0;
int i = 0;
int Flag_NS;
int Flag_WE;
int Light_State;
char SevenSeg[16]={0x3F,0b00000110,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
const int SevenSeg_WE[7]={22,23,24,25,26,27,28};
byte DisplayNum[10][7]={
{0,0,0,0,0,0,1}, //0
{1,0,0,1,1,1,1}, //1
{0,0,1,0,0,1,0}, //2
{0,0,0,0,1,1,0}, //3
{1,0,0,1,1,0,0}, //4
{0,1,0,0,1,0,0}, //5
{0,1,0,0,0,0,0}, //6
{0,0,0,1,1,1,1}, //7
{0,0,0,0,0,0,0}, //8
{0,0,0,0,1,0,0}, //9
};
void setup()
{
lcd.init();
lcd.backlight();
pinMode(Red_NS, OUTPUT);
pinMode(Yellow_NS, OUTPUT);
pinMode(Green_NS, OUTPUT);
pinMode(CrossRed_NS, OUTPUT);
pinMode(CrossBlue_NS, OUTPUT);
pinMode(Red_WE, OUTPUT);
pinMode(Yellow_WE, OUTPUT);
pinMode(Green_WE, OUTPUT);
pinMode(CrossRed_WE, OUTPUT);
pinMode(CrossBlue_WE, OUTPUT);
pinMode(button_NS, INPUT);
pinMode(button_WE, INPUT);
attachInterrupt(0, SetFlag_NS, CHANGE);
attachInterrupt(1, SetFlag_WE, CHANGE);
Serial.begin(9600);
Flag_NS = 0;
Flag_WE = 0;
DDRC=0b11111111; //Pin 37-30
for(i=0;i<8;i++)
{
pinMode(SevenSeg_WE[i], OUTPUT);
}
lcd.clear();
lcd.setCursor(0,0);
lcd.println("N *Do Not Cross*");
lcd.setCursor(0,1);
lcd.println("W *Do Not Cross*");
}
void loop()
{
for(i=0;i<5;i++)
{
digitalWrite(Red_NS, HIGH);
digitalWrite(Red_WE, HIGH);
digitalWrite(CrossRed_NS, HIGH);
digitalWrite(CrossRed_WE, HIGH);
delay(500);
digitalWrite(Red_NS, LOW);
digitalWrite(Red_WE, LOW);
digitalWrite(CrossRed_NS, LOW);
digitalWrite(CrossRed_WE, LOW);
delay(500);
}
LOOP:
//state green NS == 1
digitalWrite(Green_WE, LOW);
digitalWrite(Yellow_WE, LOW);
digitalWrite(Red_WE, HIGH);
digitalWrite(Yellow_NS, LOW);
digitalWrite(Red_NS, LOW);
digitalWrite(Green_NS, HIGH);
Cross_NS_Off();
Cross_WE_Off();
CheckFlag(1);
//state Yellow NS == 2
digitalWrite(Green_WE, LOW);
digitalWrite(Yellow_WE, LOW);
digitalWrite(Red_WE, HIGH);
digitalWrite(Green_NS, LOW);
digitalWrite(Red_NS, LOW);
digitalWrite(Yellow_NS, HIGH);
Cross_NS_Off();
Cross_WE_Off();
CheckFlag(2);
//state Red NS == 3
digitalWrite(Green_WE, LOW);
digitalWrite(Yellow_WE, LOW);
digitalWrite(Red_WE, HIGH);
digitalWrite(Green_NS, LOW);
digitalWrite(Yellow_NS, LOW);
digitalWrite(Red_NS, HIGH);
Cross_NS_Off();
Cross_WE_Off();
CheckFlag(3);
//state Green WE == 4
digitalWrite(Green_NS, LOW);
digitalWrite(Yellow_NS, LOW);
digitalWrite(Red_NS, HIGH);
digitalWrite(Red_WE, LOW);
digitalWrite(Yellow_WE, LOW);
digitalWrite(Green_WE, HIGH);
Cross_NS_Off();
Cross_WE_Off();
CheckFlag(4);
//state Yellow WE == 5
digitalWrite(Green_NS, LOW);
digitalWrite(Yellow_NS, LOW);
digitalWrite(Red_NS, HIGH);
digitalWrite(Red_WE, LOW);
digitalWrite(Green_WE, LOW);
digitalWrite(Yellow_WE, HIGH);
Cross_NS_Off();
Cross_WE_Off();
CheckFlag(5);
//state Red WE == 6
digitalWrite(Green_NS, LOW);
digitalWrite(Yellow_NS, LOW);
digitalWrite(Red_NS, HIGH);
digitalWrite(Yellow_WE, LOW);
digitalWrite(Green_WE, LOW);
digitalWrite(Red_WE, HIGH);
Cross_NS_Off();
Cross_WE_Off();
CheckFlag(6);
goto LOOP;
}
//Functions Sections
void Cross_NS_Off()
{
digitalWrite(CrossBlue_NS, LOW);
digitalWrite(CrossRed_NS, HIGH);
}
void Cross_WE_Off()
{
digitalWrite(CrossBlue_WE, LOW);
digitalWrite(CrossRed_WE, HIGH);
}
void CheckFlag(int x)
{
for(i=0;i<RedTime;i++)
{
delay(DelayTime);
if(Flag_NS==1 || Flag_WE==1)
{
Light_State = x;
Pedestian();
}
}
}
void SetFlag_NS(void)
{
Flag_NS=1;
}
void SetFlag_WE(void)
{
Flag_WE=1;
}
void Seven()
{
for(int i=9; i>=0;i--)
//Sent the 7Segment code and invert becouse the Display off wit aout of 1
{
if(Flag_NS == 1)
{
PORTC=~SevenSeg[i];
}
else
{
for(int j=0;j<=6;j++)
{
digitalWrite(SevenSeg_WE[j], DisplayNum[i][j]);
}
}
delay(1000);
}
}
void lcd_NS()
{
lcd.setCursor(0,0);
lcd.println("N **Walk Now**");
lcd.setCursor(0,1);
lcd.println("W *Do Not Cross*");
Seven();
lcd.setCursor(0,0);
lcd.println("N *Do Not Cross*");
}
void lcd_WE()
{
lcd.setCursor(0,0);
lcd.println("N *Do Not Cross*");
lcd.setCursor(0,1);
lcd.println("W **Walk Now**");
Seven();
lcd.setCursor(0,1);
lcd.println("W *Do Not Cross*");
}
//state section
void Pedestian(void)
{
switch(Light_State)
{
case 1:
{
if(Flag_NS==1)
{
digitalWrite(CrossRed_NS, LOW);
digitalWrite(CrossBlue_NS, HIGH);
lcd_NS();
}
else if(Flag_WE==1)
{
digitalWrite(Green_NS, LOW);
digitalWrite(Yellow_NS, HIGH);
delay(DelayTime_2);
digitalWrite(Yellow_NS, LOW);
digitalWrite(Red_NS, HIGH);
digitalWrite(Red_WE, LOW);
digitalWrite(Green_WE, HIGH);
digitalWrite(CrossRed_WE, LOW);
digitalWrite(CrossBlue_WE, HIGH);
lcd_WE();
}
}
break;
case 2:
{
if(Flag_NS==1){
delay(500);
delay(DelayTime);
digitalWrite(Yellow_NS, LOW);
digitalWrite(Red_NS, HIGH);
digitalWrite(CrossRed_NS, LOW);
digitalWrite(CrossBlue_NS, HIGH);
lcd_NS();
}
else if(Flag_WE==1){
delay(500);
digitalWrite(Yellow_NS, LOW);
digitalWrite(Red_NS, HIGH);
digitalWrite(Red_WE, LOW);
digitalWrite(Green_WE, HIGH);
digitalWrite(CrossRed_WE, LOW);
digitalWrite(CrossBlue_WE, HIGH);
lcd_WE();
digitalWrite(Green_WE, LOW);
digitalWrite(Yellow_WE, HIGH);
delay(DelayTime_2);
digitalWrite(Yellow_WE, LOW);
digitalWrite(Red_WE, HIGH);
}
}
break;
case 3:
{
if(Flag_NS==1){
digitalWrite(CrossBlue_NS, LOW);
digitalWrite(CrossRed_NS, HIGH);
lcd_NS();
}
else if(Flag_WE==1){
digitalWrite(CrossRed_WE, LOW);
digitalWrite(CrossBlue_WE, HIGH);
digitalWrite(Red_WE, LOW);
digitalWrite(Green_WE, HIGH);
lcd_WE();
digitalWrite(Green_WE, LOW);
digitalWrite(Yellow_WE, HIGH);
delay(DelayTime_2);
digitalWrite(Yellow_WE, LOW);
digitalWrite(Red_WE, HIGH);
}
}
break;
case 4:
{
if(Flag_NS==1){
delay(500);
digitalWrite(Green_WE, LOW);
digitalWrite(Yellow_WE, HIGH);
delay(DelayTime_2);
digitalWrite(Yellow_WE, LOW);
digitalWrite(Red_WE, HIGH);
digitalWrite(CrossRed_NS, LOW);
digitalWrite(CrossBlue_NS, HIGH);
lcd_NS();
}
else if(Flag_WE==1){
digitalWrite(CrossRed_WE, LOW);
digitalWrite(CrossBlue_WE, HIGH);
lcd_WE();
}
}
break;
case 5:
{
if(Flag_NS==1){
digitalWrite(Yellow_WE, LOW);
digitalWrite(Red_WE, HIGH);
delay(DelayTime);
digitalWrite(CrossRed_NS, LOW);
digitalWrite(CrossBlue_NS, HIGH);
digitalWrite(Red_NS, LOW);
digitalWrite(Green_NS, HIGH);
lcd_NS();
digitalWrite(Green_NS, LOW);
digitalWrite(Yellow_NS, HIGH);
delay(DelayTime_2);
digitalWrite(Yellow_NS, LOW);
digitalWrite(Red_NS, HIGH);
}
else if(Flag_WE==1){
digitalWrite(CrossRed_WE, LOW);
digitalWrite(CrossBlue_WE, HIGH);
lcd_WE();
digitalWrite(Yellow_WE, LOW);
digitalWrite(Red_WE, HIGH);
delay(DelayTime);
}
}
break;
case 6:
{
if(Flag_NS==1){
digitalWrite(CrossRed_NS, LOW);
digitalWrite(CrossBlue_NS, HIGH);
delay(DelayTime);
digitalWrite(Red_NS,LOW);
digitalWrite(Green_NS,HIGH);
lcd_NS();
}
else if(Flag_WE==1){
digitalWrite(CrossRed_WE, LOW);
digitalWrite(CrossBlue_WE,HIGH);
lcd_WE();
digitalWrite(Red_WE,LOW);
digitalWrite(Green_WE,HIGH);
delay(500);
digitalWrite(Green_WE,LOW);
digitalWrite(Yellow_WE,HIGH);
delay(500);
digitalWrite(Yellow_WE,LOW);
digitalWrite(Red_WE,HIGH);
delay(DelayTime);
}
}
break;
default:{};
for (i=0;i<=5;i++){
if(Flag_WE==1){
digitalWrite(CrossBlue_NS,LOW);
delay(DelayTime);
digitalWrite(CrossBlue_NS,HIGH);
delay(DelayTime);
}
else if(Flag_NS=1){
digitalWrite(CrossBlue_WE, LOW);
delay(DelayTime);
digitalWrite(CrossBlue_WE, HIGH);
delay(DelayTime);
}
}
}
Flag_NS=0;
Flag_WE=0;
}