#define redPin 4
#define yellowPin 3
#define greenPin 2
enum trafficState : uint8_t {RED, REDYELLOW, GREEN, YELLOW};
typedef void(*CallbackFunction)(void);
typedef struct {
CallbackFunction function;
uint8_t next;
unsigned long delayTime;
bool red;
bool green;
bool yellow;
} transition_t;
void Process();
transition_t transitions[] = {
{Process, 1, 3000, true, false, false},
{Process, 2, 1000, true, true, false},
{Process, 3, 2000, false, true, false},
{Process, 0, 3000, false, false, true},
};
uint8_t state;
bool start;
unsigned long startTime;
void setup() {
Serial.begin(115200);
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
state = RED; // Initial the state
Start(); // Start a timer
}
void loop() {
transitions[state].function(); // Call function
}
void Process() {
TrafficLight(transitions[state].red, transitions[state].yellow, transitions[state].green);
if (!TimerOn(transitions[state].delayTime)) return; // Condition for next state
Start(); // Start a timer-on
state = transitions[state].next; // Nex state
}
void Start() {
startTime = millis(); // Reset the start time
start = true; // Set start state
}
bool TimerOn(unsigned long delayTime) {
if (!start) return false; // Return false if not start a timer
if (millis() - startTime < delayTime) return false; // Return false if the elapsed time is less than the delay time.
start = false; // Reset start state
return true; // Timer ON, return true
}
void TrafficLight(bool red, bool yellow, bool green) {
digitalWrite(redPin, red);
digitalWrite(yellowPin, yellow);
digitalWrite(greenPin, green);
}