1. 项目背景与核心价值
在车站这类人流密集的公共场所,温度监测一直是环境管理的重要环节。传统的人工巡检方式效率低下,而固定式温度检测设备又缺乏灵活性和交互能力。我们设计的这套系统,正是为了解决这些痛点。
这个项目的核心在于将红外测温技术与语音反馈相结合。红外测温模块可以非接触式测量人体温度,避免了传统体温计需要接触的卫生问题;而语音响应系统则能在检测到异常时立即发出提示,大大提升了响应速度。整套系统基于STC89C52单片机开发,具有成本低、稳定性好、易于部署的特点。
提示:STC89C52是宏晶科技推出的一款增强型51单片机,相比传统8051内核,它增加了内部EEPROM、更多定时器和更丰富的中断资源,特别适合这类实时性要求较高的控制应用。
2. 系统硬件设计与选型
2.1 主控芯片选择
我们选用STC89C52RC作为主控芯片,主要基于以下几点考虑:
- 8位8051内核,开发环境成熟,资料丰富
- 8KB Flash程序存储器,足够存储语音提示的音频数据
- 512B RAM,满足数据处理需求
- 4个8位I/O口,方便扩展外设
- 内置看门狗定时器,提高系统稳定性
- 支持ISP在线编程,调试方便
2.2 红外测温模块
采用MLX90614非接触式红外温度传感器,它具有以下优势:
- 测量范围:-70°C~380°C(人体测温模式下为32°C~42.5°C)
- 精度:±0.5°C(在人体温度范围内)
- 数字输出,通过I2C接口与单片机通信
- 3.3V工作电压,低功耗设计
2.3 语音模块设计
使用WT588D语音芯片,特点包括:
- 支持MP3格式音频播放
- 内置16位DAC,音质清晰
- 可通过SPI接口控制
- 最大支持16MB的Flash存储,可存储多段语音提示
2.4 其他外围电路
- LCD1602显示屏:用于实时显示温度值
- 蜂鸣器:用于异常温度报警
- 按键电路:用于设置温度阈值
- 电源管理:采用AMS1117稳压芯片,提供稳定的3.3V和5V输出
3. 系统软件设计
3.1 主程序流程图
系统软件采用模块化设计,主程序流程如下:
- 系统初始化(I/O口、定时器、外设等)
- 读取红外传感器数据
- 温度数据处理与滤波
- 判断是否超出阈值
- 根据结果执行显示、语音提示等操作
- 循环执行2-5步
3.2 温度采集与处理
c复制float read_temperature(void) {
uint8_t data[3];
i2c_read(MLX90614_ADDR, 0x07, data, 2); // 读取物体温度寄存器
float temp = (data[1]<<8) | data[0];
temp = temp * 0.02 - 273.15; // 转换为摄氏度
// 滑动平均滤波
static float temp_buf[5] = {0};
static uint8_t index = 0;
temp_buf[index] = temp;
index = (index + 1) % 5;
float sum = 0;
for(uint8_t i=0; i<5; i++) {
sum += temp_buf[i];
}
return sum / 5;
}
3.3 语音提示逻辑
系统预设了多段语音提示:
- "体温正常,请通行"
- "体温异常,请复查"
- "系统启动完成"
- "请对准测温区域"
语音播放采用状态机设计,避免阻塞主程序运行:
c复制void play_voice(uint8_t id) {
static uint8_t last_id = 0xFF;
if(id != last_id) {
spi_send(VOICE_START_CMD);
spi_send(id);
last_id = id;
}
}
4. 系统调试与优化
4.1 红外测温校准
在实际使用中,我们发现红外测温存在以下问题需要校准:
- 环境温度影响:通过增加环境温度补偿算法
- 测量距离影响:限定最佳测量距离为5-15cm
- 发射率设置:人体皮肤发射率设为0.98
校准方法:
- 使用标准水银温度计测量实际体温
- 记录红外传感器读数
- 计算补偿系数
- 更新校准参数
4.2 抗干扰设计
车站环境电磁干扰较强,我们采取了以下措施:
- 所有信号线加磁珠滤波
- 电源输入端增加π型滤波电路
- 数字地与模拟地单点连接
- 关键信号线使用屏蔽线
4.3 功耗优化
为延长电池供电时间,系统做了以下优化:
- 红外传感器间歇工作模式(每秒唤醒一次)
- LCD背光自动调节亮度
- 单片机空闲时进入掉电模式
- 关闭未使用的外设时钟
5. 实际应用效果
我们在本地公交总站部署了3台设备进行实测,获得了以下数据:
| 指标 | 测试结果 |
|---|---|
| 测温准确率 | 98.7% (±0.3°C内) |
| 响应时间 | <1秒 |
| 误报率 | <0.5% |
| 连续工作时长 | >72小时(2000mAh电池) |
使用过程中也发现了一些需要改进的地方:
- 强光直射时测温精度下降 → 增加遮光罩设计
- 高峰期人流密集时可能漏检 → 优化检测算法灵敏度
- 语音提示在嘈杂环境中听不清 → 增加音量调节功能
6. 扩展应用与升级方案
这套系统经过简单修改,可以应用于更多场景:
6.1 医院预检分诊
- 增加人脸识别功能
- 与医院HIS系统对接
- 增加二维码打印功能
6.2 学校晨检
- 增加学生考勤功能
- 数据自动上传云端
- 家长端APP推送
6.3 升级至STM32方案
对于需要更复杂功能的场合,可以考虑升级到STM32平台:
- 增加Wi-Fi/4G联网功能
- 支持多人同时检测
- 实现数据可视化分析
- 支持OTA远程升级
升级时需要注意:
- 电源设计要重新考量
- 外设驱动需要重写
- 系统架构需要调整
7. 常见问题与解决方法
在实际开发和部署过程中,我们遇到了以下典型问题:
7.1 红外测温不稳定
现象:读数跳动较大
解决方法:
- 检查电源是否稳定
- 增加软件滤波算法
- 确保传感器透镜清洁
- 避免强光直射
7.2 语音播放杂音
现象:播放时有"滋滋"声
解决方法:
- 检查音频地线是否单独走线
- 增加电源去耦电容
- 降低SPI时钟频率
- 使用优质音频功放芯片
7.3 系统死机
现象:长时间运行后无响应
解决方法:
- 启用看门狗定时器
- 检查堆栈是否溢出
- 增加异常复位机制
- 优化中断处理程序
8. 关键代码解析
8.1 主控制逻辑
c复制void main() {
sys_init(); // 系统初始化
play_voice(3); // 播放"系统启动完成"
while(1) {
float temp = read_temperature();
lcd_display(temp);
if(temp > TEMP_THRESHOLD) {
play_voice(2); // 播放"体温异常"
buzzer_on();
} else {
play_voice(1); // 播放"体温正常"
buzzer_off();
}
delay_ms(500);
}
}
8.2 I2C通信实现
c复制void i2c_start() {
SDA = 1;
SCL = 1;
delay_us(5);
SDA = 0;
delay_us(5);
SCL = 0;
}
void i2c_write(uint8_t dat) {
for(uint8_t i=0; i<8; i++) {
SDA = (dat & 0x80) ? 1 : 0;
dat <<= 1;
SCL = 1;
delay_us(5);
SCL = 0;
delay_us(5);
}
// 等待ACK
SDA = 1;
SCL = 1;
delay_us(5);
SCL = 0;
}
9. 制作注意事项
在自行制作该系统时,需要特别注意以下几点:
- 静电防护:红外传感器对静电敏感,焊接时要做好防护
- 透镜清洁:不要用手直接触摸传感器透镜
- 校准环境:校准时要在稳定的环境温度下进行
- 供电质量:使用干净的电源,纹波要小
- 安装位置:避免安装在通风口或阳光直射处
10. 成本分析与BOM清单
整套系统的物料成本大约在150-200元之间,主要包含以下部件:
| 部件 | 型号 | 单价(元) | 备注 |
|---|---|---|---|
| 单片机 | STC89C52RC | 8.5 | 建议使用正品 |
| 红外温度传感器 | MLX90614ESF | 45 | 工业级版本 |
| 语音芯片 | WT588D | 12 | 带Flash版本 |
| LCD屏幕 | LCD1602 | 15 | 蓝屏白字 |
| PCB板 | 双面板 | 25 | 含SMT加工 |
| 外壳 | 定制 | 30 | 3D打印或开模 |
| 其他元器件 | - | 20 | 电阻电容接插件等 |
对于学校或企业批量采购,成本可以进一步降低到120元左右。
