// ===== PIN DEFINITIONS =====
#define RED_LED 5
#define YELLOW_LED 4
#define GREEN_LED 2
#define BUZZER 18
#define EMG_BTN 12 // Emergency
#define DENSITY_BTN 14 // Traffic density
#define SCHOOL_BTN 27 // School mode ON/OFF
#define PED_BTN 26 // Pedestrian button
#define ULTRA_BTN 25 // Ultrasonic (student crossed without button)
// ===== SETUP =====
void setup() {
pinMode(RED_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(EMG_BTN, INPUT_PULLUP);
pinMode(DENSITY_BTN, INPUT_PULLUP);
pinMode(SCHOOL_BTN, INPUT_PULLUP);
pinMode(PED_BTN, INPUT_PULLUP);
pinMode(ULTRA_BTN, INPUT_PULLUP);
digitalWrite(RED_LED, HIGH);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BUZZER, LOW);
}
// ===== EMERGENCY MODE =====
void emergencyMode() {
digitalWrite(RED_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
digitalWrite(BUZZER, HIGH);
}
// ===== SCHOOL ZONE MODE =====
void schoolZone() {
// Yellow blinking warning
digitalWrite(YELLOW_LED, HIGH);
delay(300);
digitalWrite(YELLOW_LED, LOW);
delay(300);
// Planned crossing (button pressed)
if (digitalRead(PED_BTN) == LOW) {
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BUZZER, LOW); // calm crossing
delay(8000);
}
// Emergency child crossing (no button)
else if (digitalRead(ULTRA_BTN) == LOW) {
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BUZZER, HIGH); // emergency warning
delay(3000);
digitalWrite(BUZZER, LOW);
}
}
// ===== TRAFFIC WITH DENSITY =====
void trafficWithDensity() {
bool highDensity = (digitalRead(DENSITY_BTN) == LOW);
int greenTime = highDensity ? 8000 : 3000;
// RED
digitalWrite(RED_LED, HIGH);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, LOW);
delay(3000);
// GREEN
digitalWrite(RED_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
delay(greenTime);
// YELLOW
digitalWrite(RED_LED, LOW);
digitalWrite(YELLOW_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
delay(1500);
}
// ===== LOOP =====
void loop() {
// 1️⃣ Emergency (TOP PRIORITY)
if (digitalRead(EMG_BTN) == LOW) {
emergencyMode();
while (digitalRead(EMG_BTN) == LOW) {
delay(10);
}
digitalWrite(BUZZER, LOW);
}
// 2️⃣ School Zone
else if (digitalRead(SCHOOL_BTN) == LOW) {
schoolZone();
}
// 3️⃣ Normal traffic with density
else {
trafficWithDensity();
}
}