#define RED_LED 6
#define YELLOW_LED 5
#define SW 2
volatile bool interruptFlag = false;
// 0 = RED MODE, 1 = YELLOW MODE
byte mode = 0;
bool ledState = true;
byte yellowCount = 0;
unsigned long previousMillis = 0;
unsigned long lastButtonTime = 0;
// Interrupt Service Routine
void buttonISR() {
interruptFlag = true;
}
void setup() {
pinMode(RED_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(SW, INPUT_PULLUP);
Serial.begin(9600);
digitalWrite(RED_LED, HIGH);
digitalWrite(YELLOW_LED, LOW);
attachInterrupt(
digitalPinToInterrupt(SW),
buttonISR,
FALLING
);
previousMillis = millis();
Serial.println("System Ready");
Serial.println("RED LED BLINK");
}
void loop() {
unsigned long currentMillis = millis();
// ตรวจสอบ Interrupt จากสวิตช์
if (interruptFlag) {
noInterrupts();
interruptFlag = false;
interrupts();
// ตรวจสอบสถานะปุ่ม และกรองการเด้ง
if (mode == 0 &&
digitalRead(SW) == LOW &&
(lastButtonTime == 0 ||
currentMillis - lastButtonTime >= 200)) {
lastButtonTime = currentMillis;
mode = 1;
yellowCount = 0;
ledState = true;
digitalWrite(RED_LED, LOW);
digitalWrite(YELLOW_LED, HIGH);
previousMillis = currentMillis;
Serial.println("IRQ DETECTED");
Serial.println("YELLOW MODE START");
}
}
// MODE 0 : ไฟแดงกระพริบ
if (mode == 0) {
if (currentMillis - previousMillis >= 1000) {
previousMillis = currentMillis;
ledState = !ledState;
digitalWrite(RED_LED, ledState);
}
}
// MODE 1 : ไฟเหลืองกระพริบ
else if (mode == 1) {
if (currentMillis - previousMillis >= 250) {
previousMillis = currentMillis;
ledState = !ledState;
digitalWrite(YELLOW_LED, ledState);
// ครบหนึ่งรอบเมื่อไฟเหลืองดับ
if (ledState == LOW) {
yellowCount++;
Serial.print("Yellow Blink: ");
Serial.println(yellowCount);
}
// กระพริบครบ 10 ครั้ง
if (yellowCount >= 10) {
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, HIGH);
mode = 0;
ledState = true;
previousMillis = currentMillis;
Serial.println("YELLOW FINISHED");
Serial.println("BACK TO RED MODE");
}
}
}
}