news 2026/3/24 8:30:14

STM32 驱动 MAX30205 人体温度传感器 + OLED 显示教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32 驱动 MAX30205 人体温度传感器 + OLED 显示教程

目录

一、硬件准备与原理说明

1. 硬件清单

2. 核心原理

(1)MAX30205 传感器核心特点与原理

(2)OLED 显示原理

二、硬件接线

1. MAX30205 引脚说明

2. 整体接线表(STM32F103C8T6)

三、软件准备

1. 开发环境

四、代码编写

1. 导入 OLED 驱动代码

2. 编写 MAX30205 驱动代码

1.max30205.c(部分)

2.max30205.h

3.oled.c(部分)

4.oled.h

五、下载与测试

1. 编译代码

2. 下载程序

3. 测试效果

六、常见问题解决

1. OLED 屏幕无显示

2. MAX30205 初始化失败(程序卡死)

3. 温度值显示异常(如 0℃或固定值)

4. 温度值波动过大


本文将详细讲解如何使用 STM32 单片机驱动MAX30205人体温度传感器(高精度、I2C 接口),并将采集到的人体温度数据实时显示在 0.96 寸 I2C OLED 屏幕上。教程采用STM32F103C8T6最小系统板,代码基于 HAL 库开发,步骤清晰、代码可直接复用,适合新手学习和项目开发。

一、硬件准备与原理说明

1. 硬件清单

器件数量备注
STM32F103C8T6 最小系统板1核心控制单元
MAX30205 温度传感器模块1人体温度检测,I2C 接口
0.96 寸 I2C 接口 OLED 屏1分辨率 128*64,SSD1306 驱动
杜邦线若干连接电路
5V 电源 / USB 数据线1给开发板供电
杜邦线若干电路连接

2. 核心原理

(1)MAX30205 传感器核心特点与原理

MAX30205 是一款数字式人体温度传感器,专为医疗级体温检测设计,核心特点如下:

  • 通信接口:I2C(两线串行通信),支持标准 / 快速模式(100kHz/400kHz)。
  • 测量精度:±0.1℃(30℃~42℃,人体温度核心区间),满足医疗级需求。
  • 测量范围:0℃~50℃,覆盖人体温度范围(36℃~37.5℃)。
  • 数据输出:16 位数字量,直接转换为温度值(无需 ADC 采集,比模拟传感器更精准)。
  • 地址配置:通过引脚ADDR可配置 I2C 地址(默认 7 位地址为0x48)。

MAX30205 的温度数据存储在 ** 温度寄存器(0x00)** 中,读取该寄存器的 16 位数据后,通过公式即可转换为实际温度值(单位:℃)。

(2)OLED 显示原理

0.96 寸 OLED 屏采用 SSD1306 驱动芯片,通过 I2C 接口与 STM32 通信,接收 STM32 发送的字符 / 数字数据后,在屏幕上显示。由于 MAX30205 和 OLED 均为 I2C 设备,可共用 STM32 的同一个 I2C 外设(两者 I2C 地址不同,不会冲突)。

二、硬件接线

1. MAX30205 引脚说明

MAX30205 模块的核心引脚:

  • VCC:供电(3.3V,推荐,与 STM32 电平匹配)
  • GND:接地
  • SCL:I2C 时钟线
  • SDA:I2C 数据线

2. 整体接线表(STM32F103C8T6)

设备引脚STM32 引脚说明
MAX30205-VCC3.3V传感器供电
MAX30205-GNDGND共地
MAX30205-SCLPA1时钟线
MAX30205-SDAPA0数据线
MAX30205-OS-悬空(暂不使用)
MAX30205-AO-悬空(暂不使用)
MAX30205-AX-悬空(暂不使用)
OLED-VCC3.3V屏幕供电
OLED-GNDGND共地
OLED-SCLPB6I2C1 时钟线
OLED-SDAPB7I2C1 数据线

注意事项:

  1. 务必保证所有设备共地,否则 I2C 通信会出现乱码或失败。
  2. 若 OLED 屏为 5V 供电,需在 SCL/SDA 引脚添加电平转换模块(如 PC817),避免 3.3V 的 STM32 引脚被 5V 电压损坏。

三、软件准备

1. 开发环境

  • STM32CubeMX:用于配置 STM32 外设,自动生成初始化代码。
  • Keil MDK-ARM:用于编写、编译代码,下载程序到 STM32。
  • ST-Link 调试器(或 USB 转串口):用于程序下载与调试。

四、代码编写

1. 导入 OLED 驱动代码

0.96 寸 I2C OLED 的驱动基于 SSD1306 芯片,需导入成熟的驱动文件:

  1. 在 Keil 工程的Src目录下新建oled.cInc目录下新建oled.h
  2. 将 SSD1306 的 I2C 驱动代码复制到这两个文件中(核心功能:OLED 初始化、清屏、显示字符 / 字符串 / 数字)。

