首页
/ 24小时守护无死角:用Arduino-ESP32打造DIY安防监控系统

24小时守护无死角:用Arduino-ESP32打造DIY安防监控系统

2026-02-04 04:07:43作者:邬祺芯Juliet

你是否曾担心外出时家中安全?传统安防设备价格高昂且依赖专业安装,而普通摄像头又存在隐私泄露风险。本文将手把手教你用Arduino-ESP32开发板搭建一套成本不到200元的智能安防系统,具备人体入侵检测、本地报警和远程通知功能,全程无需编写复杂代码,适合零基础爱好者入门。

系统组成与工作原理

安防监控系统主要由三大模块构成:

  • 检测模块:通过PIR(人体红外感应)传感器捕捉移动目标
  • 控制核心:ESP32开发板处理传感器数据并触发报警
  • 报警模块:蜂鸣器发出本地警报,同时通过WiFi发送通知

工作流程如下:

graph TD
    A[PIR传感器检测人体移动] -->|发送高电平信号| B(ESP32主控板)
    B -->|触发中断| C{判断是否为有效入侵}
    C -->|是| D[启动蜂鸣器报警]
    C -->|否| E[忽略干扰信号]
    D --> F[通过WiFi发送手机通知]

项目核心代码基于MatterOccupancySensor.ino示例修改,该示例原本用于模拟 occupancy 检测,我们将其改造为真实传感器数据采集系统。

硬件准备与接线指南

