const int ledRedPin = 4;
const int ledYellowPin = 5;
const int ledGreenPin = 18;
const int buttonPin = 13;
int mode = 0;
const unsigned long longtime = 3000;
const unsigned long shorttime = 1000;
// 記錄按鈕上一個狀態
int lastButtonState = LOW;
// 燈光目前第幾個步驟
int lightStep = 0;
// 上一次切換燈光的時間
unsigned long previousMillis = 0;
// 控制三顆 LED
void light(int red, int yellow, int green) {
digitalWrite(ledRedPin, red);
digitalWrite(ledYellowPin, yellow);
digitalWrite(ledGreenPin, green);
}
void loopLight() {
unsigned long currentMillis = millis();
unsigned long waitTime;
// 根據「目前正在亮的燈」決定持續時間
if (lightStep == 0) {
// 🔴 紅燈 3 秒
waitTime = longtime;
}
else if (lightStep == 1) {
// 🔴🟡 紅+黃 1 秒
waitTime = shorttime;
}
else if (lightStep == 2) {
// 🟢 綠燈 3 秒
waitTime = longtime;
}
else {
// 🟡 黃燈 1 秒
waitTime = shorttime;
}
// 還沒到切換時間
if (currentMillis - previousMillis < waitTime) {
return;
}
// 到時間了,切換到下一個燈
previousMillis = currentMillis;
lightStep++;
// 超過最後一個步驟,回到紅燈
if (lightStep >= 4) {
lightStep = 0;
}
// 顯示新的燈光
if (lightStep == 0) {
// 🔴
light(HIGH, LOW, LOW);
}
else if (lightStep == 1) {
// 🔴🟡
light(HIGH, HIGH, LOW);
}
else if (lightStep == 2) {
// 🟢
light(LOW, LOW, HIGH);
}
else if (lightStep == 3) {
// 🟡
light(LOW, HIGH, LOW);
}
}
void yellowBlink() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis < 500) {
return;
}
previousMillis = currentMillis;
if (lightStep == 0) {
light(LOW, HIGH, LOW);
lightStep = 1;
}
else {
light(LOW, LOW, LOW);
lightStep = 0;
}
}
void setup() {
pinMode(ledRedPin, OUTPUT);
pinMode(ledYellowPin, OUTPUT);
pinMode(ledGreenPin, OUTPUT);
pinMode(buttonPin, INPUT);
Serial.begin(115200);
// 開機直接亮紅燈
light(HIGH, LOW, LOW);
// 從現在開始計時
previousMillis = millis();
}
void loop() {
int buttonState = digitalRead(buttonPin);
// 偵測按鈕按下
if (buttonState == HIGH && lastButtonState == LOW) {
mode++;
// 0 → 1
// 1 → 0
if (mode >= 2) {
mode = 0;
}
if (mode == 0) {
// 交通燈模式
lightStep = 0;
light(HIGH, LOW, LOW);
previousMillis = millis();
Serial.println("TRAFFIC");
}
else if (mode == 1) {
// 黃燈閃爍模式
lightStep = 0;
light(LOW, HIGH, LOW);
previousMillis = millis();
Serial.println("YELLOW BLINK");
}
}
// 根據模式執行不同程式
if (mode == 0) {
loopLight();
}
else if (mode == 1) {
yellowBlink();
}
lastButtonState = buttonState;
}