// 🚦 ATmega2560 交通號誌LED(雙向) 即時切換版 (不使用 delay())
int TG1 = 24;int TY1 = 23;int TR1 = 22;int TG2 = 27;int TY2 = 26;int TR2 = 25;int TG3 = 32;int TY3 = 31;int TR3 = 30;int TG4 = 35;int TY4 = 34;int TR4 = 33;
int sw1 = 38; // 自動模式int sw2 = 39; // 閃燈模式int sw3 = 40; // 手動放行模式int sw4 = 41; // 全部熄滅
unsigned long previousMillis = 0;unsigned long interval = 1000;int mode = 0; // 目前模式int state = 0; // 自動循環階段bool blinkState = false;
void setup() { pinMode(TG1, OUTPUT); pinMode(TY1, OUTPUT); pinMode(TR1, OUTPUT); pinMode(TG2, OUTPUT); pinMode(TY2, OUTPUT); pinMode(TR2, OUTPUT); pinMode(TG3, OUTPUT); pinMode(TY3, OUTPUT); pinMode(TR3, OUTPUT); pinMode(TG4, OUTPUT); pinMode(TY4, OUTPUT); pinMode(TR4, OUTPUT);
pinMode(sw1, INPUT_PULLUP); pinMode(sw2, INPUT_PULLUP); pinMode(sw3, INPUT_PULLUP); pinMode(sw4, INPUT_PULLUP);
allOff();}
void loop() { // 🟢 檢查按鈕狀態並即時切換模式 if (digitalRead(sw1) == HIGH) mode = 1; // 自動循環 if (digitalRead(sw2) == HIGH) mode = 2; // 閃燈 if (digitalRead(sw3) == HIGH) mode = 3; // 手動放行 if (digitalRead(sw4) == HIGH) mode = 4; // 全部熄滅
switch (mode) { case 1: autoCycle(); break; case 2: blinkMode(); break; case 3: manualMode(); break; case 4: allOff(); break; }}
// 🟢 模式 1:自動紅綠燈循環void autoCycle() { unsigned long currentMillis = millis();
if (state == 0) { // 方向1通行,方向2停止 digitalWrite(TG1, HIGH); digitalWrite(TG3, HIGH); digitalWrite(TR2, HIGH); digitalWrite(TR4, HIGH); if (currentMillis - previousMillis >= 3000) { previousMillis = currentMillis; state = 1; } } else if (state == 1) { // 方向1黃燈 digitalWrite(TG1, LOW); digitalWrite(TG3, LOW); digitalWrite(TY1, HIGH); digitalWrite(TY3, HIGH); if (currentMillis - previousMillis >= 1000) { previousMillis = currentMillis; digitalWrite(TY1, LOW); digitalWrite(TY3, LOW); digitalWrite(TR2, LOW); digitalWrite(TR4, LOW); state = 2; } } else if (state == 2) { // 方向2通行,方向1停止 digitalWrite(TR1, HIGH); digitalWrite(TR3, HIGH); digitalWrite(TG2, HIGH); digitalWrite(TG4, HIGH); if (currentMillis - previousMillis >= 3000) { previousMillis = currentMillis; state = 3; } } else if (state == 3) { // 方向2黃燈 digitalWrite(TG2, LOW); digitalWrite(TG4, LOW); digitalWrite(TY2, HIGH); digitalWrite(TY4, HIGH); if (currentMillis - previousMillis >= 1000) { previousMillis = currentMillis; digitalWrite(TY2, LOW); digitalWrite(TY4, LOW); digitalWrite(TR1, LOW); digitalWrite(TR3, LOW); state = 0; } }}
// ⚠️ 模式 2:閃燈警示(黃燈交替閃爍)void blinkMode() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= 500) { previousMillis = currentMillis; blinkState = !blinkState; digitalWrite(TY1, blinkState); digitalWrite(TY3, blinkState); digitalWrite(TY2, !blinkState); digitalWrite(TY4, !blinkState); }}
// 🚗 模式 3:手動放行(方向2綠燈,方向1紅燈)void manualMode() { allOff(); digitalWrite(TR1, HIGH); digitalWrite(TR3, HIGH); digitalWrite(TG2, HIGH); digitalWrite(TG4, HIGH);}
// 🛑 模式 4:全部熄滅void allOff() { digitalWrite(TG1, LOW); digitalWrite(TY1, LOW); digitalWrite(TR1, LOW); digitalWrite(TG2, LOW); digitalWrite(TY2, LOW); digitalWrite(TR2, LOW); digitalWrite(TG3, LOW); digitalWrite(TY3, LOW); digitalWrite(TR3, LOW); digitalWrite(TG4, LOW); digitalWrite(TY4, LOW); digitalWrite(TR4, LOW);}