当前位置: 首页 > news >正文

手把手教你用STM32F103C8T6(正点原子mini板)驱动SHT31温湿度传感器(附完整工程)

从零玩转STM32F103C8T6与SHT31温湿度传感器实战指南

当你第一次拿到正点原子Mini开发板和SHT31传感器时,是否曾被密密麻麻的引脚和陌生的术语吓退?别担心,这篇文章将用最接地气的方式,带你完成从硬件连接到数据采集的全过程。不同于市面上那些只给代码不解释原理的教程,我会把每个操作背后的"为什么"都讲清楚,让你真正掌握而不是简单复制。

我清楚地记得自己第一次尝试连接I2C设备时的挫败感——接线看似简单,但就是读不出数据。经过多次调试才发现是上拉电阻的问题。这种"坑"我都会在文中特别标注,帮你节省宝贵的调试时间。无论你是电子爱好者还是物联网开发者,这篇指南都能让你在2小时内看到温湿度数据从串口输出的成就感。

1. 硬件准备与环境搭建

1.1 物料清单与引脚分配

在开始前,请确保准备好以下材料:

  • 正点原子MiniSTM32开发板(主控STM32F103C8T6)
  • SHT31温湿度传感器模块(建议选择带电平转换的3.3V版本)
  • 杜邦线若干(建议使用不同颜色区分功能)
  • USB转TTL串口模块(用于调试输出)
  • Keil MDK开发环境(已安装STM32支持包)

注意:市面上SHT31模块有5V和3.3V两种版本,务必确认你的模块支持3.3V电平,否则可能损坏STM32芯片。

SHT31与STM32的连接关系如下表所示:

SHT31引脚STM32引脚功能说明
VCC3.3V电源正极
GNDGND电源地
SCLPC12I2C时钟线
SDAPC11I2C数据线

1.2 开发环境配置

如果你尚未安装Keil MDK,请按以下步骤操作:

  1. 下载并安装Keil MDK-ARM最新版本
  2. 安装STM32F1系列设备支持包
  3. 获取正点原子标准库(通常随开发板资料提供)
  4. 配置工程模板(后续章节会详细说明)
# 检查ST-Link驱动是否安装成功 lsusb | grep STM

2. 工程创建与基础配置

2.1 新建Keil工程

启动Keil MDK,选择Project → New μVision Project,命名为"SHT31_Demo"。在设备选择窗口中,找到"STMicroelectronics"下的"STM32F103C8"并确认。

关键配置步骤如下:

  1. 在"Manage Run-Time Environment"中勾选:

    • CMSIS → CORE
    • Device → Startup
    • STM32F1xx_StdPeriph_Driver → Framework
  2. 添加正点原子提供的系统文件(如sys.c、delay.c等)

  3. 配置目标选项:

    • Target → 勾选"Use MicroLIB"(简化串口打印)
    • Output → 勾选"Create HEX File"
    • C/C++ → 在"Define"中添加"STM32F10X_MD"

2.2 I2C外设初始化

i2c.c中添加以下初始化代码:

#include "stm32f10x.h" void I2C_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE); // 配置PC11(SDA), PC12(SCL)为复用开漏输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); // I2C参数配置 I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x00; // 主机模式设为0 I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; // 100kHz标准模式 I2C_Init(I2C2, &I2C_InitStructure); I2C_Cmd(I2C2, ENABLE); }

3. SHT31驱动实现

3.1 传感器通信协议解析

SHT31采用标准I2C协议,设备地址有0x44和0x45两种(由ADDR引脚决定)。常用命令包括:

  • 单次测量高精度模式:0x2C06
  • 单次测量中精度模式:0x2C0D
  • 单次测量低精度模式:0x2C10
  • 读取状态寄存器:0xF32D

数据格式为:

  • 温度:(175 * raw_value / 65535) - 45(单位℃)
  • 湿度:(100 * raw_value / 65535)(单位%RH)

3.2 核心驱动函数编写

sht31.c中实现以下关键函数:

#define SHT31_ADDR 0x44 // 默认I2C地址 uint8_t SHT31_ReadStatus(void) { uint8_t cmd[2] = {0xF3, 0x2D}; uint8_t status[2]; I2C_WriteBytes(I2C2, SHT31_ADDR, cmd, 2); I2C_ReadBytes(I2C2, SHT31_ADDR, status, 2); return (status[0] << 8) | status[1]; } void SHT31_StartMeasurement(void) { uint8_t cmd[2] = {0x2C, 0x06}; // 高精度模式 I2C_WriteBytes(I2C2, SHT31_ADDR, cmd, 2); delay_ms(20); // 等待测量完成 }

3.3 数据读取与处理

实现温湿度数据读取函数:

