1. 项目概述与设计背景
在医疗健康监测领域,体温测量是最基础也是最重要的生理参数检测之一。传统的水银体温计虽然测量精度较高,但存在测量时间长(通常需要3-5分钟)、易破碎导致水银泄漏等安全隐患。电子接触式体温计虽然解决了部分问题,但仍需与人体直接接触,在公共场所使用时存在交叉感染风险。
基于STM32的红外体温计采用非接触式测量方案,具有以下显著优势:
- 测量时间缩短至1-2秒
- 避免直接接触带来的感染风险
- 适合大规模人群快速筛查
- 可集成异常体温报警功能
这个毕业设计项目完整实现了从硬件选型、电路设计到软件开发的整个产品开发流程。系统核心采用STM32F103C8T6作为主控芯片,搭配MLX90614红外温度传感器和0.96寸OLED显示屏,构建了一个完整的体温测量系统。
2. 硬件系统设计详解
2.1 核心器件选型与原理
2.1.1 STM32主控芯片
选用STM32F103C8T6(俗称"蓝莓派")作为主控制器,主要基于以下考虑:
- 72MHz主频的Cortex-M3内核,性能足够处理温度数据
- 内置12位ADC,可直接读取传感器模拟信号
- 丰富的外设接口(I2C、SPI、USART等)
- 低功耗特性(运行模式约36mA)
- 性价比高(市场价约10-15元)
实际开发中发现,STM32F103的GPIO驱动能力较强,可直接驱动OLED显示屏,无需额外电平转换电路。
2.1.2 红外温度传感器
采用MLX90614ESF-BAA红外测温模块,关键参数:
- 测量范围:-70°C ~ 382.2°C
- 人体测温精度:±0.2°C(在36°C~39°C范围内)
- 视场角(FOV):90°
- 输出方式:I2C数字接口(地址0x5A)
- 工作电压:3.3V
传感器内部结构包含:
- 红外热电堆探测器
- 低噪声放大器
- 17位ADC
- DSP数字信号处理器
- 温度补偿电路
2.1.3 显示模块
选用SSD1306驱动的0.96寸OLED屏,特点:
- 分辨率128×64
- 自发光无需背光
- 对比度高(10000:1)
- I2C接口(节省IO资源)
- 工作电流约20mA
2.2 电路设计要点
2.2.1 电源电路设计
系统采用3.7V锂电池供电,通过AMS1117-3.3稳压芯片转换为3.3V。关键设计考虑:
- 输入电容:10μF钽电容(低ESR)
- 输出电容:22μF陶瓷电容
- 在MLX90614电源引脚添加0.1μF去耦电容
- OLED屏电源线路串联10Ω电阻抑制高频噪声
2.2.2 传感器接口电路
MLX90614的I2C接口连接示意图:
code复制MLX90614 STM32F103
VDD ---- 3.3V
GND ---- GND
SCL ---- PB6
SDA ---- PB7
注意:I2C总线需上拉电阻(4.7kΩ),但部分开发板已内置,需确认避免重复。
2.2.3 抗干扰设计
- 传感器信号线尽量短(<5cm)
- 电源与地线走线加粗(>20mil)
- 模拟与数字地单点连接
- 在MCU的ADC输入引脚添加RC滤波(1kΩ+0.1μF)
3. 软件系统实现
3.1 系统软件架构
采用分层设计模式:
code复制应用层:用户界面、报警逻辑
业务层:温度转换算法、滤波处理
驱动层:OLED显示、MLX90614、按键
硬件层:STM32 HAL库
3.2 关键算法实现
3.2.1 温度读取流程
c复制// MLX90614温度读取示例代码
float read_object_temp(void) {
uint8_t data[3];
HAL_I2C_Mem_Read(&hi2c1, 0x5A<<1, 0x07, 1, data, 3, 100);
float temp = (data[1]<<8)|data[0];
temp = (temp * 0.02) - 273.15; // 转换为摄氏度
return temp;
}
3.2.2 数字滤波算法
采用滑动平均滤波结合中值滤波:
c复制#define FILTER_SIZE 5
float temp_filter(float new_val) {
static float buffer[FILTER_SIZE] = {0};
static uint8_t index = 0;
// 更新缓冲区
buffer[index] = new_val;
index = (index + 1) % FILTER_SIZE;
// 中值滤波
float temp_buf[FILTER_SIZE];
memcpy(temp_buf, buffer, sizeof(buffer));
bubble_sort(temp_buf, FILTER_SIZE);
// 取中间3个值的平均
return (temp_buf[1] + temp_buf[2] + temp_buf[3]) / 3;
}
3.2.3 体温补偿算法
考虑环境温度影响的补偿公式:
code复制T_corrected = T_measured + k*(T_ambient - 25)
其中k为补偿系数,通过实验测定(典型值0.1-0.3)
3.3 OLED显示实现
采用u8g2图形库驱动显示:
c复制// 显示初始化
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);
// 温度显示示例
void show_temp(float temp) {
char buf[20];
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB14_tr);
sprintf(buf, "%.1f C", temp);
u8g2.drawStr(10, 30, buf);
if(temp > 37.3) {
u8g2.setFont(u8g2_font_ncenB10_tr);
u8g2.drawStr(15, 50, "High Temp!");
}
u8g2.sendBuffer();
}
4. 系统校准与测试
4.1 校准流程
- 准备标准黑体辐射源(精度±0.1°C)
- 在25°C环境温度下进行校准
- 设置目标温度为37.0°C
- 测量并记录传感器原始输出
- 计算补偿系数:
code复制offset = 37.0 - T_measured
- 将offset写入STM32 Flash保存
4.2 性能测试数据
测试条件:室温25±1°C,相对湿度50±5%
| 标准温度(°C) | 测量值(°C) | 误差(°C) |
|---|---|---|
| 35.0 | 35.1 | +0.1 |
| 36.5 | 36.6 | +0.1 |
| 37.0 | 37.1 | +0.1 |
| 38.0 | 37.9 | -0.1 |
| 39.0 | 38.8 | -0.2 |
4.3 常见问题排查
- 测量值波动大
- 检查传感器供电是否稳定
- 确认滤波算法参数设置
- 检查是否有强气流干扰
- OLED显示异常
- 确认I2C地址是否正确(通常0x3C或0x78)
- 检查上拉电阻是否接好
- 测试电源电压是否达到3.3V
- 温度读数明显偏差
- 重新进行校准流程
- 检查传感器与被测物体的距离(建议3-5cm)
- 确认环境温度补偿是否启用
5. 项目优化与扩展
在实际使用中发现几个可以改进的方向:
- 增加蓝牙模块(HC-05)实现数据无线传输
c复制// 蓝牙发送示例
void bt_send_temp(float temp) {
char buf[20];
sprintf(buf, "T=%.1f\r\n", temp);
HAL_UART_Transmit(&huart1, (uint8_t*)buf, strlen(buf), 100);
}
- 添加温度历史记录功能
- 使用STM32内部Flash存储最近10次测量数据
- 或外接AT24C02 EEPROM芯片扩展存储
- 低功耗优化
- 采用STM32的STOP模式(电流可降至20μA)
- 添加人体接近传感器(如HC-SR501)触发唤醒
- 优化OLED刷新频率(非必要时不刷新)
这个项目完整展示了从需求分析到产品实现的整个过程,特别是在疫情常态化防控背景下,这种非接触式体温测量方案具有实际应用价值。通过选择适当的硬件和优化软件算法,可以在低成本下实现医疗级精度的体温测量。
