// Define pin numbers for LEDs
const int redPin = 13;
const int yellowPin = 12;
const int greenPin = 11;
const int pedestrianButtonPin = 2;
// Variables to store state
int currentState = 0;
unsigned long lastStateChangeTime = 0;
boolean pedestrianButtonPressed = false;
boolean isNightMode = false; // New variable for night mode
void setup() {
// Initialize LED pins as outputs
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
// Initialize pedestrian button pin as input with pull-up resistor
pinMode(pedestrianButtonPin, INPUT_PULLUP);
// Attach interrupt for pedestrian button
attachInterrupt(digitalPinToInterrupt(pedestrianButtonPin), pedestrianButtonPush, FALLING);
// Initialize serial communication
Serial.begin(9600);
}
void loop() {
unsigned long currentTime = millis();
switch (currentState) {
case 0: // Green light
digitalWrite(greenPin, HIGH);
digitalWrite(yellowPin, LOW);
digitalWrite(redPin, LOW);
if (currentTime - lastStateChangeTime >= 8000 || pedestrianButtonPressed) {
currentState = 1;
lastStateChangeTime = currentTime;
Serial.println("Changing to Yellow");
}
break;
case 1: // Yellow light
digitalWrite(greenPin, LOW);
digitalWrite(redPin, LOW);
if (isNightMode) {
// Blink yellow light continuously during night mode
digitalWrite(yellowPin, (currentTime / 250) % 2 == 0); // Blink every 500 ms
} else {
digitalWrite(yellowPin, HIGH); // Stay solid in normal mode
}
if (currentTime - lastStateChangeTime >= 3000) {
currentState = 2;
lastStateChangeTime = currentTime;
Serial.println("Changing to Red");
}
break;
case 2: // Red light
digitalWrite(greenPin, LOW);
digitalWrite(yellowPin, LOW);
// Blink the red LED 5 times
for (int i = 0; i < 5; i++) {
digitalWrite(redPin, HIGH);
delay(250); // Blink duration
digitalWrite(redPin, LOW);
delay(250); // Blink duration
}
digitalWrite(redPin, HIGH); // Stay solid after blinking
delay(3000);
pedestrianButtonPressed = false;
currentState = 0; // Back to green
lastStateChangeTime = currentTime;
Serial.println("Changing to Green");
break;
}
}
void pedestrianButtonPush() {
pedestrianButtonPressed = true;
isNightMode = !isNightMode; // Toggle night mode
Serial.print("Pedestrian button pressed! Night mode: ");
Serial.println(isNightMode ? "ON" : "OFF");
}