/*
Forum:
Wokwi: https://wokwi.com/projects/439167530687499265
2025/08/13
ec2021
Two signal lights synchronized by time
The signals are for cars and pedestrians moving in the same or opposite direction
* left: Car signals
* right: Pedestrian signals
*/
constexpr unsigned long durationRed {4000};
constexpr unsigned long durationYellowRed {2000};
constexpr unsigned long durationYellow {2000};
constexpr unsigned long durationGreen {4000};
struct signalPins {
uint8_t Red;
uint8_t Yellow;
uint8_t Green;
};
enum signalState {RED, YELLOWRED, YELLOW, GREEN};
class SignalLightClass {
private:
signalPins carPin;
signalPins persPin;
signalState carState;
unsigned long startTime = 0;
unsigned long duration;
void changeState() {
switch (carState) {
case RED:
carState = YELLOWRED;
setSignal(HIGH, HIGH, LOW, HIGH, LOW);
duration = durationYellowRed;
break;
case YELLOWRED:
carState = GREEN;
setSignal(LOW, LOW, HIGH, LOW, HIGH);
duration = durationGreen;
break;
case YELLOW:
carState = RED;
setSignal(HIGH, LOW, LOW, HIGH, LOW);
duration = durationRed;
break;
case GREEN:
carState = YELLOW;
setSignal(LOW, HIGH, LOW, HIGH, LOW);
duration = durationYellow;
break;
}
};
void setSignal(byte Red, byte Yellow, byte Green, byte pRed, byte pGreen) {
digitalWrite(carPin.Red, Red);
digitalWrite(carPin.Yellow, Yellow);
digitalWrite(carPin.Green, Green);
digitalWrite(persPin.Red, pRed);
digitalWrite(persPin.Green, pGreen);
};
public:
SignalLightClass(signalPins cPins, signalPins pPins) : carPin(cPins), persPin(pPins) {};
void init(signalState startState) {
pinMode(carPin.Red, OUTPUT);
pinMode(carPin.Yellow, OUTPUT);
pinMode(carPin.Green, OUTPUT);
pinMode(persPin.Red, OUTPUT);
pinMode(persPin.Green, OUTPUT);
switch (startState) {
case RED:
carState = YELLOW;
break;
case YELLOWRED:
carState = RED;
break;
case YELLOW:
carState = GREEN;
break;
case GREEN:
carState = YELLOWRED;
break;
}
startTime = millis();
changeState();
};
void run() {
if (millis() - startTime > duration) {
startTime = millis();
changeState();
}
};
};
SignalLightClass signal1 = {{11, 12, 13}, {9, 0, 10}};
SignalLightClass signal2 = {{17, 16, 15}, {19, 0, 18}};
void setup() {
signal1.init(GREEN);
signal2.init(RED);
}
void loop() {
signal1.run();
signal2.run();
}
Cars and Pedestrians moving North-to-South or South-to-North
Cars and Pedestrians moving East-to-West or West-to-East