#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);
}