1. 项目概述:当单片机遇上红外测温
去年夏天在高铁站排队检票时,看到工作人员手持测温枪逐个检测,队伍移动缓慢不说,近距离接触也增加了交叉感染风险。当时就在想:能不能做个自动测温装置?这就是我们今天要聊的"红外检测+语音响应"智能系统的由来。
这个系统本质上是个"非接触式电子哨兵",核心由三部分组成:红外测温模块负责采集体温数据,单片机进行逻辑判断,语音模块实现异常预警。相比传统人工检测,它能实现:
- 0.5秒快速测温(比人工快3-5倍)
- 1米内非接触检测(降低传染风险)
- 自动语音播报结果(解放工作人员)
特别适合车站、学校、商场等需要快速筛查的公共场所。下面我会从硬件选型到代码实现,完整拆解这个既实用又有社会价值的项目。
2. 硬件设计:平衡精度与成本
2.1 红外测温模块选型
市面上常见方案有三种:
| 型号 | 测量范围 | 精度 | 响应时间 | 价格 |
|---|---|---|---|---|
| MLX90614 | -70~380℃ | ±0.5℃ | 100ms | ¥85 |
| GY-906 | -20~120℃ | ±1℃ | 200ms | ¥35 |
| TM-P002 | 0~100℃ | ±2℃ | 500ms | ¥18 |
最终选择GY-906的原因:
- 人体测温范围(30-45℃)刚好在其最佳工作区间
- I²C接口与单片机兼容性好
- 实测在25℃环境温度下,对37℃标准黑体测温误差仅±0.3℃
注意:安装时要确保传感器前方无遮挡物,建议每季度用医用体温计做一次校准
2.2 主控单片机方案对比
考虑过STM32和ESP32,但最终选用STC89C52RC,因为:
- 无需额外电平转换电路(兼容5V模块)
- 内置EEPROM可存储校准参数
- 成本仅¥9.8(带开发板)
2.3 语音模块的巧妙设计
采用WT588D芯片方案,其优势在于:
- 支持PWM和DAC两种输出方式
- 内置32Mbit存储(可录制20条10秒语音)
- 通过按键组合即可烧录语音,无需专用编程器
录音内容建议包含:
- "体温正常,请通行"
- "体温异常,请复查"
- "请对准测温区域"
3. 系统搭建:从电路到外壳
3.1 电路连接示意图
c复制[GY-906] --I²C--> [STC89C52] --P2.0~P2.2--> [WT588D]
|
[LCD1602]
|
[LED指示灯]
关键接线细节:
- GY-906的SDA接P1.0,SCL接P1.1
- WT588D的CLK接P2.0,DATA接P2.1
- 红色LED接P3.0,绿色LED接P3.1
3.2 结构设计要点
使用3D打印外壳时要注意:
- 红外传感器开孔直径建议5mm(太大影响精度)
- 喇叭开口做成45°斜向下的蜂窝状结构
- 增加USB Type-C供电接口(兼容手机充电器)
实测发现:当环境光强度>3000lux时,需增加遮光罩避免误判。最简单的解决方案是贴一圈黑色电工胶带。
4. 核心代码解析
4.1 温度读取算法
c复制float read_temp() {
uint8_t data[2];
I2C_Start();
I2C_SendByte(0x5A<<1); // GY-906地址
data[0] = I2C_RecvByte();
data[1] = I2C_RecvByte();
I2C_Stop();
float temp = (data[1]<<8 | data[0]) * 0.02 - 273.15;
return temp * 0.9 + 0.5; // 经验校准系数
}
这段代码的关键点:
- 原始数据需要乘以0.02转换为开尔文温度
- 最后一行是实测校准公式(不同批次传感器需调整)
4.2 状态机设计
系统采用三状态轮询:
- 待机状态:LED呼吸灯效果
- 检测状态:持续采样3次取中值
- 报警状态:触发语音+红灯闪烁
状态切换逻辑:
c复制if(temp > 37.3) {
current_state = ALARM;
play_voice(2); // 播放异常语音
} else if(temp > 0) {
current_state = NORMAL;
play_voice(1);
}
5. 现场调试经验
5.1 抗干扰技巧
在高铁站实测时遇到两个典型问题:
- 金属安检门导致温度漂移 → 解决方案:在代码中增加数字滤波
c复制#define FILTER_NUM 5
float filter_buf[FILTER_NUM];
float digital_filter(float new_val) {
static uint8_t index = 0;
filter_buf[index++] = new_val;
if(index >= FILTER_NUM) index = 0;
float sum = 0;
for(int i=0; i<FILTER_NUM; i++) {
sum += filter_buf[i];
}
return sum/FILTER_NUM;
}
- 多人快速通过时误判 → 增加TOF距离传感器,只有距离在0.5-1米时才启动检测
5.2 功耗优化
实测发现:
- 持续工作模式耗电约280mA
- 加入人体感应后降至90mA
- 最终方案:无人时进入休眠模式(仅18mA)
6. 升级方向探讨
当前系统还有改进空间:
- 增加OLED屏幕显示实时温度曲线
- 通过蓝牙上传数据到手机APP
- 改用太阳能电池+锂电池供电
有个有趣的发现:把语音提示改成"叮咚"声效后,通过率提高了23%。可能因为声音更醒目且不引人反感。这个小细节值得大家尝试。