1. 项目概述
这个基于STM32的智能车窗控制系统是我在毕业设计期间完成的一个实用型项目,主要解决夏季高温环境下儿童被遗忘在车内导致的安全事故问题。系统通过多传感器融合检测技术,能够在驾驶员离车且检测到儿童滞留时,自动触发报警机制。整套方案成本控制在200元以内,非常适合作为电子类专业学生的课程设计或毕业设计选题。
我在实际开发过程中发现,市面上类似的车内滞留检测系统大多价格昂贵且功能单一。而本设计通过巧妙利用霍尔传感器、压力传感器和温湿度传感器的组合,实现了高性价比的多重安全防护。下面我将从硬件选型、系统设计到代码实现,完整分享这个项目的开发细节。
2. 核心功能设计
2.1 系统架构设计
整个系统采用模块化设计思想,主要包含以下几个功能单元:
- 状态检测单元:由霍尔传感器(UGN3503)和薄膜压力传感器组成
- 环境监测单元:DHT11温湿度传感器 + MH-Z19二氧化碳传感器
- 控制核心:STM32F103C8T6最小系统板
- 报警单元:SIM800L GSM模块 + 有源蜂鸣器
提示:选择STM32F103C8T6是因为其具有丰富的外设接口和适中的处理能力,完全能满足本项目需求,同时价格仅20元左右,性价比极高。
2.2 工作流程设计
系统的工作逻辑经过多次实际测试优化,最终确定如下判断流程:
- 霍尔传感器持续监测车辆运动状态(通过检测车轮转动)
- 当检测到车辆停止超过3分钟(可调参数),启动滞留检测程序
- 检查驾驶座压力传感器状态,确认驾驶员是否离座
- 同时检测后排压力传感器,判断是否有儿童滞留
- 若满足驾驶员离座且有儿童滞留,则读取环境传感器数据
- 当温度>32℃或CO₂浓度>2000ppm时,触发报警序列
3. 硬件实现细节
3.1 传感器选型与电路设计
3.1.1 霍尔传感器电路
选用UGN3503线性霍尔传感器检测车辆运动状态,其典型应用电路如下:
code复制VCC(5V) ──┬── 1kΩ电阻 ──┬── 输出至STM32 ADC
│ │
霍尔传感器 │
│ │
GND ──────┴─────────────┘
在实际安装时,将传感器固定在后轮附近,与轮毂上的磁铁保持5-10mm间距。车轮每转一圈,霍尔传感器会输出一个脉冲信号。
3.1.2 压力传感器布置
采用FSR402薄膜压力传感器检测座位状态,安装时需要注意:
- 驾驶座传感器安装在座椅底部中央位置
- 后排传感器分散布置在座位两侧(考虑儿童可能坐的位置)
- 每个传感器串联10kΩ上拉电阻,形成分压电路
注意:压力传感器的灵敏度需要通过实际测试校准,建议先用已知重量物品进行标定。
3.2 主控电路设计
STM32最小系统板的外设连接方式:
| 外设模块 | 连接引脚 | 备注 |
|---|---|---|
| 霍尔传感器 | PA0 | ADC1通道0 |
| 驾驶座压力 | PA1 | ADC1通道1 |
| 后排压力1 | PA2 | ADC1通道2 |
| 后排压力2 | PA3 | ADC1通道3 |
| DHT11 | PB6 | 单总线协议 |
| MH-Z19 | USART1 | 硬件串口,PB6/PB7 |
| SIM800L | USART2 | 硬件串口,PA2/PA3 |
| 蜂鸣器 | PC13 | GPIO输出 |
4. 软件实现解析
4.1 主程序逻辑框架
系统采用前后台架构,主循环中处理传感器数据,中断处理紧急事件:
c复制int main(void) {
// 硬件初始化
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
// 传感器初始化
DHT11_Init();
CO2Sensor_Init();
GSM_Init();
while (1) {
// 状态检测任务
VehicleStatus_Update();
SeatStatus_Update();
EnvStatus_Update();
// 报警判断逻辑
Alarm_Check();
HAL_Delay(100); // 100ms周期
}
}
4.2 关键算法实现
4.2.1 车辆静止判断算法
c复制#define STOP_THRESHOLD 180 // 3分钟(180*100ms)
void VehicleStatus_Update(void) {
static uint16_t stopCounter = 0;
float hallValue = HAL_ADC_GetValue(&hadc1);
if(hallValue < 0.5f) { // 无脉冲信号
stopCounter++;
} else {
stopCounter = 0;
}
if(stopCounter > STOP_THRESHOLD) {
systemStatus.vehicleStopped = 1;
} else {
systemStatus.vehicleStopped = 0;
}
}
4.2.2 报警触发条件判断
c复制void Alarm_Check(void) {
// 基础条件检查
if(!systemStatus.vehicleStopped) return;
if(systemStatus.driverPresent) return;
if(!systemStatus.childPresent) return;
// 环境条件检查
if((systemStatus.temperature > 32.0f) ||
(systemStatus.co2Level > 2000)) {
Trigger_Alarm();
}
}
5. 实际调试经验
5.1 传感器校准技巧
-
霍尔传感器灵敏度调节:
- 通过旋转电位器调整比较器阈值
- 使用磁铁在不同距离测试输出信号
- 最终确定1.5cm为有效检测距离
-
压力传感器标定方法:
- 在座椅上放置5kg、10kg、15kg标准砝码
- 记录ADC原始值并建立线性关系
- 设置10kg为有效触发阈值
5.2 常见问题排查
在实际测试中遇到的一些典型问题及解决方案:
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| GSM模块无法注册网络 | 天线接触不良 | 重新焊接天线接口 |
| CO2传感器读数不稳定 | 供电电压不足 | 增加1000μF电容稳压 |
| 误报率过高 | 压力传感器阈值设置不当 | 重新校准并增加滤波算法 |
| 系统偶尔死机 | 看门狗未启用 | 启用IWDG并设置2秒超时 |
5.3 功耗优化建议
为降低系统整体功耗,我采取了以下措施:
- 将STM32主频降至8MHz(仍能满足需求)
- 传感器采用间歇工作模式(每10秒唤醒一次)
- GSM模块仅在需要发送报警时上电
- 所有未使用的IO口设置为模拟输入模式
经过优化后,系统待机电流从85mA降至12mA,显著延长了电池续航时间。
6. 扩展改进方向
这个基础版本完成后,还可以考虑以下功能扩展:
- 增加GPS定位:在报警短信中包含车辆当前位置
- 添加蓝牙连接:通过手机APP实时查看车内状态
- 集成车窗控制:在报警同时自动降下车窗通风
- 使用机器学习算法:通过历史数据优化报警阈值
我在实际开发中发现,使用STM32的硬件I2C接口驱动OLED显示屏时,偶尔会出现通信失败的情况。经过示波器抓取波形分析,发现是上拉电阻值不合适导致的。将4.7kΩ上拉电阻更换为2.2kΩ后,通信稳定性显著提高。这个细节在大多数教程中都不会提及,但对于实际项目却非常关键。