#define LANE1_GREEN 14
#define LANE1_YELLOW 3
#define LANE1_RED 4
#define LANE2_GREEN 5
#define LANE2_YELLOW 6
#define LANE2_RED 7
#define LANE3_GREEN 8
#define LANE3_YELLOW 9
#define LANE3_RED 10
#define LANE4_GREEN 11
#define LANE4_YELLOW 12
#define LANE4_RED 13
#define PED_RED 15
#define PED_GREEN 16
#define PED_BUTTON 2
volatile bool pedestrianRequest = false; // 보행자 버튼 상태 저장
void pedestrianInterrupt() {
pedestrianRequest = true; // 보행자 버튼이 눌리면 true 설정
}
void setup() {
pinMode(LANE1_GREEN, OUTPUT);
pinMode(LANE1_YELLOW, OUTPUT);
pinMode(LANE1_RED, OUTPUT);
pinMode(LANE2_GREEN, OUTPUT);
pinMode(LANE2_YELLOW, OUTPUT);
pinMode(LANE2_RED, OUTPUT);
pinMode(LANE3_GREEN, OUTPUT);
pinMode(LANE3_YELLOW, OUTPUT);
pinMode(LANE3_RED, OUTPUT);
pinMode(LANE4_GREEN, OUTPUT);
pinMode(LANE4_YELLOW, OUTPUT);
pinMode(LANE4_RED, OUTPUT);
pinMode(PED_RED, OUTPUT);
pinMode(PED_GREEN, OUTPUT);
pinMode(PED_BUTTON, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PED_BUTTON), pedestrianInterrupt, FALLING); // 인터럽트 설정
Serial.begin(9600);
}
void loop() {
if (pedestrianRequest) {
handlePedestrian();
} else {
trafficCycle();
}
}
void trafficCycle() {
// LANE 1 & 3 GREEN
digitalWrite(LANE1_GREEN, HIGH);
digitalWrite(LANE3_GREEN, HIGH);
digitalWrite(LANE1_RED, LOW);
digitalWrite(LANE3_RED, LOW);
delay(5000);
if (pedestrianRequest) return;
// LANE 1 & 3 YELLOW
digitalWrite(LANE1_GREEN, LOW);
digitalWrite(LANE3_GREEN, LOW);
digitalWrite(LANE1_YELLOW, HIGH);
digitalWrite(LANE3_YELLOW, HIGH);
delay(2000);
if (pedestrianRequest) return;
// LANE 1 & 3 RED
digitalWrite(LANE1_YELLOW, LOW);
digitalWrite(LANE3_YELLOW, LOW);
digitalWrite(LANE1_RED, HIGH);
digitalWrite(LANE3_RED, HIGH);
delay(2000);
if (pedestrianRequest) return;
// LANE 2 & 4 GREEN
digitalWrite(LANE2_GREEN, HIGH);
digitalWrite(LANE4_GREEN, HIGH);
digitalWrite(LANE2_RED, LOW);
digitalWrite(LANE4_RED, LOW);
delay(5000);
if (pedestrianRequest) return;
// LANE 2 & 4 YELLOW
digitalWrite(LANE2_GREEN, LOW);
digitalWrite(LANE4_GREEN, LOW);
digitalWrite(LANE2_YELLOW, HIGH);
digitalWrite(LANE4_YELLOW, HIGH);
delay(2000);
if (pedestrianRequest) return;
// LANE 2 & 4 RED
digitalWrite(LANE2_YELLOW, LOW);
digitalWrite(LANE4_YELLOW, LOW);
digitalWrite(LANE2_RED, HIGH);
digitalWrite(LANE4_RED, HIGH);
delay(2000);
}
void handlePedestrian() {
Serial.println("🚶 Pedestrian request activated!");
// 모든 차량을 정지 (RED ON)
digitalWrite(LANE1_GREEN, LOW);
digitalWrite(LANE1_YELLOW, LOW);
digitalWrite(LANE1_RED, HIGH);
digitalWrite(LANE2_GREEN, LOW);
digitalWrite(LANE2_YELLOW, LOW);
digitalWrite(LANE2_RED, HIGH);
digitalWrite(LANE3_GREEN, LOW);
digitalWrite(LANE3_YELLOW, LOW);
digitalWrite(LANE3_RED, HIGH);
digitalWrite(LANE4_GREEN, LOW);
digitalWrite(LANE4_YELLOW, LOW);
digitalWrite(LANE4_RED, HIGH);
// 보행자 신호 켜기
digitalWrite(PED_RED, LOW);
digitalWrite(PED_GREEN, HIGH);
delay(5000); // 보행자 신호 유지
// 보행자 신호 끄기
digitalWrite(PED_GREEN, LOW);
digitalWrite(PED_RED, HIGH);
pedestrianRequest = false; // 보행자 요청 해제
}