一、系统概述
基于ESP32/ESP8266 WiFi模块,结合MQTT物联网协议与云平台服务,构建一套多功能、高可靠性的智能家居室内报警系统。系统集成烟雾火灾检测、燃气泄漏监测、非法入侵报警、环境异常预警四大核心功能,支持本地声光报警、手机APP远程通知、云平台数据可视化,实现7×24小时全天候智能安防监控。
系统技术指标
| 参数 | 指标 |
|---|---|
| 主控制器 | ESP32-S3(双核240MHz,集成WiFi/蓝牙) |
| 检测范围 | 烟雾:300-10000ppm,燃气:200-10000ppm |
| 响应时间 | ≤3秒(从检测到报警触发) |
| 通信方式 | WiFi 2.4GHz,MQTT over TCP |
| 云平台 | OneNET/阿里云IoT/腾讯云物联网 |
| 本地报警 | 蜂鸣器(≥85dB)、RGB LED、LCD显示屏 |
| 远程通知 | 手机APP推送、微信小程序、短信/邮件 |
| 供电方式 | 5V DC适配器(支持UPS备用电源) |
| 待机功耗 | ≤2W(正常监测状态) |
二、系统架构设计
1. 三层架构模型
根据哈尔滨工业大学的研究成果,系统采用用户端-云平台-远程终端三层架构:
┌─────────────────────────────────────────────────────┐
│ 智能家居WIFI报警系统架构 │
├─────────────────────────────────────────────────────┤
│ 第一层:用户端(家庭内部) │
│ ├─ 数据采集模块:烟雾(MQ-2)、燃气(MQ-5)、温湿度(DHT11)│
│ ├─ 人体检测模块:HC-SR501红外传感器 │
│ ├─ 报警执行模块:蜂鸣器、LED、继电器(控制通风设备) │
│ └─ 主控显示模块:ESP32、OLED显示屏 │
│ │
│ 第二层:云平台端(数据中转与处理) │
│ ├─ MQTT Broker:EMQX/阿里云IoT平台 │
│ ├─ 数据存储:时序数据库(存储历史数据) │
│ ├─ 规则引擎:阈值判断、报警触发逻辑 │
│ └─ 通知服务:短信、邮件、APP推送网关 │
│ │
│ 第三层:远程终端(用户接收端) │
│ ├─ 手机APP:实时数据显示、远程控制、报警接收 │
│ ├─ 微信小程序:免安装、快速访问 │
│ └─ Web管理端:数据可视化、设备管理、报表生成 │
└─────────────────────────────────────────────────────┘
2. 系统工作流程
- 数据采集:各类传感器实时采集环境数据(烟雾浓度、燃气浓度、温湿度、人体红外信号)
- 本地处理:ESP32对数据进行滤波、校准、阈值判断
- 异常检测:当数据超过预设阈值时,触发本地报警(声光报警)
- 云端上报:通过WiFi将报警数据和环境数据上传至云平台
- 远程通知:云平台通过多种渠道(APP、微信、短信)向用户发送报警信息
- 联动控制:可自动控制通风设备、切断燃气阀门等应急措施
三、硬件设计
1. 核心器件选型
| 模块类型 | 器件型号 | 关键参数 | 接口方式 |
|---|---|---|---|
| 主控制器 | ESP32-S3-WROOM-1 | 双核240MHz,520KB SRAM,集成WiFi/蓝牙 | 直接控制所有外设 |
| 烟雾传感器 | MQ-2 | 检测范围:300-10000ppm,响应时间<10s | 模拟输出(ADC采集) |
| 燃气传感器 | MQ-5 | 检测LPG、天然气,范围:200-10000ppm | 模拟输出(ADC采集) |
| 温湿度传感器 | DHT11 | 温度:0-50℃±2℃,湿度:20-90%±5% | 单总线数字接口 |
| 人体红外传感器 | HC-SR501 | 检测距离:3-7m,感应角度:<140° | 数字输出(高/低电平) |
| 声光报警器 | 有源蜂鸣器+RGB LED | 蜂鸣器:85dB/5V,LED:全彩可编程 | GPIO数字输出 |
| 显示模块 | 0.96寸OLED(SSD1306) | 分辨率:128×64,I2C接口 | I2C(SCL/SDA) |
| 通信模块 | 集成WiFi | 802.11 b/g/n,支持WPA/WPA2 | 内置天线 |
| 电源模块 | LM2596降压模块 | 输入:9-12V DC,输出:5V/3A | 为全系统供电 |
2. 电路连接设计
plaintext
ESP32-S3引脚分配:
GPIO34(ADC1_CH6) → MQ-2 AOUT(烟雾模拟信号)
GPIO35(ADC1_CH7) → MQ-5 AOUT(燃气模拟信号)
GPIO4 → DHT11 DATA(温湿度数据线)
GPIO5 → HC-SR501 OUT(人体检测信号)
GPIO12 → 蜂鸣器控制(低电平触发)
GPIO13/14/15 → RGB LED(R/G/B控制)
GPIO21 → OLED SDA(I2C数据)
GPIO22 → OLED SCL(I2C时钟)
GPIO16 → 继电器1(控制排风扇)
GPIO17 → 继电器2(控制燃气电磁阀)
EN → 使能引脚(接10kΩ上拉电阻)
3V3 → 为传感器供电(注意电流限制)
GND → 共地连接
电源设计:
220V AC → 12V/2A适配器 → LM2596降压模块 → 5V输出
↓
5V → ESP32-S3(通过VIN引脚)
5V → 蜂鸣器、继电器线圈
3.3V → 传感器(通过AMS1117-3.3V转换)
保护电路:
- 每个传感器电源端并联0.1μF去耦电容
- GPIO口串联220Ω限流电阻(保护ESP32)
- 继电器线圈反向并联1N4148续流二极管
3. 传感器校准与安装
MQ-2烟雾传感器校准:
- 预热时间:首次使用需通电预热24小时以上,达到稳定状态
- 洁净空气校准:在无烟雾环境中,读取ADC值计算R₀(传感器在洁净空气中的电阻)
- 阈值设置:建议基线值×1.5~2.0作为报警阈值,避免误报
- 温度补偿:添加温度传感器,根据温度变化动态调整阈值
安装位置建议:
- 烟雾传感器:厨房天花板中央,距离燃气灶1-2米
- 燃气传感器:厨房低处(燃气密度大于空气),距离地面30cm
- 人体红外传感器:客厅/卧室入口,对准主要通道
- 温湿度传感器:客厅中央,避免阳光直射和通风口
四、软件设计
1. 程序架构
c
// 主程序框架(基于Arduino平台)
#include <WiFi.h>
#include <PubSubClient.h> // MQTT客户端库
#include <DHT.h> // 温湿度传感器库
#include <Adafruit_SSD1306.h> // OLED显示库
// 全局定义
#define MQ2_PIN 34
#define MQ5_PIN 35
#define DHT_PIN 4
#define PIR_PIN 5
#define BUZZER_PIN 12
#define RELAY_FAN 16
#define RELAY_VALVE 17
// 阈值定义
#define SMOKE_THRESHOLD 1500 // 烟雾ADC阈值(0-4095)
#define GAS_THRESHOLD 1200 // 燃气ADC阈值
#define TEMP_THRESHOLD 60 // 温度阈值(℃)
#define HUMIDITY_THRESHOLD 90 // 湿度阈值(%)
// 全局变量
WiFiClient espClient;
PubSubClient mqttClient(espClient);
DHT dht(DHT_PIN, DHT11);
Adafruit_SSD1306 display(128, 64, &Wire, -1);
// 传感器数据结构
typedef struct {
uint16_t smoke_value;
uint16_t gas_value;
float temperature;
float humidity;
bool human_detected;
bool alarm_status;
} SensorData_t;
SensorData_t sensor_data;
void setup() {
Serial.begin(115200);
// 初始化引脚
pinMode(MQ2_PIN, INPUT);
pinMode(MQ5_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RELAY_FAN, OUTPUT);
pinMode(RELAY_VALVE, OUTPUT);
digitalWrite(BUZZER_PIN, HIGH); // 蜂鸣器默认关闭(低电平触发)
digitalWrite(RELAY_FAN, LOW); // 风扇默认关闭
digitalWrite(RELAY_VALVE, LOW); // 阀门默认关闭
// 初始化传感器
dht.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// 连接WiFi
WiFi_Connect();
// 连接MQTT服务器
MQTT_Connect();
// 显示初始化信息
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("System Ready");
display.display();
}
void loop() {
// 1. 采集传感器数据
Read_Sensors();
// 2. 判断报警条件
Check_Alarm_Condition();
// 3. 本地报警处理
Local_Alarm_Handler();
// 4. 数据上传云端
Upload_To_Cloud();
// 5. 显示更新
Update_Display();
// 6. 保持MQTT连接
if (!mqttClient.connected()) {
MQTT_Reconnect();
}
mqttClient.loop();
delay(1000); // 1秒采集周期
}
2. 核心功能实现
(1)传感器数据采集与滤波
c
// 读取烟雾传感器(滑动平均滤波)
uint16_t Read_MQ2_Sensor() {
static uint16_t filter_buffer[10] = {0};
static uint8_t index = 0;
uint32_t sum = 0;
// 读取原始ADC值(12位,0-4095)
filter_buffer[index] = analogRead(MQ2_PIN);
index = (index + 1) % 10;
// 计算滑动平均值
for(uint8_t i=0; i<10; i++) {
sum += filter_buffer[i];
}
// 转换为电压值(可选)
// float voltage = (sum/10.0) * (3.3/4095.0);
return sum / 10;
}
// 读取温湿度传感器
void Read_DHT11_Sensor(float *temp, float *humi) {
*temp = dht.readTemperature();
*humi = dht.readHumidity();
// 数据有效性检查
if (isnan(*temp) || isnan(*humi)) {
Serial.println("DHT11读取失败");
*temp = 25.0;
*humi = 50.0;
}
}
(2)报警判断逻辑
c
// 综合报警判断
void Check_Alarm_Condition() {
bool smoke_alarm = false;
bool gas_alarm = false;
bool fire_alarm = false;
bool intrusion_alarm = false;
// 烟雾报警(连续3次超过阈值)
static uint8_t smoke_count = 0;
if (sensor_data.smoke_value > SMOKE_THRESHOLD) {
smoke_count++;
if (smoke_count >= 3) {
smoke_alarm = true;
smoke_count = 3; // 防止溢出
}
} else {
smoke_count = 0;
}
// 燃气报警
if (sensor_data.gas_value > GAS_THRESHOLD) {
gas_alarm = true;
}
// 火灾判断(烟雾+高温)
if (smoke_alarm && sensor_data.temperature > TEMP_THRESHOLD) {
fire_alarm = true;
}
// 入侵检测
if (sensor_data.human_detected && !Is_Normal_Hours()) {
intrusion_alarm = true;
}
// 更新报警状态
sensor_data.alarm_status = smoke_alarm || gas_alarm || fire_alarm || intrusion_alarm;
// 记录报警类型
if (sensor_data.alarm_status) {
String alarm_msg = "";
if (smoke_alarm) alarm_msg += "烟雾超标 ";
if (gas_alarm) alarm_msg += "燃气泄漏 ";
if (fire_alarm) alarm_msg += "火灾预警 ";
if (intrusion_alarm) alarm_msg += "非法入侵 ";
Serial.println("报警触发:" + alarm_msg);
Save_Alarm_Log(alarm_msg);
}
}
(3)本地报警处理
c
// 声光报警控制
void Local_Alarm_Handler() {
if (sensor_data.alarm_status) {
// 蜂鸣器报警(间歇鸣响)
static unsigned long last_beep = 0;
static bool beep_state = false;
if (millis() - last_beep > 500) { // 0.5秒间隔
beep_state = !beep_state;
digitalWrite(BUZZER_PIN, beep_state ? LOW : HIGH);
last_beep = millis();
}
// RGB LED闪烁(红色)
static unsigned long last_led = 0;
static bool led_state = false;
if (millis() - last_led > 200) { // 0.2秒间隔
led_state = !led_state;
if (led_state) {
Set_RGB_LED(255, 0, 0); // 红色
} else {
Set_RGB_LED(0, 0, 0); // 关闭
}
last_led = millis();
}
// 应急联动控制
Emergency_Control();
} else {
// 正常状态:蜂鸣器关闭,LED显示绿色
digitalWrite(BUZZER_PIN, HIGH);
Set_RGB_LED(0, 255, 0); // 绿色
}
}
// 应急联动控制
void Emergency_Control() {
// 燃气泄漏时关闭电磁阀
if (sensor_data.gas_value > GAS_THRESHOLD) {
digitalWrite(RELAY_VALVE, HIGH); // 关闭阀门
}
// 烟雾超标时开启排风扇
if (sensor_data.smoke_value > SMOKE_THRESHOLD) {
digitalWrite(RELAY_FAN, HIGH); // 开启风扇
}
// 火灾时全开通风
if (sensor_data.smoke_value > SMOKE_THRESHOLD &&
sensor_data.temperature > TEMP_THRESHOLD) {
digitalWrite(RELAY_FAN, HIGH);
digitalWrite(RELAY_VALVE, HIGH);
}
}
五、通信与云平台集成
1. MQTT通信实现
c
// MQTT连接配置
const char* mqtt_server = "mqtt.heclouds.com"; // OneNET MQTT地址
const int mqtt_port = 1883;
const char* mqtt_user = "设备ID";
const char* mqtt_password = "鉴权信息";
const char* mqtt_topic_pub = "devices/{device_id}/datapoints"; // 发布主题
const char* mqtt_topic_sub = "devices/{device_id}/cmd"; // 订阅主题
// 连接MQTT服务器
void MQTT_Connect() {
mqttClient.setServer(mqtt_server, mqtt_port);
mqttClient.setCallback(MQTT_Callback); // 设置消息回调
while (!mqttClient.connected()) {
Serial.print("连接MQTT...");
if (mqttClient.connect("ESP32_Alarm_System", mqtt_user, mqtt_password)) {
Serial.println("连接成功");
mqttClient.subscribe(mqtt_topic_sub); // 订阅控制主题
} else {
Serial.print("失败,rc=");
Serial.print(mqttClient.state());
Serial.println(" 5秒后重试");
delay(5000);
}
}
}
// MQTT消息回调(接收云端指令)
void MQTT_Callback(char* topic, byte* payload, unsigned int length) {
Serial.print("收到消息 [");
Serial.print(topic);
Serial.print("]: ");
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println(message);
// 解析JSON指令
// {"cmd":"alarm_test", "param":"on"}
// {"cmd":"set_threshold", "smoke":1500, "gas":1200}
Process_Cloud_Command(message);
}
// 上传数据到云端
void Upload_To_Cloud() {
// 构建JSON数据包
String json_data = "{";
json_data += "\"smoke\":" + String(sensor_data.smoke_value) + ",";
json_data += "\"gas\":" + String(sensor_data.gas_value) + ",";
json_data += "\"temp\":" + String(sensor_data.temperature, 1) + ",";
json_data += "\"humi\":" + String(sensor_data.humidity, 1) + ",";
json_data += "\"human\":" + String(sensor_data.human_detected ? 1 : 0) + ",";
json_data += "\"alarm\":" + String(sensor_data.alarm_status ? 1 : 0);
json_data += "}";
// 发布到MQTT主题
if (mqttClient.connected()) {
mqttClient.publish(mqtt_topic_pub, json_data.c_str());
Serial.println("数据已上传: " + json_data);
}
}
2. 云平台配置(以OneNET为例)
平台配置步骤:
- 创建产品:登录OneNET平台,创建"智能家居报警系统"产品
- 添加设备:创建设备,获取DeviceID和API Key
- 数据流定义:定义数据流(smoke、gas、temp、humi、alarm)
- 触发器设置 :配置报警触发规则
- 烟雾浓度 > 阈值 → 触发报警
- 燃气浓度 > 阈值 → 触发报警
- 温度 > 60℃ → 触发火灾预警
- 通知方式:配置短信、邮件、APP推送
数据可视化界面:
json
// OneNET数据流示例
{
"datastreams": [
{
"id": "smoke",
"datapoints": [
{"at": "2024-01-01T12:00:00", "value": 850},
{"at": "2024-01-01T12:01:00", "value": 920}
]
},
{
"id": "alarm",
"datapoints": [
{"at": "2024-01-01T12:05:00", "value": 1}
]
}
]
}
3. 手机APP/微信小程序开发
功能设计:
- 实时监控:显示各传感器实时数据
- 报警通知:接收并显示报警信息(推送通知)
- 历史查询:查看历史数据和报警记录
- 远程控制:手动控制通风设备、测试报警
- 阈值设置:远程修改报警阈值
技术方案:
- 前端:微信小程序(Uni-app框架)
- 后端:云开发(腾讯云)或自建服务器
- 通信:WebSocket实时通信 + HTTP API
参考代码 简单、便捷智能家居室内WIFI报警系统设计(原理图、程序、设计报告等) www.youwenfan.com/contentcst/135472.html
六、系统测试与优化
1. 测试方案
| 测试项目 | 测试方法 | 预期结果 |
|---|---|---|
| 烟雾检测精度 | 使用烟雾发生器模拟火灾 | ADC值>阈值,触发报警,误差<5% |
| 燃气泄漏响应 | 微量释放打火机气体 | 3秒内检测到,触发报警 |
| 人体检测范围 | 人员在检测区域内移动 | 3-7米内可靠检测,误报率<1% |
| 网络断线重连 | 断开路由器连接,30秒后恢复 | 自动重连,数据恢复上传 |
| 多设备联动 | 同时触发烟雾和高温报警 | 启动风扇、关闭阀门、声光报警 |
| 功耗测试 | 万用表测量待机和工作电流 | 待机<50mA,报警时<200mA |
2. 抗干扰优化
- 软件滤波:采用卡尔曼滤波或移动平均滤波平滑数据
- 防误报策略:连续多次超过阈值才触发报警(如3次连续)
- 时间段控制:夜间自动提高灵敏度,白天降低灵敏度
- 环境自适应:根据历史数据动态调整阈值
3. 低功耗设计
c
// ESP32深度睡眠模式(电池供电场景)
void Enter_Deep_Sleep() {
// 设置唤醒源(定时器或外部中断)
esp_sleep_enable_timer_wakeup(10 * 1000000); // 10秒后唤醒
// 配置GPIO唤醒(人体传感器)
esp_sleep_enable_ext0_wakeup(GPIO_NUM_5, 1); // 高电平唤醒
// 进入深度睡眠
Serial.println("进入深度睡眠");
esp_deep_sleep_start();
}
七、扩展功能
1. 视频监控集成
c
// 使用ESP32-CAM模块
#include "esp_camera.h"
// 初始化摄像头
void Init_Camera() {
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = 5; config.pin_d1 = 18;
config.pin_d2 = 19; config.pin_d3 = 21;
config.pin_d4 = 36; config.pin_d5 = 39;
config.pin_d6 = 34; config.pin_d7 = 35;
config.pin_xclk = 0; config.pin_pclk = 22;
config.pin_vsync = 25; config.pin_href = 23;
config.pin_sscb_sda = 26; config.pin_sscb_scl = 27;
config.pin_pwdn = 32; config.pin_reset = -1;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("摄像头初始化失败: 0x%x", err);
}
}
// 报警时拍照并上传
void Capture_And_Upload() {
camera_fb_t *fb = esp_camera_fb_get();
if (fb) {
// 上传到云存储
Upload_Image(fb->buf, fb->len);
esp_camera_fb_return(fb);
}
}
2. 语音报警通知
c
// 使用SYN6288语音合成模块
void Voice_Alarm(String alarm_type) {
String voice_text = "";
if (alarm_type == "smoke") {
voice_text = "警告,检测到烟雾浓度超标,请立即检查";
} else if (alarm_type == "gas") {
voice_text = "警告,检测到燃气泄漏,请立即关闭阀门并通风";
} else if (alarm_type == "fire") {
voice_text = "火灾警报,请立即撤离并拨打119";
}
// 通过UART发送语音合成指令
Serial2.print("[v]" + voice_text + "[/v]");
}
八、总结
本设计基于ESP32和MQTT协议,实现了完整的智能家居室内WIFI报警系统,具有以下特点:
技术优势:
- 高集成度:单芯片方案(ESP32)集成WiFi、处理、控制功能
- 实时性强:MQTT协议保证报警信息秒级送达
- 可靠性高:多重滤波算法降低误报率
- 扩展灵活:模块化设计支持功能扩展(视频、语音等)
应用场景:
- 家庭安防:厨房火灾预警、燃气泄漏监测
- 办公场所:下班后非法入侵检测
- 仓库管理:环境异常(高温、高湿)监控
- 老人看护:紧急情况一键报警
成本估算:
| 组件 | 单价(元) | 数量 | 小计(元) |
|---|---|---|---|
| ESP32-S3开发板 | 35 | 1 | 35 |
| MQ-2传感器 | 15 | 1 | 15 |
| MQ-5传感器 | 18 | 1 | 18 |
| DHT11 | 8 | 1 | 8 |
| HC-SR501 | 6 | 1 | 6 |
| 蜂鸣器+LED | 5 | 1 | 5 |
| OLED显示屏 | 12 | 1 | 12 |
| 继电器模块 | 8 | 2 | 16 |
| 其他(线材等) | 20 | 1 | 20 |
| 总计 | 135元 |