const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
const int walkPin = 9;
const int buttonPin = 2;
unsigned long previousMillis = 0;
const long yellowTime = 2000; // 2 seconds yellow
const long walkTime = 4000; // 4 seconds walk signal
int state = 0;
bool buttonPressed = false;
void setup() {
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(walkPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
// Initial state: red light
digitalWrite(redPin, HIGH);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(walkPin, LOW);
Serial.begin(9600);
}
void loop() {
unsigned long currentMillis = millis();
// Check button press (active LOW)
if (digitalRead(buttonPin) == LOW) {
delay(50); // debounce
if (digitalRead(buttonPin) == LOW) {
buttonPressed = true;
}
}
switch (state) {
case 0: // Green light (idle state)
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, HIGH);
digitalWrite(walkPin, LOW);
if (buttonPressed) {
state = 1;
previousMillis = currentMillis;
buttonPressed = false;
}
break;
case 1: // Green + Yellow
digitalWrite(greenPin, HIGH);
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, HIGH);
digitalWrite(walkPin, LOW);
if (currentMillis - previousMillis >= yellowTime) {
state = 2;
previousMillis = currentMillis;
}
break;
case 2: // Red + Walk
digitalWrite(greenPin, LOW);
digitalWrite(redPin, HIGH);
digitalWrite(yellowPin, LOW);
digitalWrite(walkPin, HIGH);
if (currentMillis - previousMillis >= walkTime) {
state = 0;
previousMillis = currentMillis;
}
break;
}
}