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

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

从零玩转STM32F103C8T6与SHT31温湿度传感器实战指南当你第一次拿到正点原子Mini开发板和SHT31传感器时是否曾被密密麻麻的引脚和陌生的术语吓退别担心这篇文章将用最接地气的方式带你完成从硬件连接到数据采集的全过程。不同于市面上那些只给代码不解释原理的教程我会把每个操作背后的为什么都讲清楚让你真正掌握而不是简单复制。我清楚地记得自己第一次尝试连接I2C设备时的挫败感——接线看似简单但就是读不出数据。经过多次调试才发现是上拉电阻的问题。这种坑我都会在文中特别标注帮你节省宝贵的调试时间。无论你是电子爱好者还是物联网开发者这篇指南都能让你在2小时内看到温湿度数据从串口输出的成就感。1. 硬件准备与环境搭建1.1 物料清单与引脚分配在开始前请确保准备好以下材料正点原子MiniSTM32开发板主控STM32F103C8T6SHT31温湿度传感器模块建议选择带电平转换的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请按以下步骤操作下载并安装Keil MDK-ARM最新版本安装STM32F1系列设备支持包获取正点原子标准库通常随开发板资料提供配置工程模板后续章节会详细说明# 检查ST-Link驱动是否安装成功 lsusb | grep STM2. 工程创建与基础配置2.1 新建Keil工程启动Keil MDK选择Project → New μVision Project命名为SHT31_Demo。在设备选择窗口中找到STMicroelectronics下的STM32F103C8并确认。关键配置步骤如下在Manage Run-Time Environment中勾选CMSIS → COREDevice → StartupSTM32F1xx_StdPeriph_Driver → Framework添加正点原子提供的系统文件如sys.c、delay.c等配置目标选项Target → 勾选Use MicroLIB简化串口打印Output → 勾选Create HEX FileC/C → 在Define中添加STM32F10X_MD2.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)单位%RH3.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 常见问题排查当遇到数据读取失败时建议按以下步骤检查电源问题测量VCC与GND之间是否为稳定的3.3V检查所有GND是否共地信号问题用示波器观察SCL/SDA波形确认上拉电阻通常4.7kΩ已正确连接软件问题检查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 i0; iFILTER_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的湿度读数可能会出现短暂波动。这种情况下适当增加采样间隔或采用更复杂的滤波算法会显著改善数据稳定性。

相关文章:

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

从零玩转STM32F103C8T6与SHT31温湿度传感器实战指南 当你第一次拿到正点原子Mini开发板和SHT31传感器时,是否曾被密密麻麻的引脚和陌生的术语吓退?别担心,这篇文章将用最接地气的方式,带你完成从硬件连接到数据采集的全过程。不同…...

FanControl深度解析:解锁Windows风扇控制的专业级配置哲学

FanControl深度解析:解锁Windows风扇控制的专业级配置哲学 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendin…...

别再瞎猜了!手把手教你算清FPGA Aurora IP核的用户时钟(附8B/10B编码影响)

别再瞎猜了!手把手教你算清FPGA Aurora IP核的用户时钟(附8B/10B编码影响) 当你在Xilinx Vivado中配置Aurora 8B/10B IP核时,是否曾被USER_CLK的计算问题困扰?这个看似简单的参数背后,其实隐藏着线速率、数…...

图神经网络终于能“上生产”了?SITS 2026发布首个支持实时增量训练的AI原生图引擎(附Benchmark对比:吞吐提升6.8×,延迟压至12ms)

更多请点击: https://intelliparadigm.com 第一章:AI原生图计算应用:SITS 2026图神经网络工程化方案 SITS 2026 是面向大规模动态图场景的AI原生图计算框架,深度融合GNN训练、图拓扑实时更新与边缘-云协同推理能力。其核心设计摒…...

储能出海架构重构:摒弃传统x86工控机,基于ARM边缘节点的EMS策略下沉实战

摘要: 随着储能系统在全球范围的大规模部署,出海项目的硬件BOM成本压力与恶劣环境下的维护成本日益凸显。传统的“x86工控机下发控制 透传网关上传数据”的双体架构显得极度臃肿且易引发单点故障。本文从底层研发架构师视角出发,深度拆解符合…...

《QGIS空间数据处理与高级制图》004:内置地理处理工具箱

