首页/新闻资讯/正文详情

STM32F103C8T6多传感器采集:DHT11+SGP30+ADC+CH340串口上传实战

发布时间:2026/11/4 18:22:38 来源:云帆数科 栏目:资讯中心
STM32F103C8T6多传感器采集:DHT11+SGP30+ADC+CH340串口上传实战
简介面向嵌入式入门与传感器采集实践者的一套STM32环境监测工程源码围绕STM32F103C8T6主控整合DHT11温湿度、SGP30空气质量传感器与CH340 USB转串口重点演示内置ADC模拟信号读取、USART串口收发及引脚接线与函数功能说明适合想打通「传感器采集—模数转换—串口上传」完整链路的读者对照学习。压缩包为rar格式共211个文件、约5.36MB以37个c源文件与40个h头文件构成工程主体辅以Keil编译产生的o、d、crf等中间文件及axf、hex固件、uvprojx工程文件另含少量txt与htm说明文档目录结构便于按外设模块检索。资源已有2152人学习下载可作为环境数据采集类课程设计或小型项目的参考底稿帮助读者理解ADC通道配置、串口初始化与传感器数据解析的具体实现思路。1. 从一块最小系统板说起这套多传感器采集方案到底解决什么问题手上只有一块 STM32F103C8T6 最小系统板却要同时接 DHT11 温湿度、SGP30 空气质量、还要把数据通过 CH340 串口送到上位机顺带用 ADC 采一路模拟量——这是很多毕设和课设里最典型的一类需求多传感器融合采集 串口上传。难点不在单个传感器而在于时序冲突、供电噪声、串口丢包这三件事同时出现。这套方案就是围绕 C8T6 的资源和外设把 DHT11 单总线、SGP30 的 I2C、ADC 采样和 CH340 串口收发整合成一条稳定的数据链路适合做环境监测类毕设、嵌入式课程设计也适合作为从业者快速搭原型的参考骨架。2. 需求拆解与器件选型为什么是这四个外设凑在一起2.1 先把需求翻译成资源账本拿到题目别急着画原理图先算资源。C8T6 是 48 脚、64KB Flash、20KB RAM外设够用但不富裕。这套方案要同时跑四件事DHT11 单总线读温湿度、SGP30 走 I2C 读 TVOC 和 CO2 等效值、ADC 采一路模拟电压、CH340 走 USART 把数据打包上传。我一般会先列一张资源占用表把每个外设绑到哪个引脚、用哪个定时器、占多少 RAM 先定死后面写代码才不会互相抢资源。功能外设引脚关键约束DHT11 温湿度GPIO 模拟单总线PA0时序微秒级需关中断保护SGP30 空气质量I2C1PB6/PB7上电需预热与基线校准模拟量采集ADC1_IN1PA112 位需稳定参考电压串口上传USART1 CH340PA9/PA10波特率 115200DMA 发送这张表的价值在于它逼你提前想清楚 PA0 做单总线时不能被别的中断打断太久PA1 做 ADC 时别和别的模拟信号串扰USART1 的 TX/RX 正好接 CH340 的 RXD/TXD注意是交叉接。选型上 CH340 而不是别的 USB 转串口是因为它在 Windows 下驱动成熟、成本低学生党手里现成的模块多血泪经验是别贪便宜买没晶振的 CH340 模块波特率一高就翻车。2.2 供电与电平最容易被忽略的一层DHT11 和 SGP30 都是 3.3V 器件C8T6 也是 3.3V看似直接连就行。但 SGP30 的峰值电流和 DHT11 的瞬态电流叠加时如果从板载 LDO 取电ADC 的参考电压会被拉低采出来的值飘。通常的做法是给传感器单独一路 3.3V或者在 VDD 和 GND 之间就近加 100nF 10uF 去耦ADC 参考脚单独滤波。这一层不写进代码但决定了你后面调 ADC 时是不是一直在跟玄学噪声搏斗。3. 总体架构设计主循环调度与四个模块的职责划分3.1 分层结构驱动层、调度层、通信层整套固件我习惯分三层。驱动层只负责“把某个传感器读出来”DHT11 驱动、SGP30 驱动、ADC 驱动各自独立对外只暴露一个读取函数调度层是主循环里的时间片决定谁多久读一次通信层负责把数据打包成帧通过 USART1 DMA 发出去。这样分层的好处是DHT11 时序出问题时只动驱动层串口丢包时只查通信层不会牵一发动全身。主循环的节奏大致是DHT11 每 2 秒读一次它本身采样率就低读太快没意义SGP30 每 1 秒读一次ADC 每 100ms 采一次做滑动平均串口每 500ms 打包上传一次。用 SysTick 做一个毫秒计数主循环里比对时间戳决定谁该干活不用 RTOS 也能跑得很稳。3.2 数据帧格式先定协议再写代码上传帧我一般定成定长二进制帧而不是直接 printf 字符串。原因很简单字符串解析在上位机端容易因为半包、粘包出错二进制帧带帧头帧尾和校验解析逻辑清晰。下面这个结构体就是通信层的核心/* 上传帧结构帧头 0xAA55 数据 校验 帧尾 0x0D0A */ typedef struct { uint16_t header; /* 固定 0xAA55用于帧同步 */ uint16_t temp; /* DHT11 温度放大 10 倍存整数如 253 表示 25.3℃ */ uint16_t humi; /* DHT11 湿度放大 10 倍 */ uint16_t tvoc; /* SGP30 TVOC单位 ppb */ uint16_t eco2; /* SGP30 CO2 等效值单位 ppm */ uint16_t adc_val; /* ADC 原始值 0~4095 */ uint8_t checksum; /* 前面所有字节累加和取低 8 位 */ uint16_t tail; /* 固定 0x0D0A */ } SensorFrame_t;字段设计上有两个细节值得说。温度和湿度放大 10 倍存整数是为了避免在 MCU 上做浮点运算和格式化上位机收到后除以 10 即可省 Flash 也省时间。校验用累加和而不是 CRC是因为这个场景数据量小、信道短累加和足够发现传输错误实现成本低。帧尾用 0x0D0A 是为了和文本调试工具兼容用串口助手看的时候能直观看到换行边界。3.3 中断与 DMA 的分工USART1 发送用 DMA避免每发一个字节进一次中断拖慢主循环接收端如果只是单向上传可以不开接收中断留出中断资源给 DHT11 的时序保护。DHT11 读的时候要关全局中断几十微秒这个窗口里如果 USART 正在收数据会丢字节——所以设计上让上传和读取错开或者干脆只做单向发送把复杂度降下来。这是架构阶段就要拍板的事等代码写完再改代价很大。4. 关键模块实现DHT11 时序、SGP30 校准与 ADC 滤波4.1 DHT11 单总线微秒级时序是命门DHT11 的坑几乎全在时序上。主机拉低至少 18ms 作为起始信号然后释放总线DHT11 回应 80us 低 80us 高之后每位数据用 50us 低电平加高电平长短区分 0 和 1。C8T6 跑 72MHz一个微秒延时用循环实现就够但必须保证读的时候不被中断打断。下面是我常用的读取骨架/* DHT11 读一个字节每位先等 50us 低电平结束再测高电平持续时间 */ static uint8_t DHT11_ReadByte(void) { uint8_t i, dat 0; for (i 0; i 8; i) { while (DHT11_READ_PIN() 0); /* 等待 50us 低电平结束 */ Delay_us(40); /* 40us 后仍为高则是 1否则是 0 */ dat 1; if (DHT11_READ_PIN() 1) { dat | 1; while (DHT11_READ_PIN() 1); /* 等高电平结束 */ } } return dat; }这段代码的关键在Delay_us(40)这个采样点0 的高电平只有 26~28us1 的高电平有 70us40us 正好卡在中间采样最稳。读之前要__disable_irq()读完立刻__enable_irq()把中断关闭窗口压到最短。DHT11 一次返回 5 字节湿度整数、湿度小数、温度整数、温度小数、校验和校验和等于前四字节相加的低 8 位对不上就丢弃这次数据重读别硬用。4.2 SGP30预热、基线与 I2C 时序SGP30 走标准 I2C7 位地址 0x58。它有两个命令最常用0x2003 初始化空气质量测量0x2008 读测量结果返回 2 字节 eCO2 2 字节 TVOC每个值还带 1 字节 CRC。上电后必须先发初始化命令然后至少预热 15 秒数据才可信前 15 秒读出来的是固定值别当成真实数据往上传。另外 SGP30 支持基线校准把一段时间稳定环境下的基线值存进 Flash下次上电写回去能明显缩短预热时间。/* 读 SGP30发命令 0x2008读 6 字节eCO2 2B CRC TVOC 2B CRC */ uint8_t SGP30_Read(uint16_t *eco2, uint16_t *tvoc) { uint8_t buf[6]; if (I2C_WriteCmd(SGP30_ADDR, 0x2008) ! 0) return 1; Delay_ms(12); /* 测量周期约 12ms等结果就绪 */ if (I2C_ReadBytes(SGP30_ADDR, buf, 6) ! 0) return 1; if (!SGP30_CheckCRC(buf, 2) || !SGP30_CheckCRC(buf 3, 2)) return 1; *eco2 (buf[0] 8) | buf[1]; *tvoc (buf[3] 8) | buf[4]; return 0; }CRC 校验别省SGP30 在 I2C 线上受干扰时返回的字节可能整体错位没有 CRC 你会拿到看似合理实则离谱的数值。CRC 多项式是 0x31 初值 0xFF网上有现成实现照抄即可。I2C 速率建议 100kHz别一上来就 400kHz杜邦线长一点就翻车。4.3 ADC 采样滑动平均压住噪声PA1 采模拟量12 位分辨率参考电压用 VDDA。裸采一次噪声能到十几个 LSB直接上传曲线像心电图。我一般采 16 次做滑动平均再上传平均值/* 采 16 次取平均去掉最大最小各 2 个抗脉冲干扰 */ uint16_t ADC_ReadFiltered(void) { uint16_t buf[16], sum 0; uint8_t i, j; for (i 0; i 16; i) { buf[i] ADC_GetOnce(ADC_CH1); } /* 简单冒泡排序后掐头去尾 */ for (i 0; i 15; i) for (j 0; j 15 - i; j) if (buf[j] buf[j1]) { uint16_t t buf[j]; buf[j] buf[j1]; buf[j1] t; } for (i 2; i 14; i) sum buf[i]; return sum / 12; }掐头去尾是为了防偶发脉冲干扰比纯平均更抗造。ADC 时钟别超过 14MHzC8T6 的 ADC 分频要算好采样时间选 55.5 个周期对高阻信号更友好。如果发现数值整体偏移先查 VDDA 是否干净再查采样时间最后才怀疑代码。5. 避坑与排查四个最容易翻车的点5.1 DHT11 一直返回 0 或校验失败现象是读出来全是 0 或者校验和永远对不上。原因多半是起始信号拉低时间不够 18ms或者读的时候被 SysTick 中断打断导致时序错位。解决办法是把起始拉低用Delay_ms(20)留余量读取全程关中断读完再开另外确认上拉电阻 4.7k~10k 有没有接DHT11 是开漏输出没上拉读不到高电平。5.2 SGP30 前十几秒数据不动现象是上电后 eCO2 和 TVOC 一直是固定值。这不是坏了是预热期没结束。SGP30 上电后需要至少 15 秒、通常建议 30 秒数据才稳定前 15 秒返回的是内部默认值。解决方法是上电先发初始化命令延时 20 秒再开始读或者做基线保存把稳定环境的基线写进 Flash下次上电先写基线再测量。5.3 串口数据上位机解析乱码或丢帧现象是串口助手能看到数据但上位机解析错位。原因通常是波特率偏差CH340 模块没晶振时高波特率误差大、帧头没对齐、或者发送和读取抢中断。解决办法是波特率降到 115200 以下先验证帧解析用状态机找 0xAA55 帧头而不是按固定长度切发送用 DMA别在中断里 printf。5.4 ADC 数值随传感器动作跳动现象是 DHT11 或 SGP30 一工作ADC 值就跳。原因是共用 3.3V 供电瞬态电流拉低了参考电压。解决办法是传感器单独供电或加大去耦电容ADC 参考脚就近加 100nF软件上做滑动平均。这一条是硬件和软件一起治光改代码治不干净。6. 验收与答辩怎么证明这套采集链路是可信的验收这套方案别只看“能出数”要看数据可不可信、链路稳不稳。我一般按三步走。第一步做静态基准测试DHT11 和标准温湿度计放同一环境对比误差在 ±2℃/±5%RH 内算合格SGP30 在通风环境读 eCO2 应在 400ppm 附近对着酒精棉靠近 TVOC 应明显上升ADC 接已知电压比如 1.65V 分压读值换算后误差小于 1%。第二步做连续运行测试上电跑 2 小时统计串口丢帧率正常应低于 0.1%同时观察 SGP30 基线是否漂移。第三步做异常注入拔掉 DHT11 看程序是否卡死、串口发错误帧看上位机是否丢弃验证容错。答辩时最容易被问的是“你怎么保证数据是真的”。这时候别背参数直接展示对比记录表和连续运行日志比说十句“我做了滤波”都管用。下面这张验收表可以直接抄进报告验收项方法合格标准温度精度与标准温度计同环境对比误差 ≤ ±2℃湿度精度与标准湿度计对比误差 ≤ ±5%RHeCO2 合理性通风环境静置读数350~450ppmADC 线性两点已知电压标定误差 ≤ 1%串口稳定性连续 2 小时统计丢帧率 0.1%容错拔传感器/发错帧不死机、能丢弃从那以后我每次做多传感器采集都强制先把资源占用表和验收表写出来再动手因为翻车最多的从来不是某个传感器不会用而是几个模块凑一起时资源打架、时序互踩。希望这套结构能帮你把毕设或课设一次跑通。本文还有配套的精品资源点击获取