所需元件清单

  • ESP32开发板(推荐ESP32-S3-DevKitC-1
  • HC-SR501 PIR运动传感器
  • 5V有源蜂鸣器
  • 10kΩ电阻×2
  • 杜邦线若干
  • 面包板

电路连接图

将元件按以下方式连接:

ESP32引脚 元件 连接方式
GPIO 4 PIR传感器输出 串联10kΩ上拉电阻
GPIO 16 蜂鸣器正极 串联220Ω限流电阻
GND 传感器负极/蜂鸣器负极 共地连接
3.3V 传感器VCC 电源供电

注意:不同型号PIR传感器引脚定义可能不同,请参考具体 datasheet。建议使用带调节旋钮的型号,可通过旋钮调整检测距离(3-7米)和触发延时(5秒-5分钟)。

软件环境搭建

Arduino IDE配置

  1. 安装ESP32开发环境,参考官方文档docs/
  2. 安装必要库:
    • Matter库:提供设备联网和通信能力
    • WiFi库:实现无线网络连接

核心代码解析

1. 引脚定义与初始化

// PIR传感器连接引脚
const int pirPin = 4;
// 蜂鸣器控制引脚
const int buzzerPin = 16;
// WiFi配置(修改为你的网络信息)
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";

void setup() {
  pinMode(pirPin, INPUT);
  pinMode(buzzerPin, OUTPUT);
  digitalWrite(buzzerPin, LOW); // 初始关闭蜂鸣器
  
  // 初始化WiFi连接(代码来自[WiFiClientTrustOnFirstUse.ino](https://gitcode.com/GitHub_Trending/ar/arduino-esp32/blob/b20655a009008e374fd37f5a6c45f3ba53b9ba86/libraries/NetworkClientSecure/examples/WiFiClientTrustOnFirstUse/WiFiClientTrustOnFirstUse.ino?utm_source=gitcode_repo_files))
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
}

2. 传感器数据读取与处理

void loop() {
  int pirState = digitalRead(pirPin);
  
  if (pirState == HIGH) {
    // 检测到人体移动
    Serial.println("入侵检测!");
    triggerAlarm();
    sendNotification();
    // 延时30秒防止重复触发
    delay(30000);
  }
  
  delay(100); // 降低CPU占用
}

void triggerAlarm() {
  // 蜂鸣器发出1kHz警报声
  for(int i=0; i<3; i++){
    tone(buzzerPin, 1000, 500); // 鸣响500ms
    delay(1000); // 间隔1秒
  }
}

3. 远程通知功能实现

利用ESP32的WiFi功能发送HTTP请求到推送服务:

void sendNotification() {
  WiFiClient client;
  if (!client.connect("maker.ifttt.com", 80)) {
    Serial.println("连接服务器失败");
    return;
  }
  
  // 发送IFTTT Webhook请求(需提前配置IFTTT服务)
  client.print("GET /trigger/intrusion_detected/with/key/你的IFTTT密钥 HTTP/1.1\r\n");
  client.print("Host: maker.ifttt.com\r\n");
  client.print("Connection: close\r\n\r\n");
  client.stop();
}

系统调试与优化

常见问题解决

  1. 误报频繁

    • 调整PIR传感器灵敏度旋钮,逆时针旋转降低灵敏度
    • 在代码中添加信号确认机制:
    // 连续检测3次高电平才确认入侵
    int count = 0;
    for(int i=0; i<3; i++){
      if(digitalRead(pirPin) == HIGH) count++;
      delay(100);
    }
    if(count >= 2) { /* 触发报警 */ }
    
  2. WiFi连接不稳定

    • 确保ESP32与路由器距离不超过10米
    • 启用WiFi重连功能:
    if(WiFi.status() != WL_CONNECTED) {
      WiFi.reconnect();
    }
    

高级功能扩展

  1. 添加摄像头模块:使用ESP32-CAM拍摄入侵现场照片
  2. 低功耗优化:利用ESP32的深度睡眠模式,电池供电可运行数月
  3. 多传感器组网:通过Zigbee协议连接多个传感器节点

完整代码与部署

将以下完整代码复制到Arduino IDE,修改WiFi信息后上传到ESP32:

#include <WiFi.h>
#include <HTTPClient.h>

const int pirPin = 4;
const int buzzerPin = 16;
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
const char* iftttKey = "你的IFTTT密钥";

void setup() {
  Serial.begin(115200);
  pinMode(pirPin, INPUT);
  pinMode(buzzerPin, OUTPUT);
  digitalWrite(buzzerPin, LOW);
  
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected");
}

void loop() {
  int count = 0;
  for(int i=0; i<3; i++){
    if(digitalRead(pirPin) == HIGH) count++;
    delay(100);
  }
  
  if(count >= 2) {
    Serial.println("Intrusion detected!");
    triggerAlarm();
    sendNotification();
    delay(30000); // 30秒防重复触发
  }
  
  delay(50);
}

void triggerAlarm() {
  for(int i=0; i<3; i++){
    digitalWrite(buzzerPin, HIGH);
    delay(500);
    digitalWrite(buzzerPin, LOW);
    delay(500);
  }
}

void sendNotification() {
  if(WiFi.status() != WL_CONNECTED) return;
  
  HTTPClient http;
  String url = "http://maker.ifttt.com/trigger/intrusion_detected/with/key/" + String(iftttKey);
  
  http.begin(url);
  int httpCode = http.GET();
  if(httpCode > 0) {
    Serial.println("Notification sent");
  } else {
    Serial.println("Failed to send notification");
  }
  http.end();
}

总结与展望

通过本文介绍的方法,你已成功构建一套低成本、高可靠性的安防监控系统。该系统不仅能实时检测非法入侵,还能通过网络及时向你发送警报信息,让你随时随地掌握家中安全状况。

后续可探索以下改进方向:

  • 接入智能家居平台(如小米HomeKit)
  • 实现人脸识别减少误报
  • 开发专用手机APP实现远程控制

希望这个项目能激发你对物联网开发的兴趣,如有任何问题,欢迎在项目GitHub仓库提交issue交流讨论。记得点赞收藏本教程,下期我们将介绍如何利用AI算法识别入侵者身份!

安全提示:本系统仅用于家庭安防学习,请勿用于非法监控活动。

登录后查看全文
热门项目推荐
相关项目推荐