用STM32CubeMX和HAL库快速上手GY-906测温:一个DIY体温筛查小项目的诞生

张开发
2026/4/12 17:11:41 15 分钟阅读

分享文章

用STM32CubeMX和HAL库快速上手GY-906测温:一个DIY体温筛查小项目的诞生
从零打造智能体温筛查仪STM32CubeMX与GY-906的完美邂逅去年夏天我在社区门口看到保安用额温枪逐个测量居民体温时突然萌生了一个想法能不能用常见的电子元件做个非接触式的体温筛查装置这个念头最终催生了一个基于STM32和GY-906红外测温传感器的小项目。今天我就把这个从硬件选型到软件实现的完整过程分享给大家特别适合刚接触嵌入式开发的创客朋友。1. 项目规划与硬件选型1.1 为什么选择GY-906传感器在开始动手前我对比了几款常见的红外测温传感器传感器型号测量范围精度接口类型价格区间MLX90614-70~380°C±0.5°CI2C/SMBus中高端AMG88330~80°C±2.5°CI2C中端TMP006-40~125°C±1°CI2C低端最终选择GY-906MLX90614的国产版本主要考虑三点医疗级精度±0.5℃的误差完全满足体温筛查需求非接触测量有效距离可达5-10cm避免交叉感染即插即用标准I2C接口与STM32完美兼容1.2 核心硬件清单我的物料清单(BOM)如下STM32F103C8T6最小系统板蓝色药丸GY-906红外测温模块0.96寸OLED显示屏(I2C接口)蜂鸣器模块用于异常体温报警3.7V锂电池充电模块洞洞板及连接线提示购买GY-906时注意选择BAA版本人体测温优化而非BCC工业版。两者外观几乎一样但校准参数不同。2. STM32CubeMX工程配置2.1 创建基础工程打开STM32CubeMX后我按照以下步骤初始化工程选择MCU型号STM32F103C8配置时钟树使用内部8MHz RC振荡器PLL倍频到72MHz启用SWD调试接口配置GPIOPA0作为蜂鸣器控制引脚// 自动生成的时钟配置代码 void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct {0}; // 省略具体配置... HAL_RCC_OscConfig(RCC_OscInitStruct); HAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_2); }2.2 I2C接口配置GY-906使用I2C通信在CubeMX中配置PB6(SCL)和PB7(SDA)选择I2C1模式为I2C时钟速度设为100kHzMLX90614支持到1MHz但保守起见先低速调试启用I2C中断非必须但建议用于错误处理关键配置参数Timing参数0x2000090E标准模式从机地址0x5AGY-906默认地址注意如果使用硬件I2C遇到问题可以尝试软件模拟I2C。在CubeMX中只需配置GPIO为输出模式即可。3. 驱动程序开发3.1 HAL库I2C通信框架HAL库提供了简洁的I2C操作API我封装了基础读写函数#define MLX90614_ADDR 0x5A 1 // HAL库要求左移1位 HAL_StatusTypeDef MLX90614_ReadReg(I2C_HandleTypeDef *hi2c, uint8_t reg, uint16_t *data) { uint8_t buf[3]; HAL_StatusTypeDef ret HAL_I2C_Mem_Read(hi2c, MLX90614_ADDR, reg, I2C_MEMADD_SIZE_8BIT, buf, 3, 100); if(ret HAL_OK) { *data (buf[1] 8) | buf[0]; // 温度数据在低16位 uint8_t pec buf[2]; // 校验位 if(!CheckPEC(buf, 2, pec)) { // 自定义校验函数 return HAL_ERROR; } } return ret; }3.2 温度数据解析MLX90614的原始数据需要转换才有实际意义float GetObjectTemp(void) { uint16_t rawData; if(MLX90614_ReadReg(hi2c1, 0x07, rawData) HAL_OK) { return (float)rawData * 0.02 - 273.15; // 转换为摄氏度 } return -99.9; // 错误值 }常见问题排查如果返回-99.9检查I2C线路连接SCL/SDA是否接反上拉电阻4.7kΩ到3.3V电源稳定性示波器观察3.3V纹波4. 系统集成与优化4.1 多任务处理框架为了避免阻塞式延迟影响用户体验我采用了基于HAL库定时器的简单调度器void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { static uint8_t counter 0; if(htim htim2) { // 10ms定时器 counter; if(counter % 10 0) { // 100ms任务 UpdateSensorData(); } if(counter % 50 0) { // 500ms任务 RefreshDisplay(); } counter % 100; } }4.2 温度校准技巧通过实验发现几个提升测量精度的要点环境温度补偿先读取传感器自身温度(0x06)作为参考基准测量距离保持3-5cm距离最理想太近或太远都会影响精度发射率设置人体皮肤发射率约0.98可通过修改EEPROM参数调整校准步骤用标准体温计测量实际体温读取传感器输出值计算偏差并存储在Flash中后续测量时自动补偿4.3 可视化界面设计0.96寸OLED显示布局示例[体温筛查仪] 当前温度: 36.5°C 状态: 正常 最近5次测量: 36.3 36.6 36.4 36.5 36.7当检测到体温37.3°C时屏幕反色显示蜂鸣器发出滴滴警报声记录异常事件到EEPROM5. 项目进阶方向这个基础版本完成后还可以考虑以下扩展无线传输增加蓝牙模块将数据发送到手机APP人脸识别配合OpenMV实现自动触发测量历史统计用SD卡存储测量记录生成体温变化曲线低功耗优化改用STM32L系列续航可达1个月我在实际使用中发现用3D打印个外壳不仅能提升颜值还能固定测量距离使读数更稳定。整个项目最耗时的部分是温度校准前后用了两天时间对比不同环境下的测量结果最终实现了±0.2℃的重复精度。

更多文章