相关推荐

KWDB在运维监控中的高效应用与实践
KWDB在运维监控中的高效应用与实践

1. 运维监控的痛点与KWDB的破局之道 在互联网企业的运维战场上,服务器监控系统就像人体的神经系统,任何微小的异常都可能引发连锁反应。我曾亲历过一次数据库主节点宕机事故,由于监控系统未能及时预警,导致业务中断近30分钟&#… · 2026/11/4 18:22:38

Unity 3D游戏开发中的三大AI协作范式解析
Unity 3D游戏开发中的三大AI协作范式解析

1. 这不是“跑个Demo”,而是一场真实开发节奏的极限压力测试最近两周,我把自己关在工作室里,用三套完全不同的大模型开发环境——Step 5 Preview、DeepSeek V4 Pro 和 GLM5.3 ——同步推进一个完整可运行的 3D 游戏原型:一个基于 … · 2026/11/4 18:21:38

ISO/IEC 20000-1:2018转版:SMS成文信息与条款8落地
ISO/IEC 20000-1:2018转版:SMS成文信息与条款8落地

简介:这份《ISO/IEC 20000-1:2018》中文版PDF面向信息技术服务管理体系(ITSM)认证人员、内审员、咨询顾问及负责服务体系建设与转版的从业者,可作为理解新版标准要求、开展审核对照和内部培训的参考资料。文件为1个PDF&#xff0c… · 2026/11/4 18:21:38

