基于STM32F103C8T6与GY-906的红外测温系统设计实践
在疫情常态化防控和工业智能化升级的双重推动下,非接触式温度检测已从“可选功能”变为许多设备的核心需求。无论是社区门口的额温枪,还是自动化产线上的热监控节点,背后都离不开一个关键组合: 高集成度红外传感器 + 高性价比MCU 。
这其中,GY-906(基于Melexis MLX90614芯片)因其出厂校准、数字输出、无需外部补偿等特性,成为开发者首选;而STM32F103C8T6凭借其成熟的生态和强大的外设支持,自然成了主控的理想选择。这两者的结合,看似简单,实则蕴藏着不少工程细节——稍有不慎,就会出现通信失败、读数跳变甚至系统复位等问题。
本文将带你深入这个经典搭配的技术内核,不只讲“怎么连”,更要说清楚“为什么这么连”、“哪里容易踩坑”以及“如何提升稳定性”。
为什么是 GY-906?它真的“即插即用”吗?
市面上有不少红外测温模块,但大多数需要自己做信号放大、滤波、温度补偿甚至黑体标定。相比之下,GY-906最大的优势在于: 所有复杂算法已经固化在MLX90614芯片内部 。
这颗芯片本质上是一个完整的“红外测温SoC”。它集成了热电堆探测器、低噪声放大器、17位ADC、DSP处理器以及EEPROM存储单元。最关键的是,每个出厂的MLX90614都经过多点黑体炉校准,温度数据直接通过I²C输出,单位已经是摄氏度或开尔文。
但这并不意味着你可以把它接到MCU上就万事大吉。比如:
-
它的默认I²C地址是
0x5A,不可更改; - 数据采用小端格式(LSB先发),读取时必须注意字节顺序;
- 内部使用斯特藩-玻尔兹曼定律进行辐射能量到温度的转换,依赖环境温度补偿,因此传感器自身温度的准确性至关重要。
公式如下:
$$
P = \varepsilon \sigma (T_{obj}^4 - T_{amb}^4)
$$
其中 $P$ 是接收到的红外功率,$\varepsilon$ 是物体发射率(人体皮肤约为0.98),$\sigma$ 是常数,$T_{obj}$ 和 $T_{amb}$ 分别为目标物和环境温度(单位为K)。芯片会自动完成这一非线性计算,我们只需要读寄存器即可。
常见的测量范围为 -70°C ~ +380°C(具体型号决定),分辨率达0.02°C,在36–39°C区间典型精度可达±0.5°C,完全满足一般医疗筛查和工业监测的需求。
还有一个常被忽视的参数是 视场角(FOV) 。例如5° FOV意味着距离目标10cm时,测温区域直径约0.87mm;若距离拉远到50cm,则光斑直径扩大至近9mm。如果你误把额头边缘纳入测量范围,结果必然偏低。所以在实际应用中,建议配合激光指示或结构限位来保证对准。
STM32F103C8T6:不只是“便宜好用”
很多人选择STM32F103C8T6是因为它价格低、资料多、可以用Arduino IDE开发。但真正让它胜任这类传感任务的,其实是它的硬件资源与实时控制能力。
这款基于ARM Cortex-M3内核的MCU主频可达72MHz,拥有64KB Flash和20KB SRAM,支持标准外设库、HAL库甚至LL驱动,更重要的是——它具备 真正的硬件I²C控制器 (I²C1和I²C2),而不是靠GPIO模拟。
这意味着什么?相比软件模拟I²C,硬件I²C能提供更稳定的时序控制,尤其是在总线上挂载多个设备或存在干扰的情况下,不容易丢帧或锁死总线。而且它可以产生重复起始条件、支持DMA传输、具备错误中断机制,这些对于构建可靠通信链路非常关键。
不过也要注意几个陷阱:
- STM32F103的工作电压是2.0V~3.6V,推荐使用3.3V供电;
- 虽然GY-906模块可以接受5V电源输入,但其SCL/SDA引脚是否耐5V取决于具体模块设计;
- 如果GY-906由5V供电,而STM32运行在3.3V,则必须加入电平转换电路(如PCA9306或分压电阻),否则长期工作可能损坏MCU IO口。
此外,该芯片还支持多种低功耗模式(Sleep、Stop、Standby),非常适合电池供电的应用场景。只需在两次测温之间进入Stop模式,再通过外部中断唤醒,即可大幅延长续航时间。
系统架构与关键连接
一个典型的红外测温仪系统通常包含以下几个部分:
[GY-906] ←I²C→ [STM32F103C8T6] ←GPIO→ [OLED显示屏]
↓
[按键输入]
↓
[蜂鸣器/LED报警]
引脚连接建议
| 功能 | MCU引脚 | 说明 |
|---|---|---|
| GY-906 SDA | PB7 (I²C1_SDA) | 推荐使用硬件I²C1 |
| GY-906 SCL | PB6 (I²C1_SCL) | 上拉至3.3V,阻值4.7kΩ |
| OLED SDA/SCL | 同I²C总线 | 注意设备地址冲突 |
| 按键 | PA0 | 可配置为外部中断 |
| 蜂鸣器 | PA1 | 驱动NPN三极管控制有源蜂鸣器 |
⚠️ 特别提醒:GY-906的I²C地址固定为
0x5A(写地址0xB4,读地址0xB5),无法修改。如果OLED也使用相同地址(如某些SSD1306默认地址也是0x78对应0x5A),就会发生冲突。解决方案包括:
- 使用支持地址切换的OLED模块(如通过ADDR引脚改变);
- 改用SPI接口的显示屏;
- 或者采用软件I²C分别驱动两个设备。
温度读取代码实现与常见问题
下面是使用HAL库读取GY-906温度寄存器的标准流程:
uint16_t read_temp_reg(uint8_t reg) {
uint8_t data[2];
if (HAL_I2C_Master_Transmit(&hi2c1, 0x5A << 1, ®, 1, 100) == HAL_OK) {
if (HAL_I2C_Master_Receive(&hi2c1, (0x5A << 1) | 0x01, data, 2, 100) == HAL_OK) {
return (data[1] << 8) | data[0]; // 小端序:MSB在后
}
}
return 0; // 错误返回0
}
然后解析目标温度:
float temp_k = read_temp_reg(0x07) * 0.02; // TOBJ1 寄存器
float temp_c = temp_k - 273.15; // 转换为摄氏度
常用寄存器地址:
-
0x06
: TA(环境温度)
-
0x07
: TOBJ1(目标物体温度)
-
0x24
: 发射率设置(默认0.95,人体建议设为0.98)
实际调试中常见问题及对策
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| I²C通信失败 | 无上拉电阻 / 地址错误 / 电平不匹配 | 加4.7kΩ上拉,确认逻辑分析仪抓包 |
| 温度值剧烈跳动 | 未加滤波 / 外界热源干扰 | 添加滑动平均滤波(5~10次采样均值) |
| 测量值整体偏低 | 发射率设置过低 / 对焦不准 | 提高发射率至0.98,确保目标充满视场 |
| OLED导致I²C锁死 | 总线竞争 / 地址冲突 | 分时访问或使用独立总线 |
| 系统频繁复位 | 电源波动 / 接地不良 | 在VDD引脚附近加0.1μF去耦电容 |
值得一提的是,单纯依靠一次读数往往不够稳定。建议加入简单的软件滤波算法,例如:
#define FILTER_SIZE 5
float temp_buffer[FILTER_SIZE];
int buffer_idx = 0;
float get_filtered_temp() {
float sum = 0;
for (int i = 0; i < FILTER_SIZE; i++) {
sum += temp_buffer[i];
}
return sum / FILTER_SIZE;
}
// 每次获取新数据时更新缓冲区
temp_buffer[buffer_idx] = new_temp;
buffer_idx = (buffer_idx + 1) % FILTER_SIZE;
这样可以在不影响响应速度的前提下显著降低噪声影响。
提升系统可靠性的工程技巧
1. 电源设计不容忽视
尽管GY-906标称支持3.3V~5V供电,但为了与STM32共用电源并避免电平问题,强烈建议整个系统统一使用 3.3V稳压电源 。推荐使用AMS1117-3.3或LDL1117V33,并在每个芯片的VDD引脚旁放置 0.1μF陶瓷电容 作为去耦,必要时再并联一个10μF电解电容以吸收瞬态电流。
2. I²C布线规范
- SCL与SDA走线尽量短且平行,避免与其他高速信号(如CLK、PWM)平行走线;
- 上拉电阻靠近MCU端放置;
- 若PCB空间允许,可在I²C线上串联33Ω左右的小电阻以抑制反射。
3. 发射率校准的重要性
不同材料的发射率差异极大:抛光金属仅0.1左右,而皮肤接近0.98。若用默认的0.95去测额头,结果会偏低。可通过以下方式优化:
- 在代码中预留发射率调节接口(如长按按键进入设置模式);
- 或根据应用场景预设不同模式(人体/物体/自定义)。
4. 抗干扰与容错机制
嵌入式系统最怕“死机”。为此可采取以下措施:
- 开启独立看门狗(IWDG),防止程序跑飞;
- I²C操作增加重试机制(最多3次),失败后进入错误处理流程;
- 关键变量使用volatile声明,防止编译器优化导致异常;
- OLED刷新频率控制在每500ms一次,避免频繁刷屏造成总线拥堵。
扩展可能性:不止是一把“电子温度计”
这套基础架构极具扩展性。只要稍微改动,就能适应更多场景:
- 加入HC-05蓝牙模块 :将温度上传至手机APP,实现远程监控;
- 连接ESP-01S WiFi模块 :数据上传云端,用于楼宇健康管理系统;
- 搭配RTC芯片(DS3231) :记录历史温度曲线,支持回溯分析;
- 增加语音播报模块(SYN6288) :适用于无障碍设备设计;
- 集成红外补光灯或激光点 :辅助夜间或远距离测温定位。
更进一步,若将多个GY-906组成阵列,配合STM32H7或外部FPGA处理,甚至可以实现简易的热成像功能——虽然分辨率有限,但在成本敏感型预警系统中仍有价值。
这种高度集成的设计思路,正在悄然改变传统传感系统的开发范式。过去需要一整块运放+ADC+MCU才能完成的任务,现在一颗MLX90614就搞定了。而STM32这样的通用MCU,则扮演了“智能粘合剂”的角色,把感知、处理、交互无缝串联起来。
正因如此,基于STM32F103C8T6与GY-906的红外测温方案,不仅适合学生实验和创客项目,也为轻量级工业监控提供了快速原型验证的可能性。它的真正价值,不在于某个单一技术点的先进性,而在于 用最低的成本实现了足够高的可靠性与可维护性 。
当你下次拿起一把额温枪时,不妨想想:也许它的“大脑”里,正跑着一段你曾经写过的I²C读取代码。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
1436

被折叠的 条评论
为什么被折叠?



