#include <Arduino.h>
// ===================== 引脚定义(严格匹配你的电路)=====================
#define RGB_R 5 // RGB红灯
#define RGB_G 15 // RGB绿灯
#define RGB_B 2 // RGB蓝灯
#define KEY 23 // 按键
#define PIR 27 // PIR红外人体感应
#define LDR 4 // 光敏电阻
#define BUZZER 25 // 蜂鸣器
// ===================== 系统状态 =====================
bool defensing = false; // 布防状态
bool alarming = false; // 报警状态
// 报警闪烁变量
unsigned long previousMillis = 0;
const long interval = 500;
bool ledState = false;
// ===================== 绿灯呼吸灯(布防状态)=====================
void greenBreath() {
static int brightness = 0;
static int step = 4;
if (defensing) {
brightness += step;
if (brightness > 255 || brightness < 0) step = -step;
analogWrite(RGB_G, brightness);
digitalWrite(RGB_R, LOW);
digitalWrite(RGB_B, LOW);
dacWrite(BUZZER, 0);
} else {
analogWrite(RGB_G, 0);
}
}
// ===================== 报警灯光 + 蜂鸣器 =====================
void alarmBlink() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
ledState = !ledState;
if (ledState) {
digitalWrite(RGB_R, HIGH);
digitalWrite(RGB_B, LOW);
dacWrite(BUZZER, 180);
} else {
digitalWrite(RGB_R, LOW);
digitalWrite(RGB_B, HIGH);
dacWrite(BUZZER, 0);
}
digitalWrite(RGB_G, LOW);
}
}
// ===================== 初始化 =====================
void setup() {
Serial.begin(115200);
// 引脚模式
pinMode(RGB_R, OUTPUT);
pinMode(RGB_G, OUTPUT);
pinMode(RGB_B, OUTPUT);
pinMode(KEY, INPUT_PULLUP);
pinMode(PIR, INPUT);
pinMode(LDR, INPUT);
pinMode(BUZZER, OUTPUT);
// 初始关闭所有设备
digitalWrite(RGB_R, LOW);
digitalWrite(RGB_G, LOW);
digitalWrite(RGB_B, LOW);
dacWrite(BUZZER, 0);
Serial.println("系统启动成功 → 等待光线触发布防");
}
// ===================== 主循环 =====================
void loop() {
// 读取按键(按下解除报警)
if (digitalRead(KEY) == LOW) {
alarming = false;
defensing = false;
digitalWrite(RGB_R, LOW);
digitalWrite(RGB_G, LOW);
digitalWrite(RGB_B, LOW);
dacWrite(BUZZER, 0);
delay(200);
}
// 读取光敏值
int lightValue = analogRead(LDR);
// 光线充足 → 自动布防
if (!defensing && lightValue > 2000) {
defensing = true;
alarming = false;
Serial.println("已进入布防状态");
}
// PIR 触发报警
if (defensing && digitalRead(PIR) == HIGH) {
alarming = true;
}
// 状态逻辑
if (alarming) {
alarmBlink();
} else {
greenBreath();
}
delay(50);
}