这个智能家居安防系统是我去年为一个社区安全改造项目设计的解决方案。当时业主们反映最头疼的就是煤气泄漏和入室盗窃问题,特别是那些经常出差的家庭。传统监控系统不仅安装成本高,而且无法主动预警。于是我就想到了用STM32单片机搭配几个常见传感器,做一套经济实用的安防系统。
系统采用主从机架构,主机放在客厅作为控制中心,从机安装在各个房间。最让我自豪的是,整套设备的硬件成本不到300元,却实现了商业安防系统80%的功能。下面我就把这个项目的完整实现过程分享给大家,包括硬件选型、电路设计、程序逻辑和实际调试中的各种坑。
系统采用1主机+N从机的分布式架构,这个设计有几个关键考虑:
选用STM32F103C8T6最小系统板,理由很实在:
注意:市面上有些便宜的"STM32"其实是国产兼容芯片,建议购买正版核心板,我曾在调试阶段因为这个问题浪费了两天时间。
MQ-2气体传感器:检测一氧化碳
火焰传感器:
HC-SR501人体红外:
ZigBee选用常见的XBee S2C模块,主要参数:
整个系统采用5V供电,但需要注意:
我的解决方案:
c复制// 电源架构
220V AC → 12V/2A适配器 → 主电源
↓
LM2596 → 5V/3A(传感器供电)
↓
AMS1117 → 3.3V(单片机供电)
MQ-2需要加热电压(5V±0.1V),输出信号要加RC滤波:
code复制 10kΩ
VCC ----/\/\/---- A0
|
100nF
|
GND
使用ULN2003驱动28BYJ-48电机:
调试中发现几个关键问题:
c复制void main() {
init_all(); // 初始化外设
while(1) {
check_buttons(); // 按键扫描
process_zigbee(); // 处理无线数据
update_display(); // 刷新屏幕
handle_alarm(); // 报警处理
}
}
从机采用状态机模式,核心逻辑:
| 状态 | 触发条件 | 动作 |
|---|---|---|
| 正常 | CO<15ppm & 无火焰 & (有人模式或无人无检测) | 维持当前状态 |
| CO报警 | CO≥15ppm | 开窗+蜂鸣器+发短信 |
| 火警 | 检测到火焰 | 开喷淋+蜂鸣器+发短信 |
| 入侵 | 无人模式检测到人 | 蜂鸣器+发短信 |
MQ-2需要温度补偿,采用分段线性化:
c复制float get_co_ppm() {
float voltage = adc_read(0) * 3.3 / 4096;
float Rs = (5.0 - voltage) / voltage * RL; // RL=10kΩ
float ratio = Rs / R0; // R0为洁净空气中电阻
// 经验公式
if(ratio > 0.6) return 0; // 故障
else if(ratio > 0.3) return 5 * (0.6 - ratio);
else return 10 + 90 * (0.3 - ratio)/0.3;
}
步进电机采用加速曲线控制:
c复制void window_control(int angle) {
int steps = angle * 64 / 5.625; // 换算为步数
int delay = 5000; // 初始延迟(us)
for(int i=0; i<steps; i++) {
if(i < steps/4) delay -= 100;
else if(i > steps*3/4) delay += 100;
step_motor(1);
delay_us(delay);
}
}
遇到的主要问题:
优化措施:
code复制旧格式:[HEAD][LEN][DATA][CRC]
新格式:[HEAD][SEQ][LEN][DATA][CRC][ACK]
优化后丢包率降至0.3%,平均延迟<50ms
实测数据:
| 模块 | 工作电流 | 待机电流 |
|---|---|---|
| STM32 | 25mA | 8mA |
| ZigBee | 40mA | 1mA |
| 传感器组 | 15mA | 0.5mA |
采取的措施:
最终使系统待机功耗从73mA降至12mA
GSM短信发送失败
窗户电机卡死
误报警问题
在实际使用中,我还尝试了几种扩展方案:
这个项目最让我惊喜的是它的可靠性 - 已经连续运行11个月没有误报和漏报。如果大家要复现的话,建议先从基础功能做起,再逐步添加扩展模块。