1. 项目概述
这个车站温度检测系统是我去年为本地公交枢纽站做的一个小项目,当时车站管理人员反映传统测温枪效率太低,高峰期经常排长队。于是我用单片机+红外传感器+语音模块做了这套自动测温装置,实测下来单日能检测2000+人次,误报率低于1.5%。
系统核心就三部分:非接触式红外测温、阈值判断、语音提示。当乘客站在指定位置时,红外传感器0.3秒内完成测温,STM32判断是否超过37.3℃,然后通过SYN6288语音芯片播报"体温正常"或"请复查体温"。整套设备成本不到200元,比市面同类产品便宜80%以上。
2. 硬件设计与选型
2.1 核心器件选型对比
我测试过三种方案,最终选型如下表:
| 器件类型 | 候选型号 | 最终选择 | 选择理由 |
|---|---|---|---|
| 主控芯片 | STM32F103C8T6 vs ATmega328P | STM32F103C8T6 | 内置12位ADC,价格相当但性能更强 |
| 红外传感器 | MLX90614 vs GY-906 | MLX90614 | 医疗级精度(±0.5℃),I2C接口 |
| 语音模块 | SYN6288 vs WT588D | SYN6288 | 支持GB2312编码,音质更清晰 |
| 显示屏 | 0.96寸OLED vs LCD1602 | 无 | 车站环境光照强,改用LED指示灯 |
特别注意:MLX90614要选DCI型号(测量距离3-5cm),ESF型号适合远距离但精度会下降
2.2 电路设计要点
电源部分采用AMS1117-3.3V稳压芯片,实测发现红外传感器对电压波动敏感,我在MLX90614的VCC脚并联了100μF+0.1μF电容组合。语音模块需要单独供电,否则大音量播放时会导致单片机复位。
PCB布局时要注意:
- 红外传感器要伸出外壳2-3cm,避免壳体温度干扰
- 麦克风开口朝下,防止环境噪音干扰
- 所有数字信号线加10K上拉电阻
3. 软件实现关键点
3.1 温度校准算法
直接读取的原始值需要补偿环境温度,我的校准公式:
code复制补偿温度 = 原始值 + (25 - 环境温度)*0.02
在代码中实现为:
c复制float calibrate_temp(float raw, float ambient) {
return raw + (25.0 - ambient) * 0.02f;
}
每周需要用标准体温计做一次校准,更新环境温度系数。
3.2 抗干扰处理
车站环境复杂,我通过三种方式提升稳定性:
- 连续采样5次取中值
- 两次检测间隔≥1秒
- 异常值过滤(如>42℃直接视为误测)
对应的代码逻辑:
c复制#define SAMPLE_TIMES 5
float get_stable_temp() {
float temps[SAMPLE_TIMES];
for(int i=0; i<SAMPLE_TIMES; i++){
temps[i] = mlx90614_read();
delay(200);
}
bubble_sort(temps); // 排序取中值
return (temps[2] < 42.0) ? temps[2] : ERROR_TEMP;
}
3.3 语音提示优化
实测发现这些细节影响很大:
- 添加200ms静音前缀,避免截头音
- "体温正常"音调降低20%,减少焦虑感
- 异常体温提示后延迟3秒再检测,防止重复播报
语音合成指令示例:
c复制void play_msg(uint8_t status) {
uart_send("\\[v10][m52][t5]"); // 设置参数
if(status == NORMAL) {
uart_send("体温正常");
} else {
uart_send("[v15]请复查体温!");
}
}
4. 现场部署经验
4.1 安装位置选择
经过三个点位对比测试:
- 闸机上方(高度1.7m):检测成功率达98%
- 立柱侧面:受行走方向影响大(成功率82%)
- 服务台桌面:儿童检测不到(成功率65%)
最终安装在闸机横杆,并贴上"请抬头"标识。注意避开空调直吹位置,我们曾因出风口影响导致全天误报率飙升到8%。
4.2 环境适应性改造
- 强光干扰:给传感器加装3D打印遮光罩(内部贴黑色绒布)
- 冬季低温:在PCB背面贴5W加热片,保持芯片>0℃
- 防误触:用亚克力板做45°斜面防护
5. 常见问题排查
5.1 典型故障处理表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 持续报高温 | 传感器镜头污损 | 用酒精棉片清洁 |
| 无语音输出 | 供电不足 | 检查5V电源电流≥1A |
| 数值波动大 | 附近有电磁干扰 | 移动路由器等设备 |
| 开机不启动 | 程序跑飞 | 按住BOOT键复位 |
5.2 数据漂移处理
遇到温度读数每周递增0.3℃的情况,这是红外传感器老化特性。我在软件中加入自动补偿:
c复制float auto_compensate(float temp) {
static float offset = 0.0;
if(days_used > 30) {
offset = (days_used - 30) * 0.01;
}
return temp - offset;
}
这套系统已经稳定运行11个月,关键是要每月做这些维护:
- 用标准体温计验证精度
- 更新环境温度校准系数
- 清理传感器窗口
- 检查喇叭防尘网
最后分享一个省钱技巧:语音提示内容可以录制成"滴"声+LED指示灯,能再降30%成本,但车站方考虑到无障碍需求还是选择了语音方案。