目录
一、硬件准备与原理说明
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-VCC | 3.3V | 传感器供电 |
| MAX30205-GND | GND | 共地 |
| MAX30205-SCL | PA1 | 时钟线 |
| MAX30205-SDA | PA0 | 数据线 |
| MAX30205-OS | - | 悬空(暂不使用) |
| MAX30205-AO | - | 悬空(暂不使用) |
| MAX30205-AX | - | 悬空(暂不使用) |
| OLED-VCC | 3.3V | 屏幕供电 |
| OLED-GND | GND | 共地 |
| OLED-SCL | PB6 | I2C1 时钟线 |
| OLED-SDA | PB7 | I2C1 数据线 |
注意事项:
- 务必保证所有设备共地,否则 I2C 通信会出现乱码或失败。
- 若 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 芯片,需导入成熟的驱动文件:
- 在 Keil 工程的
Src目录下新建oled.c,Inc目录下新建oled.h。 将 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); #endif3.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. 编译代码
- 在 Keil 中点击
Build(编译)或Rebuild(重新编译),确保代码无错误。 - 若出现浮点数相关错误,检查是否开启
Use MicroLIB。
2. 下载程序
- 将 ST-Link 调试器连接到 STM32 的 SWD 接口(SWDIO、SWCLK、GND)。
- 在 Keil 中点击
Download(下载),将程序烧录到 STM32 中。
3. 测试效果
- 给 STM32 供电,OLED 屏幕会显示标题和初始温度值。
- 将 MAX30205 传感器的感应面贴在手指或额头处,等待 1~2 秒,OLED 上的温度值会逐渐稳定到人体温度(36℃~37.5℃)。
- 若温度值无变化,检查传感器与 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 次取平均)。
- 将传感器贴紧皮肤,避免空气流动影响测温精度。