#include <Arduino.h>
// Forward declaration of TrafficLight class
class TrafficLight;
// Base state class
class State {
public:
virtual void handleState(TrafficLight& trafficLight) = 0;
virtual ~State() {} // Making the base class destructor virtual
};
// Concrete state classes
class RedState : public State {
public:
void handleState(TrafficLight& trafficLight) override;
};
class GreenState : public State {
public:
void handleState(TrafficLight& trafficLight) override;
};
class YellowState : public State {
public:
void handleState(TrafficLight& trafficLight) override;
};
// TrafficLight class
class TrafficLight {
private:
State* currentState; // Pointer to the current state
public:
TrafficLight() : currentState(nullptr) {}
void setState(State* newState) {
if (currentState)
delete currentState; // Free the previous state
currentState = newState;
}
void run() {
while (true) {
if (currentState)
currentState->handleState(*this); // Handle the current state
}
}
};
// Define pin numbers for LEDs
const int RED_PIN = 13;
const int GREEN_PIN = 12;
const int YELLOW_PIN = 11;
// Define durations for each state in milliseconds
const int RED_DURATION = 8000; // 8 seconds
const int GREEN_DURATION =15000; // 15 seconds
const int YELLOW_DURATION = 5000; // 5 seconds
void RedState::handleState(TrafficLight& trafficLight) {
// Set red light ON, green and yellow OFF
digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(YELLOW_PIN, LOW);
// Wait in this state for some time
delay(RED_DURATION);
// Transition to GreenState
trafficLight.setState(new GreenState());
}
void GreenState::handleState(TrafficLight& trafficLight) {
// Set green light ON, red and yellow OFF
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(YELLOW_PIN, LOW);
// Wait in this state for some time
delay(GREEN_DURATION);
// Transition to YellowState
trafficLight.setState(new YellowState());
}
void YellowState::handleState(TrafficLight& trafficLight) {
// Set yellow light ON, red and green OFF
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(YELLOW_PIN, HIGH);
// Wait in this state for some time
delay(YELLOW_DURATION);
// Transition to RedState
trafficLight.setState(new RedState());
}
TrafficLight trafficLight;
void setup() {
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(YELLOW_PIN, OUTPUT);
trafficLight.setState(new RedState()); // Start with RedState
}
void loop() {
trafficLight.run(); // Start traffic light operation
}