#include <Arduino.h>
#include "TrafficLight.h"
TrafficLight light1(12, 13, 14); // 交通灯1中红,黄,绿灯的引脚(南北方向)
TrafficLight light2(25, 26, 27); // 交通灯2中红,黄,绿灯的引脚(东西方向)
constexpr uint32_t TIME_T1 = 5000;
constexpr uint32_t TIME_T2 = 3000;
constexpr uint32_t TIME_T3 = 2000;
constexpr uint32_t TIME_T4 = 5000;
constexpr uint32_t TIME_T5 = 3000;
constexpr uint32_t TIME_T6 = 2000;
enum class SystemPhase {
PHASE_0_T1,
PHASE_T1_T2,
PHASE_T2_T3,
PHASE_T3_T4,
PHASE_T4_T5,
PHASE_T5_T6
};
SystemPhase currentPhase = SystemPhase::PHASE_0_T1;
uint32_t phaseStartTime = 0;
uint32_t lastBlinkTime = 0;
uint8_t blinkCount = 0;
bool blinkOnState = false;
void setup() {
Serial.begin(115200);
light1.begin();
light2.begin();
// 初始状态
enterPhase(SystemPhase::PHASE_0_T1);
}
void loop() {
uint32_t currentTime = millis();
uint32_t phaseElapsed = currentTime - phaseStartTime;
switch (currentPhase) {
case SystemPhase::PHASE_0_T1:
if (phaseElapsed >= TIME_T1) {
enterPhase(SystemPhase::PHASE_T1_T2);
}
break;
case SystemPhase::PHASE_T1_T2:
handleBlinking(currentTime, light1);
if (phaseElapsed >= TIME_T2) {
enterPhase(SystemPhase::PHASE_T2_T3);
}
break;
case SystemPhase::PHASE_T2_T3:
if (phaseElapsed >= TIME_T3) {
enterPhase(SystemPhase::PHASE_T3_T4);
}
break;
case SystemPhase::PHASE_T3_T4:
if (phaseElapsed >= TIME_T4) {
enterPhase(SystemPhase::PHASE_T4_T5);
}
break;
case SystemPhase::PHASE_T4_T5:
handleBlinking(currentTime, light2);
if (phaseElapsed >= TIME_T5) {
enterPhase(SystemPhase::PHASE_T5_T6);
}
break;
case SystemPhase::PHASE_T5_T6:
if (phaseElapsed >= TIME_T6) {
enterPhase(SystemPhase::PHASE_0_T1);
}
break;
}
}
void enterPhase(SystemPhase newPhase) {
currentPhase = newPhase;
phaseStartTime = millis();
lastBlinkTime = 0;
blinkCount = 0;
blinkOnState = false;
switch (newPhase) {
case SystemPhase::PHASE_0_T1:
light1.setColor(LightColor::GREEN);
light2.setColor(LightColor::RED);
break;
case SystemPhase::PHASE_T1_T2:
light1.setColor(LightColor::GREEN);
light2.setColor(LightColor::RED);
break;
case SystemPhase::PHASE_T2_T3:
light1.setColor(LightColor::YELLOW);
light2.setColor(LightColor::YELLOW);
digitalWrite(25, HIGH); //
break;
case SystemPhase::PHASE_T3_T4:
light1.setColor(LightColor::RED);
light2.setColor(LightColor::GREEN);
break;
case SystemPhase::PHASE_T4_T5:
light1.setColor(LightColor::RED);
light2.setColor(LightColor::GREEN);
break;
case SystemPhase::PHASE_T5_T6:
light1.setColor(LightColor::YELLOW);
digitalWrite(12, HIGH);
light2.setColor(LightColor::YELLOW);
break;
}
}
void handleBlinking(uint32_t currentTime, TrafficLight& light) {
const uint32_t BLINK_INTERVAL = 500;
if (currentTime - lastBlinkTime >= BLINK_INTERVAL && blinkCount < 6) {
lastBlinkTime = currentTime;
if (&light == &light1) {
digitalWrite(14, blinkCount % 2 == 0 ? LOW : HIGH);
} else {
digitalWrite(27, blinkCount % 2 == 0 ? LOW : HIGH);
}
blinkCount++;
}
}