typedef struct { float temperature; float humidity; } SHT31_Data; SHT31_Data SHT31_ReadData(void) { uint8_t data[6]; uint16_t temp_raw, humi_raw; SHT31_Data result; // 读取6字节数据(温度高/低/CRC,湿度高/低/CRC) I2C_ReadBytes(I2C2, SHT31_ADDR, data, 6); // 跳过CRC校验(实际产品中建议实现) temp_raw = (data[0] << 8) | data[1]; humi_raw = (data[3] << 8) | data[4]; // 数据转换 result.temperature = (175.0f * temp_raw / 65535.0f) - 45.0f; result.humidity = 100.0f * humi_raw / 65535.0f; return result; }

4. 系统集成与调试

4.1 主程序逻辑实现

main.c中构建主循环:

#include "stdio.h" #include "sht31.h" int main(void) { SHT31_Data sensor_data; // 初始化系统时钟、延时、串口、I2C等 SystemInit(); delay_init(); USART1_Init(115200); I2C_Configuration(); printf("SHT31 Demo Start\r\n"); while(1) { SHT31_StartMeasurement(); sensor_data = SHT31_ReadData(); printf("Temp: %.2fC, Humi: %.2f%%\r\n", sensor_data.temperature, sensor_data.humidity); delay_ms(2000); // 每2秒采集一次 } }

4.2 常见问题排查

当遇到数据读取失败时,建议按以下步骤检查:

  1. 电源问题

    • 测量VCC与GND之间是否为稳定的3.3V
    • 检查所有GND是否共地
  2. 信号问题

    • 用示波器观察SCL/SDA波形
    • 确认上拉电阻(通常4.7kΩ)已正确连接
  3. 软件问题

    • 检查I2C时钟配置是否正确
    • 验证设备地址是否匹配硬件设置
    • 确保时序符合SHT31规格书要求

提示:如果使用杜邦线连接,尽量缩短线长(<20cm),过长可能导致信号完整性问题。

5. 进阶优化与扩展

5.1 低功耗设计

对于电池供电应用,可以启用SHT31的周期性测量模式:

void SHT31_StartPeriodicMeasurement(uint8_t mps) { uint8_t cmd[2]; // mps: 测量每秒次数 (0.5,1,2,4,10) switch(mps) { case 10: cmd[0]=0x27; cmd[1]=0x37; break; case 4: cmd[0]=0x22; cmd[1]=0x36; break; case 2: cmd[0]=0x21; cmd[1]=0x30; break; case 1: cmd[0]=0x20; cmd[1]=0x32; break; default: cmd[0]=0x20; cmd[1]=0x2F; // 0.5mps } I2C_WriteBytes(I2C2, SHT31_ADDR, cmd, 2); }

5.2 数据校准与滤波

在实际环境中,可以添加简单的滑动平均滤波:

#define FILTER_SIZE 5 typedef struct { float buffer[FILTER_SIZE]; uint8_t index; } Filter; float filter_AddValue(Filter* f, float value) { f->buffer[f->index] = value; f->index = (f->index + 1) % FILTER_SIZE; float sum = 0; for(int i=0; i<FILTER_SIZE; i++) { sum += f->buffer[i]; } return sum / FILTER_SIZE; }

5.3 多传感器组网

通过修改I2C地址,可以连接多个SHT31传感器:

void SHT31_SetAddress(uint8_t addr_pin_state) { // addr_pin_state: 0=接地(0x44), 1=接VCC(0x45) global_sht31_addr = addr_pin_state ? 0x45 : 0x44; }

最后分享一个实际项目中的经验:当环境温度变化剧烈时,SHT31的湿度读数可能会出现短暂波动。这种情况下,适当增加采样间隔或采用更复杂的滤波算法会显著改善数据稳定性。

http://www.jsqmd.com/news/795946/

相关文章:

  • Gadfly.jl自定义几何元素开发:轻松扩展图形语法功能的完整指南
  • 120MHz Cortex-M3+150DMIPS+ART加速器:STM32F205RBT6的性能参数解析
  • 江苏B端营销变局:GEO时代来临,为何“本土化”服务商正取代“通用型”巨头? - 资讯焦点
  • Origin Pro 2023 保姆级教程:从数据导入到论文配图,手把手教你搞定科研绘图
  • 《QGIS空间数据处理与高级制图》004:内置地理处理工具箱
  • 别再手动改模型名了!用LaTeX的\newcommand命令,5分钟搞定论文变量定义
  • AD域组策略更新报错8007071a?手把手教你用防火墙规则搞定Win7/Win10远程RPC
  • Chapter核心功能深度解析:从章节管理到活动策划的全流程教程
  • 2026培训系统怎么选?选型指南全解析 - 资讯焦点
  • 当点云遇上核技巧:一文搞懂K-PCA为何能处理非线性数据(附Sklearn对比实验)
  • CANN/ops-nn RMS归一化动态量化算子
  • 终极解决方案:如何用VisualCppRedist AIO一键修复Windows运行库问题
  • 2026年上海厨房卫生间改造哪家好?最新权威TOP5实测推荐 - 资讯焦点
  • Sherpa-Onnx:跨平台离线语音处理技术的革命性突破
  • 别再只用split了!Python字符串转列表的3种实战场景与性能对比(含LeetCode真题)
  • 储能出海架构重构:摒弃传统x86工控机,基于ARM边缘节点的EMS策略下沉实战
  • CAN总线终端电阻:从120Ω与0.25W的选型,看信号完整性与系统鲁棒性设计
  • 3分钟掌握Windows界面自定义神器:让你的桌面焕然一新
  • m4s-converter:B站缓存视频转换终极指南,快速实现m4s到MP4的无损转换
  • CANN/GE AIPP内存获取API
  • 图神经网络终于能“上生产”了?SITS 2026发布首个支持实时增量训练的AI原生图引擎(附Benchmark对比:吞吐提升6.8×,延迟压至12ms)
  • 娱乐圈天降紫微星终结乱象,海棠山铁哥终结资源咖霸屏时代
  • 5分钟搞定!iperf3 Windows版:专业网络性能测试工具完全指南
  • DSU-Sideloader核心架构解析:深入理解Android动态系统更新的实现原理
  • 别再只用翻转和裁剪了!盘点CV项目中那些真正提升模型泛化能力的数据增强技巧(附PyTorch代码)
  • 英雄联盟本地智能助手:LeagueAkari的完整使用指南
  • 【审计专利】15审计系列之偷税漏税
  • 别再瞎猜了!手把手教你算清FPGA Aurora IP核的用户时钟(附8B/10B编码影响)
  • 别只盯着4K:用Topaz Video Enhance AI修复模糊视频,实测不同AI模型(Artemis vs. Theia)效果差异
  • 暗黑破坏神2存档编辑器终极指南:5分钟学会免费Web工具