#define PIR_PIN 34
#define LED_PIN 18
#define BUZZER_PIN 19
#define CANCEL_BUTTON_PIN 25
bool alarmActive = false;
bool alarmCanceled = false;
bool lastMotionState = LOW;
bool readyToDetectAgain = true;
unsigned long lastPrintTime = 0;     // ← 加入顯示間隔控制
unsigned long lastBlinkTime = 0;
const unsigned long printInterval = 1000;  // 每 1 秒印一次警告
const unsigned long blinkInterval = 500;
bool buzzerState = false;
void setup() {
  pinMode(PIR_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(CANCEL_BUTTON_PIN, INPUT_PULLUP);
  Serial.begin(115200);
}
void loop() {
  int motionDetected = digitalRead(PIR_PIN);
  int cancelButton = digitalRead(CANCEL_BUTTON_PIN);
  unsigned long now = millis();
  // === 偵測到入侵,並啟動警報 ===
  if (motionDetected == HIGH && lastMotionState == LOW && !alarmActive && !alarmCanceled && readyToDetectAgain) {
    alarmActive = true;
    digitalWrite(LED_PIN, HIGH);
    lastBlinkTime = now;
    lastPrintTime = 0;
    readyToDetectAgain = false;
  }
  // === 警報啟動中:蜂鳴器閃爍 + 持續顯示訊息 ===
  if (alarmActive) {
    // 蜂鳴器閃爍
    if (now - lastBlinkTime >= blinkInterval) {
      buzzerState = !buzzerState;
      digitalWrite(BUZZER_PIN, buzzerState);
      lastBlinkTime = now;
    }
    // 每秒印一次訊息
    if (now - lastPrintTime >= printInterval) {
      Serial.println("偵測到入侵者!");
      lastPrintTime = now;
    }
  }
  // === 按下按鈕,取消警報 ===
  if (cancelButton == LOW && alarmActive) {
    Serial.println("警報已取消(按鈕)");
    alarmActive = false;
    alarmCanceled = true;
    digitalWrite(LED_PIN, LOW);
    digitalWrite(BUZZER_PIN, LOW);
    buzzerState = false;
  }
  // === 等人離開感測區,再允許下次觸發 ===
  if (motionDetected == LOW && alarmCanceled == true) {
    Serial.println("區域已清空,準備重新偵測");
    alarmCanceled = false;
    readyToDetectAgain = true;
  }
  lastMotionState = motionDetected;
  delay(50);
}