Hey WB, would you mind looking over this. It seems to work fine virtually. Ill have to build it tomorrow to actual tell. Does it look ok to you? Anything to clean it up or make it more efficient?
I have safety delays built in so the west lane wont switch from ed to green until 2 seconds after the east lane turns red, and vice versa. I also modified the idea behind crossing, so that the lights wont just change immediately. milli duration will be modified later. Thanks in advance
enum Color { start, red, green, yellow_w, yellow_e, delay_e, delay_w, crossing, crossing_w, crossing_e};
Color LightColor = start;
const byte ledPinRW = 5; // the number of the RED pin
const byte ledPinYW = 4; // the number of the YELLOW pin
const byte ledPinGW = 3; // the number of the GREEN pin
const byte ledPinRE = 8; // the number of the RED pin
const byte ledPinYE = 7; // the number of the YELLOW pin
const byte ledPinGE = 6; // the number of the GREEN pin
const byte buttonPinCW = 2;
const byte buttonPinE = 9;
const byte buttonPinW = 10;
const unsigned long RedPeriod = 5000;
const unsigned long YellowPeriod = 2000;
const unsigned long GreenPeriod = 5000;
const unsigned long CrossingPeriod = 5000;
const unsigned long Delay = 2000;
unsigned long ChangeTime=0;
void setup()
{
pinMode(ledPinRW, OUTPUT); // initialize the LED pin as an output
pinMode(ledPinYW, OUTPUT); // initialize the LED pin as an output
pinMode(ledPinGW, OUTPUT); // initialize the LED pin as an output
pinMode(ledPinRE, OUTPUT); // initialize the LED pin as an output
pinMode(ledPinYE, OUTPUT); // initialize the LED pin as an output
pinMode(ledPinGE, OUTPUT); // initialize the LED pin as an output
pinMode(buttonPinCW, INPUT_PULLUP);
pinMode(buttonPinE, INPUT_PULLUP);
pinMode(buttonPinW, INPUT_PULLUP);
}
void loop()
{
if(digitalRead(ledPinGW) == HIGH &&digitalRead(buttonPinCW)==LOW)
{
delay(2000);
LightColor=crossing_w;
digitalWrite(ledPinRW,LOW);
digitalWrite(ledPinGW,LOW);
digitalWrite(ledPinYW,HIGH);
digitalWrite(ledPinRE,HIGH);
digitalWrite(ledPinGE,LOW);
digitalWrite(ledPinYE,LOW);
digitalWrite(buttonPinCW,HIGH);
ChangeTime=millis();
}
else if(digitalRead(ledPinGE) == HIGH && digitalRead(buttonPinCW)==LOW)
{
delay(2000);
LightColor=crossing_e;
digitalWrite(ledPinRW,HIGH);
digitalWrite(ledPinGW,LOW);
digitalWrite(ledPinYW,LOW);
digitalWrite(ledPinRE,LOW);
digitalWrite(ledPinGE,LOW);
digitalWrite(ledPinYE,HIGH);
digitalWrite(buttonPinCW,HIGH);
ChangeTime=millis();
}
switch(LightColor )
{
case start:
//WEST
digitalWrite(ledPinRW,HIGH);
//EAST
digitalWrite(ledPinRE,LOW);
digitalWrite(ledPinGE,HIGH);
LightColor=red;
ChangeTime=millis();
break;
case red:
if(millis()-ChangeTime > RedPeriod && digitalRead(buttonPinW)==LOW)
{
//EAST
digitalWrite(ledPinRE,LOW);
digitalWrite(ledPinYE,HIGH);
digitalWrite(ledPinGE,LOW);
//WEST
digitalWrite(ledPinGW,LOW);
digitalWrite(ledPinRW,HIGH);
LightColor=yellow_e;
ChangeTime=millis();
}
break;
case green:
if(millis()-ChangeTime > GreenPeriod && digitalRead(buttonPinE)==LOW)
{
//WEST
digitalWrite(ledPinGW,LOW);
digitalWrite(ledPinYW,HIGH);
//EAST
digitalWrite(ledPinRE,HIGH);
LightColor=yellow_w;
ChangeTime=millis();
}
break;
case yellow_w :
if(millis()-ChangeTime > YellowPeriod)
{
//WEST
digitalWrite(ledPinYW,LOW);
digitalWrite(ledPinRW,HIGH);
LightColor=delay_e;
ChangeTime=millis();
}
break;
case yellow_e :
if(millis()-ChangeTime > YellowPeriod)
{
//EAST
digitalWrite(ledPinYE,LOW);
digitalWrite(ledPinRE,HIGH);
LightColor=delay_w;
ChangeTime=millis();
}
break;
case delay_e:
if(millis()-ChangeTime > Delay)
{
//EAST
digitalWrite(ledPinRE,LOW);
digitalWrite(ledPinGE,HIGH);
LightColor=red;
ChangeTime=millis();
}
break;
case delay_w:
if(millis()-ChangeTime > Delay)
{
//WEST
digitalWrite(ledPinRW,LOW);
digitalWrite(ledPinGW,HIGH);
LightColor=green;
ChangeTime=millis();
}
break;
case crossing:
if(millis()-ChangeTime > CrossingPeriod)
{
LightColor=start;
ChangeTime=millis();
}
break;
case crossing_w:
if(millis()-ChangeTime > Delay)
{
//WEST
digitalWrite(ledPinYW,LOW);
digitalWrite(ledPinRW,HIGH);
LightColor=crossing;
ChangeTime=millis();
}
break;
case crossing_e:
if(millis()-ChangeTime > Delay)
{
//EAST
digitalWrite(ledPinYE,LOW);
digitalWrite(ledPinRE,HIGH);
LightColor=crossing;
ChangeTime=millis();
}
break;
}
}