关键提示:OLED 的 I2C 地址默认是0x78(7 位地址左移一位为 0xF0),若屏幕无显示,可尝试修改为0x7A

2. 编写 MAX30205 驱动代码

新建max30205.c(Src 目录)和max30205.h(Inc 目录),用于实现 MAX30205 的 I2C 通信和温度读取功能。

1.max30205.c(部分)
// 读取温度数据 void MAX30205_ReadTemp(void) { uint8_t temp_h, temp_l; int16_t raw; MAX30205_I2C_Start(); MAX30205_I2C_SendByte(MAX30205_ADDR_W); if(MAX30205_I2C_WaitAck()) { MAX30205_I2C_Stop(); return; } MAX30205_I2C_SendByte(REG_TEMP); if(MAX30205_I2C_WaitAck()) { MAX30205_I2C_Stop(); return; } MAX30205_I2C_Start(); MAX30205_I2C_SendByte(MAX30205_ADDR_R); if(MAX30205_I2C_WaitAck()) { MAX30205_I2C_Stop(); return; } temp_h = MAX30205_I2C_ReadByte(0); // 高字节(应答) temp_l = MAX30205_I2C_ReadByte(1); // 低字节(非应答) MAX30205_I2C_Stop(); raw = (temp_h << 8) | temp_l; MAX30205_Temp = MAX30205_Convert(raw); MAX30205_DataReady = 1; }
2.max30205.h
/** **************************************************************************************************** * @file max30205.h * @author 送外卖的工程师 * @version V1.0 * @date 2025-12-14 * @brief 人体温度传感器驱动代码 **************************************************************************************************** * @attention * * 实验平台:STM32F103C8T6 * CSDN:送外卖的工程师 * 技术指导VX:wmz14026 * 淘宝店铺:小马科技 * 闲鱼店铺:送外卖的工程师 * * 修改说明 * V1.0.0.251214 * 第一次发布 * 注:长期接各种项目设计,提供仿真、实物、原理图、PCB、代码工程、后期指导、操作视频、 说明文档、各种报告、后期指导等。 **************************************************************************************************** */ #ifndef __MAX30205_H #define __MAX30205_H #include "main.h" //SCL引脚 #define MAX30205_SCL_Pin GPIO_PIN_1 #define MAX30205_SCL_GPIO_Port GPIOA //SDA引脚 #define MAX30205_SDA_Pin GPIO_PIN_0 #define MAX30205_SDA_GPIO_Port GPIOA #define MAX30205_SDA_H HAL_GPIO_WritePin(MAX30205_SDA_GPIO_Port, MAX30205_SDA_Pin,GPIO_PIN_SET) #define MAX30205_SDA_L HAL_GPIO_WritePin(MAX30205_SDA_GPIO_Port, MAX30205_SDA_Pin,GPIO_PIN_RESET) #define MAX30205_SCL_H HAL_GPIO_WritePin(MAX30205_SCL_GPIO_Port, MAX30205_SCL_Pin,GPIO_PIN_SET) #define MAX30205_SCL_L HAL_GPIO_WritePin(MAX30205_SCL_GPIO_Port, MAX30205_SCL_Pin,GPIO_PIN_RESET) #define MAX30205_SDA HAL_GPIO_ReadPin(MAX30205_SDA_GPIO_Port,MAX30205_SDA_Pin) // MAX30205寄存器地址 #define MAX30205_ADDR_W 0x90 // 写地址(7位地址0x48 << 1) #define MAX30205_ADDR_R 0x91 // 读地址(7位地址0x48 << 1 + 1) #define REG_TEMP 0x00 // 温度寄存器(16位) #define REG_CONFIG 0x01 // 配置寄存器 // 全局变量 extern float MAX30205_Temp; // 温度值(℃) extern uint8_t MAX30205_DataReady; // 数据就绪标志 // 函数声明 void MAX30205_I2C_Start(void); void MAX30205_I2C_Stop(void); void MAX30205_I2C_Ack(uint8_t ack); uint8_t MAX30205_I2C_WaitAck(void); void MAX30205_I2C_SendByte(uint8_t dat); uint8_t MAX30205_I2C_ReadByte(uint8_t ack); void MAX30205_WriteReg(uint8_t reg, uint8_t dat); void MAX30205_ReadTemp(void); void MAX30205_Init(void); float MAX30205_Convert(int16_t raw); #endif
3.oled.c(部分)
/** * @brief OLED显示字符串 * @param Line 行位置 * @param Column 列位置 * @param Fontsize 字体大小 * @param String 显示字符串, * @retval 无 */ #include <string.h> void OLED_ShowString(uint8_t Line, uint8_t Column, uint16_t Fontsize, const char* String) { uint8_t i, len; len = strlen(String); for(i=0; i<len; i++) { switch(Fontsize) { case 8:OLED_ShowChar(Line, Column+i*6, Fontsize, String[i]); break; case 16:OLED_ShowChar(Line, Column+i*8, Fontsize, String[i]); break; case 24:OLED_ShowChar(Line, Column+i*12, Fontsize, String[i]); break; } } }
4.oled.h
/** **************************************************************************************************** * @file oled.h * @author 送外卖的工程师 * @version V1.0 * @date 2025-11-23 * @brief 0.96寸 4针OLED驱动代码 **************************************************************************************************** * @attention * * 实验平台:STM32F103C8T6 * CSDN:送外卖的工程师 * 技术指导VX:wmz14026 * 淘宝店铺:小马科技 * 闲鱼店铺:送外卖的工程师 * * 修改说明 * V1.0.0.251123 * 第一次发布 * 注:长期接各种项目设计,提供仿真、实物、原理图、PCB、代码工程、后期指导、操作视频、 说明文档、各种报告、后期指导等。 **************************************************************************************************** */ #ifndef _OLED_H_ #define _OLED_H_ #include "stm32f1xx_hal.h" //SCL引脚 #define OLED_SCL_Pin GPIO_PIN_6 #define OLED_SCL_GPIO_Port GPIOB //SDA引脚 #define OLED_SDA_Pin GPIO_PIN_7 #define OLED_SDA_GPIO_Port GPIOB #define IIC_W_SCL(x) HAL_GPIO_WritePin(GPIOB, OLED_SCL_Pin,(GPIO_PinState)(x)) #define IIC_W_SDA(x) HAL_GPIO_WritePin(GPIOB, OLED_SDA_Pin,(GPIO_PinState)(x)) #define IIC_R_SDA() HAL_GPIO_ReadPin(GPIOB, OLED_SDA_Pin) void OLED_Write_Command(uint8_t Command); void OLED_Write_Data(uint8_t Data); void OLED_Init(void); void OLED_Clear(void); void OLED_Test(void); void OLED_SetCursor(uint8_t Y, uint8_t X); #endif

