/*
Simple Traffic Light with Emergency Priority
Emergency works in YELLOW and RED
*/
// LED pins
int redLed = 10;
int yellowLed = 11;
int greenLed = 12;
// Input pins
int buttonPin = 2;
int ldrPin = A0;
// Time settings (milliseconds)
int greenTime = 5000;
int yellowTime = 2000;
int redTime = 5000;
int emergencyGreenTime = 7000;
// LDR threshold
int ldrThreshold = 700;
void setup() {
Serial.begin(9600);
pinMode(redLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(greenLed, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // button to GND
Serial.print("LDR Value:");
Serial.println(analogRead(ldrPin));
}
void loop() {
// -------- GREEN --------
digitalWrite(greenLed, HIGH);
digitalWrite(yellowLed, LOW);
digitalWrite(redLed, LOW);
delay(greenTime);
// -------- YELLOW --------
digitalWrite(greenLed, LOW);
digitalWrite(yellowLed, HIGH);
digitalWrite(redLed, LOW);
unsigned long startYellow = millis();
while (millis() - startYellow < yellowTime) {
Serial.print("LDR Value:");
Serial.println(analogRead(ldrPin));
if (isEmergency()) {
handleEmergency();
return; // restart normal cycle
}
}
// -------- RED --------
digitalWrite(greenLed, LOW);
digitalWrite(yellowLed, LOW);
digitalWrite(redLed, HIGH);
unsigned long startRed = millis();
while (millis() - startRed < redTime) {
Serial.print("LDR Value:");
Serial.println(analogRead(ldrPin));
if (isEmergency()) {
handleEmergency();
return; // restart normal cycle
}
}
}
/* ---------- Helper Functions ---------- */
// Check emergency condition
bool isEmergency() {
if (digitalRead(buttonPin) == LOW) return true;
if (analogRead(ldrPin) > ldrThreshold) return true;
return false;
}
// Emergency handling
void handleEmergency() {
digitalWrite(redLed, LOW);
digitalWrite(yellowLed, LOW);
digitalWrite(greenLed, HIGH);
delay(emergencyGreenTime);
digitalWrite(greenLed, LOW);
}