news 2026/4/16 14:34:08

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/4/16 10:13:41

【Java毕设全套源码+文档】基于springboot的高校“智慧党建”管理系统的设计与实现(丰富项目+远程调试+讲解+定制)

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

作者头像 李华
网站建设 2026/4/16 11:58:43

用sticky定位5分钟打造阅读目录导航

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速开发一个文章目录导航组件原型。功能要求&#xff1a;1. 左侧显示带标题层级的目录树 2. 右侧显示长篇文章内容(h2-h4标题结构) 3. 滚动时左侧目录自动高亮当前阅读章节 4. 点击…

作者头像 李华
网站建设 2026/4/16 4:10:52

5分钟验证:云端PDF打印解决方案原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 构建一个云端PDF打印服务原型&#xff0c;用户无需安装本地驱动即可通过网页生成PDF。要求包含文件上传接口、云端打印队列管理、PDF生成引擎和下载功能。前端使用响应式设计&#…

作者头像 李华
网站建设 2026/4/15 13:33:59

基本布局(layout)

总目录 布局就是layout文件中的一种标签&#xff0c;定义了一个容器。不同的布局有不同的特性。 1. LinearLayout&#xff08;线性布局&#xff09; 线性布局是一种顺序布局&#xff0c;是一个从上到下或从左到右的布局。 <?xml version"1.0" encoding"utf-…

作者头像 李华
网站建设 2026/4/16 9:05:27

Flink学习笔记:如何做容错

现在我们已经了解了 Flink 的状态如何定义和使用&#xff0c;那 Flink 是如何做容错的呢&#xff1f;今天我们一起来了解一下。 先来回答问题&#xff0c; Flink 是通过状态快照来做容错的&#xff0c;在 Flink 中状态快照分为 Checkpoint 和 Savepoint 两种。 Checkpoint Chec…

作者头像 李华