五、下载与测试

1. 编译代码

  1. 在 Keil 中点击Build(编译)或Rebuild(重新编译),确保代码无错误。
  2. 若出现浮点数相关错误,检查是否开启Use MicroLIB

2. 下载程序

  1. 将 ST-Link 调试器连接到 STM32 的 SWD 接口(SWDIO、SWCLK、GND)。
  2. 在 Keil 中点击Download(下载),将程序烧录到 STM32 中。

3. 测试效果

  1. 给 STM32 供电,OLED 屏幕会显示标题和初始温度值。
  2. 将 MAX30205 传感器的感应面贴在手指或额头处,等待 1~2 秒,OLED 上的温度值会逐渐稳定到人体温度(36℃~37.5℃)。
  3. 若温度值无变化,检查传感器与 STM32 的接线是否松动。

六、常见问题解决

1. OLED 屏幕无显示

  • 检查 OLED 的 VCC/GND 是否接对,确保 3.3V 供电正常。
  • 确认 OLED 的 I2C 地址是否为0x78(可改为0x7A重试)。
  • 检查 SCL/SDA 引脚是否接反(PB6=SCL,PB7=SDA)。

2. MAX30205 初始化失败(程序卡死)

  • 检查传感器的 VCC/GND 是否接对,确保 3.3V 供电。
  • 确认MAX30205_ADDR是否与硬件配置一致。
  • 检查 I2C 引脚(PB6/PB7)是否虚焊或接反。

3. 温度值显示异常(如 0℃或固定值)

  • 确保传感器的感应面清洁,无异物遮挡。
  • 检查读温度函数中的数据读取顺序(先读高 8 位,后读低 8 位)。
  • 尝试增加 I2C 读取的超时时间(如将100改为500)。

4. 温度值波动过大

  • 减少延时时间(如改为 200ms),或多次读取取平均值(如读取 5 次取平均)。
  • 将传感器贴紧皮肤,避免空气流动影响测温精度。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/12 22:39:04

【Java毕设全套源码+文档】基于springboot的甘肃旅游管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/19 1:04:08

【Java毕设全套源码+文档】基于springboot的高校本科生学习成长记录系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/22 14:49:16

如何选择分布式事务模式:从技术原理到实践决策

如何选择分布式事务模式&#xff1a;从技术原理到实践决策 【免费下载链接】school-of-sre linkedin/school-of-sre: 这是一个用于培训软件可靠性工程师&#xff08;SRE&#xff09;的在线课程。适合用于需要学习软件可靠性工程和运维技能的场景。特点&#xff1a;内容丰富&…

作者头像 李华
网站建设 2026/3/23 16:24:04

基于vue的健身房系统的设计与实现_nhj67au7_springboot php python nodejs

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/3/24 5:42:13

2025年夸克网盘不限速教程:速度可达70MB/s实测有效

2025年12月最新今天教大家一招能解决夸克网盘限制的在线工具。这个工具也是完全免费使用的。下面让大家看看我用这个工具的下载速度咋样。地址获取&#xff1a;放在这里了&#xff0c;可以直接获取 这个速度还是不错的把。对于平常不怎么下载的用户还是很友好的。下面开始今天的…

作者头像 李华