#define red 7
#define yellow 6
#define green 5
#define WL1 9
#define WL2 8
int state = 0;
int reddur = 10;
int yellowdur = 3;
int greendur = 7;
unsigned long previousMillis = 0;
const long interval = 500;
unsigned long trafficPreviousMillis = 0;
int redCounter = 0;
int greenCounter = 0;
int yellowCounter = 0;
void setup() {
pinMode(red, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(green, OUTPUT);
pinMode(WL1, OUTPUT);
pinMode(WL2, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
// LED blinking logic for WL1 and WL2
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
switch (state) {
case 0:
digitalWrite(WL1, HIGH); // Turn on WL1
state = 1;
break;
case 1:
digitalWrite(WL1, LOW); // Turn off WL1
state = 2;
break;
case 2:
digitalWrite(WL2, HIGH); // Turn on WL2
state = 3;
break;
case 3:
digitalWrite(WL2, LOW); // Turn off WL2
state = 0;
break;
}
}
// Traffic light logic using millis() for timing
unsigned long trafficCurrentMillis = millis();
if (trafficCurrentMillis - trafficPreviousMillis >= 1000) { // Check every second
trafficPreviousMillis = trafficCurrentMillis;
// Red light duration
if (redCounter < reddur) {
digitalWrite(red, LOW); // Turn on red
digitalWrite(yellow, HIGH); // Turn off yellow
digitalWrite(green, HIGH); // Turn off green
if (redCounter >= (reddur - 2)) {
digitalWrite(yellow, LOW);
}
redCounter++;
}
// Green light duration
else if (redCounter >= reddur && greenCounter < greendur) {
digitalWrite(red, HIGH); // Turn off red
digitalWrite(yellow, HIGH); // Turn off yellow
digitalWrite(green, LOW); // Turn on green
greenCounter++;
}
// Yellow light duration
else if (greenCounter >= greendur && yellowCounter < yellowdur) {
digitalWrite(red, HIGH); // Turn off red
digitalWrite(yellow, LOW); // Turn on yellow
digitalWrite(green, HIGH); // Turn off green
yellowCounter++;
}
// Reset counters after the full cycle
if (yellowCounter >= yellowdur) {
redCounter = 0;
greenCounter = 0;
yellowCounter = 0;
}
}
}