AndroidGen-GLM-4-9B性能优化技巧:提升Android代理效率的10个方法
AndroidGen-GLM-4-9B性能优化技巧:提升Android代理效率的10个方法

AndroidGen-GLM-4-9B性能优化技巧:提升Android代理效率的10个方法 【免费下载链接】androidgen-glm-4-9b 项目地址: https://ai.gitcode.com/zai-org/androidgen-glm-4-9b AndroidGen-GLM-4-9B是智谱AI推出的一款针对Android开发的大语言模型,能… · 2026/11/4 19:11:33

Driver Store Explorer 驱动清理指南:快速安全释放系统盘空间
Driver Store Explorer 驱动清理指南:快速安全释放系统盘空间

Driver Store Explorer 驱动清理指南:快速安全释放系统盘空间 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 如果你的系统盘空间正被悄悄吃掉好几个 GB,而在&qu… · 2026/11/4 19:11:33

三月七小助手使用指南:星穹铁道日常清体力一键搞定,从安装到深度定制
三月七小助手使用指南:星穹铁道日常清体力一键搞定,从安装到深度定制

三月七小助手使用指南:星穹铁道日常清体力一键搞定,从安装到深度定制 【免费下载链接】March7thAssistant 日常交给三月七,开拓留给你。《崩坏:星穹铁道》开源自动化助手。 项目地址: https://gitcode.com/gh_mirrors/ma/March7… · 2026/11/4 19:11:33

