1. 项目概述与设计思路
作为一名嵌入式开发工程师,我最近完成了一个基于STM32的智能火灾安全系统项目。这个系统不仅能检测烟雾和温度异常,还能通过人体红外感应判断现场是否有人,从而采取不同的应急措施。整套系统成本控制在200元以内,非常适合家庭和小型场所使用。
选择STM32F103C8T6作为主控芯片是经过深思熟虑的。这款芯片虽然价格亲民(约10元/片),但性能足够强大:72MHz主频、64KB Flash、20KB RAM,还有丰富的外设接口。更重要的是它的低功耗特性——仅36mA的工作电流,对于需要24小时运行的安防设备来说至关重要。
2. 硬件选型与电路设计
2.1 核心控制器选型
STM32F103C8T6这款芯片有几个关键特性特别适合我们的项目:
- 37个GPIO口足够连接所有传感器和执行器
- 内置温度传感器可以辅助环境监测
- 支持硬件PWM,方便控制报警器音量
- 自带I2C接口,简化了与温度传感器的通信
提示:购买开发板时建议选择带SWD调试接口的版本,调试时会方便很多。我最初为了省几块钱买了最小系统板,结果调试时吃了大亏。
2.2 传感器模块选型
2.2.1 烟雾检测模块
选用MQ-2气体传感器,它能检测:
- 烟雾浓度:300-10000ppm
- 液化气:200-5000ppm
- 丙烷:200-5000ppm
这个传感器需要预热约20秒才能稳定工作,所以在程序初始化时要加入预热等待。
2.2.2 温度检测模块
LM75A数字温度传感器通过I2C接口与单片机通信,具有:
- 测量范围:-55°C ~ +125°C
- 精度:±2°C(0°C~70°C)
- 分辨率:0.125°C
2.2.3 人体红外模块
PIR传感器参数如下:
- 检测角度:90°锥角
- 检测距离:5米
- 输出信号:高电平(3.3V)表示检测到人体
- 延时关闭:检测到移动后保持60秒高电平
2.3 电路连接方案
整个系统的接线方案如下表所示:
| 模块 | STM32引脚 | 连接方式 | 备注 |
|---|---|---|---|
| MQ-2烟雾传感器 | PA12 | 数字输出 | 需接10K上拉电阻 |
| 蜂鸣器 | PA10 | PWM输出 | 有源蜂鸣器 |
| PIR人体传感器 | PA8 | 数字输入 | 直接连接 |
| 紧急停止按钮 | PA0 | 外部中断 | 下降沿触发 |
| 绿灯(正常指示) | PB1 | GPIO输出 | 限流电阻220Ω |
| 红灯(报警指示) | PB10 | GPIO输出 | 限流电阻220Ω |
| LM75A温度传感器 | PB6/PB7 | I2C(SCL/SDA) | 需接4.7K上拉电阻 |
3. 软件设计与实现
3.1 开发环境搭建
使用Keil MDK-ARM开发环境,需要安装:
- Keil uVision5(版本5.25以上)
- STM32F1xx Device Family Pack
- ST-Link驱动(如果使用ST-Link调试器)
注意:安装完成后务必检查芯片支持包版本,我遇到过因为DFP版本过旧导致编译异常的问题。
3.2 主程序流程图
系统工作流程如下:
- 上电初始化所有外设
- 进入主循环:
- 读取温度传感器数据
- 读取烟雾传感器状态
- 检测人体红外信号
- 根据预设阈值判断是否报警
- 中断服务程序处理紧急停止按钮
3.3 关键代码实现
3.3.1 温度读取函数
c复制float Read_Temperature(void)
{
uint8_t temp[2];
HAL_I2C_Mem_Read(&hi2c1, LM75A_ADDR, 0x00, 1, temp, 2, 100);
int16_t raw = (temp[0] << 8) | temp[1];
return raw / 256.0f;
}
3.3.2 报警判断逻辑
c复制void Check_Alarm(void)
{
float temp = Read_Temperature();
uint8_t smoke = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12);
uint8_t human = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8);
if(temp > TEMP_THRESHOLD || smoke == HIGH)
{
// 触发报警
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); // 红灯亮
Beep_On(); // 蜂鸣器响
// 双重异常且无人在场时自动"洒水"
if(temp > TEMP_THRESHOLD && smoke == HIGH && human == LOW)
{
Sprinkler_On();
}
}
else
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
Beep_Off();
}
}
4. 系统调试与优化
4.1 传感器校准
烟雾传感器MQ-2需要校准:
- 在洁净空气中读取ADC值作为基准
- 在已知浓度烟雾环境中获取读数
- 通过两点校准法建立浓度-电压曲线
温度传感器LM75A校准更简单,只需用标准温度计对比读数,必要时添加软件补偿。
4.2 抗干扰措施
实际部署中发现的问题及解决方案:
-
误报警问题:
- 现象:厨房做饭时偶尔会误触发烟雾报警
- 解决:增加延时判断,只有持续3秒超标才报警
-
PIR传感器不稳定:
- 现象:有时检测不到人体移动
- 解决:调整安装位置,避免正对空调出风口
-
电磁干扰:
- 现象:靠近微波炉时系统重启
- 解决:在电源输入端增加LC滤波电路
5. 项目扩展与改进方向
虽然当前系统已经实现了基本功能,但还有几个值得改进的方向:
-
无线通知功能:
- 添加ESP8266 WiFi模块
- 通过MQTT协议推送报警信息到手机
- 需要处理TCP/IP协议栈和掉线重连
-
数据记录功能:
- 添加SPI Flash存储历史数据
- 实现温度/烟雾浓度变化曲线查看
-
多区域监控:
- 使用多个传感器节点
- 通过RS485总线组网
- 需要设计通信协议和地址分配方案
-
备用电源系统:
- 添加18650锂电池和充电电路
- 市电断电时自动切换
- 需要设计电源管理逻辑
在实际部署中,我发现系统对突然的温度变化反应最敏感。有一次室内空调突然开启,温度快速下降就触发了报警。后来我在软件中增加了变化率限制,只有温度在1分钟内上升超过5°C才会触发报警,这样就避免了这类误报。
