unsigned long trafficTime;
const int redPin = 27;
const int yellowPin = 14;
const int greenPin = 12;
unsigned long buttonTime = 0;
const int buttonPin = 15;
const int greenPed = 16;
const int redPed = 17;
void setup() {
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(greenPed, OUTPUT);
pinMode(redPed, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
trafficTime = (millis() - buttonTime) % 23000;
button();
timer();
lights();
}
bool hasClicked = false;
void button(){
hasClicked = (digitalRead(buttonPin) == HIGH || hasClicked);
}
int trafficState = 0;
void timer()
{
if (trafficState == 0 && hasClicked){
buttonTime += ((millis() % 23000)) + 3000 + 5000;
trafficState = 1;
lights();
delay(3000);
trafficState = 2;
lights();
delay(5000);
hasClicked = false;
}
else{
if(trafficTime <= 10000) trafficState = 0;
else if(trafficTime <= 13000) trafficState = 1;
else trafficState = 2;
}
}
void lights()
{
switch(trafficState)
{
default:
case 0:
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, HIGH);
digitalWrite(redPed, HIGH);
digitalWrite(greenPed, LOW);
break;
case 1:
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, HIGH);
digitalWrite(greenPin, LOW);
digitalWrite(redPed, HIGH);
digitalWrite(greenPed, LOW);
break;
case 2:
digitalWrite(redPin, HIGH);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(redPed, LOW);
digitalWrite(greenPed, HIGH);
break;
}
}