1. 项目概述
这个基于STM32的智能家居安防系统是我去年为一个朋友设计的实际项目,经过半年多的实际运行测试,效果相当稳定。系统核心思路很简单:用STM32作为大脑,连接各种环境传感器,实时监测家里的安全状况,发现问题立即报警,还能通过手机远程查看。
为什么选择STM32?因为它性价比高、生态完善,特别适合这种需要连接多种外设的中小型项目。我用的STM32F103C8T6这款芯片,价格不到20元,但性能完全够用,开发资料也多如牛毛。
系统主要监测三类安全隐患:
- 环境舒适度(温湿度)
- 有毒气体(甲醛)
- 火灾风险(烟雾)
当检测到异常时,本地会通过蜂鸣器报警,同时把数据上传到云端,手机APP实时显示状态。这样无论在家还是外出,都能第一时间知道家里是否安全。
2. 系统硬件设计
2.1 主控芯片选型
STM32F103C8T6是我经过多款对比后最终确定的方案,主要考虑以下几点:
- 性能足够:72MHz主频的Cortex-M3内核,处理传感器数据绰绰有余
- 外设丰富:自带多个USART、SPI、I2C接口,方便连接各种传感器
- 开发便捷:社区支持完善,遇到问题基本都能找到解决方案
- 成本低廉:核心板价格约15-20元,适合批量生产
注意:购买时一定要选择正版芯片,市面上有些山寨货稳定性很差。我曾在某宝买到过假货,导致系统随机死机,后来换了正规渠道的芯片就再没出过问题。
2.2 传感器模块选型
2.2.1 温湿度传感器DHT11
选择DHT11主要因为:
- 价格便宜(约5元)
- 单总线通信,节省IO口
- 测量范围完全满足家居需求(温度0-50℃,湿度20-90%RH)
实测精度:
- 温度±2℃
- 湿度±5%RH
虽然精度不算高,但对家居环境监测完全够用。如果需要更高精度,可以考虑DHT22或SHT30,但价格会贵3-5倍。
接线方式:
code复制DHT11 STM32
VCC -> 3.3V
DATA -> PA4(需接4.7K上拉电阻)
GND -> GND
2.2.2 烟雾传感器GP2Y1051AU0F
这款传感器对PM2.5特别敏感,非常适合检测火灾初期的烟雾。主要特点:
- 检测范围0-500μg/m³
- 模拟电压输出(需接ADC)
- 响应时间<10秒
接线方式:
code复制GP2Y1051AU0F STM32
VCC -> 5V
GND -> GND
Vo -> PA0(ADC1通道0)
LED -> PA1(控制红外LED)
2.2.3 甲醛传感器MS1100
选择MS1100是因为:
- 专为甲醛检测优化
- 0-5ppm测量范围
- 预热时间短(约2分钟)
接线与烟雾传感器类似,输出也是模拟信号,接另一个ADC通道。
2.3 其他外设
- TFT-LCD显示屏:用于本地数据显示,选用1.44寸SPI接口屏,节省IO口
- 有源蜂鸣器:报警用,接一个IO口通过三极管驱动
- ESP8266 WiFi模块:用于连接云服务器,通过AT指令与STM32通信
- 按键模块:3个按键用于设置阈值和消音
3. 系统软件设计
3.1 开发环境搭建
我选择Keil MDK作为开发环境,具体配置步骤如下:
- 安装Keil uVision5(建议版本5.25以上)
- 安装STM32F1xx_DFP器件支持包
- 安装ST-Link驱动(如果用ST-Link下载器)
- 新建工程,选择STM32F103C8系列
- 配置时钟:外部8MHz晶振,PLL倍频到72MHz
实操技巧:建议使用HAL库开发,比直接操作寄存器方便很多。初始化代码可以用STM32CubeMX生成,能节省大量时间。
3.2 传感器驱动开发
3.2.1 DHT11温湿度传感器
DHT11的通信时序很关键,必须严格按照时序图操作。以下是核心代码逻辑:
c复制// DHT11读取函数
uint8_t DHT11_ReadData(uint8_t *temperature, uint8_t *humidity)
{
uint8_t data[5] = {0};
uint8_t i,j;
// 主机拉低18ms
DHT11_IO_OUT();
DHT11_DQ_OUT(0);
delay_ms(18);
DHT11_DQ_OUT(1);
delay_us(30);
// 等待从机响应
DHT11_IO_IN();
if(DHT11_DQ_IN()!=0) return 1;
delay_us(80);
if(DHT11_DQ_IN()!=1) return 1;
delay_us(80);
// 读取40位数据
for(i=0;i<5;i++) {
for(j=0;j<8;j++) {
while(DHT11_DQ_IN()==0); // 等待50us低电平结束
delay_us(30);
if(DHT11_DQ_IN()==1)
data[i] |= (1<<(7-j));
while(DHT11_DQ_IN()==1); // 等待高电平结束
}
}
// 校验数据
if(data[4]==(data[0]+data[1]+data[2]+data[3])) {
*humidity = data[0];
*temperature = data[2];
return 0;
}
return 1;
}
常见问题:
- 读取失败:检查接线是否正确,上拉电阻是否接好
- 数据异常:可能是电源不稳定,建议在VCC和GND之间加一个0.1uF电容
3.2.2 烟雾传感器数据处理
GP2Y1051AU0F输出的是模拟电压,需要通过ADC转换。关键点:
- ADC配置为12位分辨率,单次转换模式
- 每秒钟采样一次,取10次平均值滤波
- 电压值与PM2.5浓度的换算公式:
c复制// 电压值转PM2.5浓度(μg/m³)
float voltageToPm25(float voltage)
{
// 根据传感器手册提供的曲线拟合公式
if(voltage < 0.5) return 0;
return (voltage - 0.5) * 200; // 近似公式
}
3.3 报警逻辑实现
报警系统采用多级响应机制:
-
初级报警(检测值超过阈值10%):
- LCD显示数值变黄色
- 每30秒短鸣一声
-
中级报警(检测值超过阈值30%):
- LCD显示数值变红色
- 蜂鸣器持续鸣响
- 发送微信通知
-
严重报警(检测值超过阈值50%):
- 以上所有措施
- 自动拨打预设电话
- 切断燃气阀门(如果连接了智能阀门)
报警阈值设置建议:
- 温度:夏季>28℃,冬季<18℃
- 湿度:<30%或>70%
- PM2.5:>100μg/m³
- 甲醛:>0.08ppm
3.4 云端通信实现
使用ESP8266模块连接阿里云IoT平台,关键步骤:
- 在阿里云创建产品和设备,获取三元组信息
- 实现MQTT协议连接
- 数据上传格式:
json复制{
"deviceId": "123456",
"temp": 25.3,
"humi": 45.2,
"pm25": 32,
"hcho": 0.05,
"alarm": 0
}
- 心跳包每60秒发送一次,保持长连接
避坑指南:ESP8266固件建议使用安信可提供的AT固件,稳定性比原厂的好。我最初用原厂固件经常断线,后来刷了安信可的1.6.2版本就稳定多了。
4. 系统测试与优化
4.1 功能测试
4.1.1 温湿度测试
测试方法:
- 将传感器放入恒温恒湿箱
- 设置不同温湿度组合
- 对比系统显示值与校准仪器的读数
测试数据:
| 设定温度(℃) | 设定湿度(%RH) | 测量温度(℃) | 测量湿度(%RH) |
|---|---|---|---|
| 20 | 40 | 20.1 | 41 |
| 25 | 50 | 24.8 | 52 |
| 30 | 60 | 29.9 | 59 |
结论:测量误差在允许范围内,完全满足家居使用需求。
4.1.2 烟雾报警测试
测试方法:
- 点燃香烟,靠近传感器
- 记录从烟雾出现到系统报警的时间
- 测试不同距离下的灵敏度
测试结果:
- 响应时间:3-8秒(取决于烟雾浓度)
- 有效检测距离:0.5-3米
- 误报率:<1%(需避免在传感器附近使用加湿器)
4.2 稳定性测试
连续运行测试:
- 7×24小时不间断运行
- 记录死机、重启、数据异常等情况
- 监测内存泄漏问题
优化措施:
- 增加看门狗定时器(IWDG)
- 关键数据增加ECC校验
- 网络通信增加重试机制
4.3 功耗优化
实测数据:
- 正常工作电流:45mA
- 深度睡眠模式:2.3mA(仅保持网络连接)
优化方案:
- 无报警时每5分钟上传一次数据
- 夜间自动进入低功耗模式
- LCD背光自动调节
5. 实际应用建议
经过半年多的实际使用,总结出以下几点经验:
-
安装位置:
- 温湿度传感器:远离门窗和空调出风口
- 烟雾传感器:厨房天花板,距离灶台1.5-2米
- 甲醛传感器:离地面0.8-1.5米,靠近新家具
-
维护建议:
- 每月用软毛刷清洁传感器表面
- 每季度校准一次传感器(可用标准源校准)
- 定期检查电池状态(如果用电池供电)
-
扩展功能:
- 增加摄像头联动,报警时自动拍照
- 接入智能音箱,语音播报报警信息
- 与空调、新风系统联动,自动调节环境
这个项目最让我自豪的是它的实用性——朋友反馈说真的避免了一次燃气泄漏事故。如果你也想DIY一个,建议先从基础功能做起,再逐步扩展。STM32的生态很完善,几乎想加什么功能都能找到现成的库和例程。