作者:翰墨之道,毕业于国际知名大学空间信息与计算机专业,获硕士学位,现任国内时空智能领域资深专家、CSDN知名技术博主。多年来深耕地理信息与时空智能核心技术研发,精通 QGIS、GrassGIS、OSG、OsgEarth、UE、Cesium、OpenLayers、Leaflet、MapBox 等主流工具与框架,兼具…...

STK Target Sequence实战:不写一行代码,30分钟搞定卫星初始轨道参数优化

STK Target Sequence实战:不写一行代码,30分钟搞定卫星初始轨道参数优化 在航天任务规划中,轨道设计往往是项目初期最耗时的环节之一。传统方法需要工程师反复调整参数、运行仿真、分析结果,整个过程可能持续数小时甚至数天。而ST…...

CANN/GE动态输入Python构图示例

样例使用指导 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前…...

别再折腾源码编译了!Ubuntu 22.04 LTS下用apt-get一键部署Asterisk PBX(附SIP账号配置详解)

别再折腾源码编译了!Ubuntu 22.04 LTS下用apt-get一键部署Asterisk PBX(附SIP账号配置详解) 在开源通信领域,Asterisk作为功能最强大的PBX系统之一,长期困扰初学者的不是其丰富的功能,而是复杂的编译安装过…...

CANN/GE动态输入算子样例

样例使用指导 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前…...

娱乐圈天降紫微星终结乱象,海棠山铁哥终结资源咖霸屏时代

资源咖的丧钟,已鸣。 草根王的号角,已响。一、旧秩序罪状书固化霸权三宗罪现场速写1. 资源垄断霸占赛道、包揽曝光、红利通吃2. 圈层护城出身即顶流,背景即通行证3. 劣币驱逐流水线泛滥,原创被碾压,审美被带偏 “无资源…...

3天搞定中文API大全:从菜鸟到高手的完整指南

3天搞定中文API大全:从菜鸟到高手的完整指南 嘿,开发者!你是不是经常为找一个好用的API而烦恼?项目做到一半,突然发现某个API文档全是英文,看得头大?别担心,今天我要给你介绍一个超级…...

终极Visual C++运行库修复指南:一劳永逸解决Windows软件兼容性问题

终极Visual C运行库修复指南:一劳永逸解决Windows软件兼容性问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist Visual C运行库修复工具是解决Windo…...

CherryPy与数据库集成:SQLAlchemy和ORM模式详解

CherryPy与数据库集成:SQLAlchemy和ORM模式详解 【免费下载链接】cherrypy CherryPy is a pythonic, object-oriented HTTP framework. https://cherrypy.dev 项目地址: https://gitcode.com/gh_mirrors/ch/cherrypy CherryPy是一个Python风格的面向对象HTTP…...

构建 AI Agent 应用商店的构想

构建 AI Agent 应用商店的构想:从“单骑救主”的工具到“生态协同”的智能枢纽关键词 AI Agent、应用商店、多Agent协作、工具调用链、Prompt工程标准化、安全沙箱、智能分发摘要 当你在凌晨2点对着一份混乱的月度财务报表焦虑时,有没有想过:…...

5分钟掌握Typora插件:从文件管理小白到高效写作达人的3步法

5分钟掌握Typora插件:从文件管理小白到高效写作达人的3步法 【免费下载链接】typora_plugin Typora plugin. Feature enhancement tool | Typora 插件,功能增强工具 项目地址: https://gitcode.com/gh_mirrors/ty/typora_plugin 你是否曾在Typora…...

SAP销售单文本处理保姆级教程:用SAVE_TEXT和READ_TEXT BAPI搞定抬头备注

SAP销售单文本处理实战指南:从业务需求到代码实现的完整闭环 销售订单处理过程中,文本信息承载着关键业务逻辑——加急标识、特殊包装要求、客户备注等非结构化数据往往决定了后续物流和财务流程的准确性。当这些信息在流转中丢失时,轻则导致…...

告别黑盒:用Python+Wireshark抓包,手把手解析CANoe FDX协议数据交互全过程

告别黑盒:用PythonWireshark抓包,手把手解析CANoe FDX协议数据交互全过程 在汽车电子和嵌入式系统开发领域,CANoe作为主流的网络仿真与分析工具,其FDX协议提供了一种强大的跨语言数据交互能力。但对于许多开发者而言,协…...

PostgreSQL数据清洗实战:用string_agg合并地址字段,我这样整理混乱的客户信息