三步装好 Bilibili-Evolved:让 B 站增强脚本按你的意愿运转
三步装好 Bilibili-Evolved:让 B 站增强脚本按你的意愿运转

三步装好 Bilibili-Evolved:让 B 站增强脚本按你的意愿运转 【免费下载链接】Bilibili-Evolved 强大的哔哩哔哩增强脚本 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved 写给想自己掌控 B 站页面体验的新手。Bilibili-Evolved 是一款运行在油… · 2026/11/4 19:11:33

Whisky 上手实测:在 Mac 上运行 Windows 软件的完整步骤与边界
Whisky 上手实测:在 Mac 上运行 Windows 软件的完整步骤与边界

Whisky 上手实测:在 Mac 上运行 Windows 软件的完整步骤与边界 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky Whisky 是一个用 SwiftUI 写成的 Wine 封装工具&#xff0… · 2026/11/4 19:11:33

可视化编程编辑器 Blockly 一文拆解:拖块如何生成五门语言代码
可视化编程编辑器 Blockly 一文拆解:拖块如何生成五门语言代码

可视化编程编辑器 Blockly 一文拆解:拖块如何生成五门语言代码 【免费下载链接】blockly The web-based visual programming editor. 项目地址: https://gitcode.com/gh_mirrors/bloc/blockly 在网页里嵌一个编程界面,自己从零做,光处… · 2026/11/4 19:10:32

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码