PostgreSQL数据清洗实战:用string_agg合并地址字段,我这样整理混乱的客户信息 客户信息表中的地址字段分散是个常见痛点。想象一下:同一客户的"省"、"市"、"详细地址"分散在不同行,导出Excel时地址…...

告别I2C的龟速:用STM32的SPI接口榨干ICM20948的性能(实测对比与配置优化)

突破传感器性能瓶颈:STM32 SPI驱动ICM20948的极致优化实践 在无人机飞控、姿态解算和高频数据采集领域,传感器接口的选择往往成为系统性能的决定性因素。当开发者面对ICM20948这款集成了三轴陀螺仪、加速度计和磁力计的9轴运动传感器时,一个关…...

拆解OpenWrt的.ipk安装包:从文件结构到手动安装,彻底搞懂opkg底层逻辑

OpenWrt软件包深度解析:从.ipk结构到手动安装全指南 1. OpenWrt软件包管理机制揭秘 对于OpenWrt用户来说,opkg命令是日常管理软件包的基础工具。但当你遇到网络连接问题无法在线安装,或者需要定制修改软件包时,理解其背后的工作机…...

SleeperX:如何彻底掌控MacBook睡眠模式,让工作流程不再被打断

SleeperX:如何彻底掌控MacBook睡眠模式,让工作流程不再被打断 【免费下载链接】SleeperX MacBook prevent idle/lid sleep! Hackintosh sleep on low battery capacity. 项目地址: https://gitcode.com/gh_mirrors/sl/SleeperX 你是否曾因MacBook…...

【仅限奇点大会注册开发者获取】:Istio for AI策略模板库(含RAG路由、推理超时分级、Token流控等12个YAML黄金配置)

更多请点击: https://intelliparadigm.com 第一章:AI原生服务网格应用:2026奇点智能技术大会Istio for AI 在2026奇点智能技术大会上,Istio社区正式发布 Istio for AI —— 一个专为大模型推理、微调与多租户AI工作负载设计的服务…...

django-flask基于python实验室资产管理系统 实验室器材租赁系统

目录基于Python的实验室资产与器材租赁管理系统(Django/Flask)摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!基于Python的实验室资产与器材租赁管理系统…...

UNet3+全解析:从结构创新到医学图像分割实战

1. UNet3为什么能成为医学图像分割的新标杆? 第一次看到UNet3的论文时,我正被一个肝脏CT分割项目折磨得焦头烂额。当时试过UNet、UNet、Attention UNet等各种变体,但总在一些微小病灶的边界分割上差强人意。直到把UNet3的代码跑起来&#xff…...

构建企业级日志监控:免费Syslog服务器部署方案

构建企业级日志监控:免费Syslog服务器部署方案 【免费下载链接】visualsyslog Syslog Server for Windows with a graphical user interface 项目地址: https://gitcode.com/gh_mirrors/vi/visualsyslog 在分布式系统架构中,网络设备、服务器和应…...

Python爬虫实战:手把手教你如何采集开源许可证 FAQ 文章归档!

㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~ ㊙️本期爬虫难度指数:⭐⭐ (中级) 🉐福利: 一次订阅后,专栏内的所有文章…...

从.axf到.bin:ARM Compiler 6.14链接与格式转换的隐藏细节(Keil MDK实战)

从.axf到.bin:ARM Compiler 6.14链接与格式转换的隐藏细节(Keil MDK实战) 当你在Keil MDK中点击"Build"按钮时,背后发生的远不止简单的代码翻译。对于使用STM32的嵌入式工程师而言,理解从源代码到最终烧录文…...

51单片机LCD12864显示中文,别再傻傻用字库了!手把手教你自定义取模显示任意汉字

51单片机LCD12864深度定制:从零实现任意汉字点阵显示的艺术 在嵌入式开发领域,LCD12864液晶屏因其性价比高、接口简单而广受欢迎。但当我们需要显示公司Logo、特殊符号或艺术字体时,标准中文字库的局限性就暴露无遗。本文将彻底打破这种限制&…...

PARD-SSM:基于概率状态空间模型的多阶段网络攻击检测

1. 项目概述在网络安全领域,传统的入侵检测系统(IDS)面临着多阶段攻击检测的严峻挑战。攻击者通常会按照"攻击链"(Kill Chain)的步骤逐步渗透系统,从最初的侦察阶段到最终的数据窃取,每个阶段的网络流量特征可能单独看起来都像是正…...