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

STM32F103C8T6连接ZH03B传感器:一个串口采集PM2.5数据的完整流程(附代码)

STM32F103C8T6与ZH03B传感器实战:从零搭建PM2.5监测系统

最近在做一个室内空气质量监测的小项目,发现ZH03B这款激光粉尘传感器性价比超高,但网上资料比较零散。今天就把整个开发过程整理成保姆级教程,特别适合刚接触STM32的新手。我用的是最常见的STM32F103C8T6最小系统板(蓝色药丸板),成本不到20元,搭配ZH03B传感器,教你如何通过串口获取精确的PM2.5数据。

1. 硬件准备与连接

先清点下需要的器材:

  • STM32F103C8T6开发板(正点原子Mini板或类似蓝色药丸板均可)
  • ZH03B激光粉尘传感器(注意要买3.3V版本的)
  • USB转TTL模块(如CH340)
  • 杜邦线若干
  • 万用表(非必须,但建议备一个)

重要提醒:ZH03B有5V和3.3V两种版本,STM32的IO口耐压一般是3.3V,务必确认你的传感器是3.3V电平的!我刚开始就买错了版本,导致数据异常,后来用逻辑电平转换器才解决。

接线示意图:

STM32引脚ZH03B引脚功能说明
PA2PIN5(TXD)传感器数据输出
PA3PIN4(RXD)传感器控制输入
3.3VPIN1(VCC)电源正极
GNDPIN2(GND)电源地线

注意:很多教程只接了TXD,但实际上RXD也需要连接,因为ZH03B的主动输出模式需要MCU发送配置指令。

2. 开发环境搭建

推荐使用Keil MDK+STM32CubeMX组合,对新手特别友好:

  1. 安装Keil MDK-ARM(记得注册避免代码大小限制)
  2. 下载STM32CubeMX并安装F1系列HAL库
  3. 新建工程,选择STM32F103C8型号
  4. 配置时钟树(外部晶振8MHz,主频设为72MHz)

时钟配置是新手最容易出错的地方,这里给出一个稳定配置方案:

// SystemClock_Config() 关键参数 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;

3. 串口配置与传感器初始化

我们需要配置两个串口:

  • USART1:用于调试输出(连接电脑)
  • USART2:与ZH03B通信

在CubeMX中的配置步骤:

  1. 使能USART1和USART2
  2. USART1参数:9600波特率,8位数据,无校验
  3. USART2参数:9600波特率,8位数据,无校验
  4. 开启USART2全局中断

关键点:USART1在APB2总线,USART2在APB1总线,时钟使能时要特别注意:

__HAL_RCC_USART1_CLK_ENABLE(); // APB2 __HAL_RCC_USART2_CLK_ENABLE(); // APB1

ZH03B传感器需要先发送初始化指令才能进入主动输出模式:

// ZH03B初始化指令 uint8_t init_cmd[] = {0xFF, 0x01, 0x78, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47}; HAL_UART_Transmit(&huart2, init_cmd, sizeof(init_cmd), 100);

4. 数据解析与处理

ZH03B的数据帧格式固定为32字节,包含PM1.0、PM2.5、PM10等参数:

0 1 2 3 4~5 6~7 8~9 10~15 16~31 0x42 0x4D Len Data PM1.0 PM2.5 PM10 保留 校验和

在USART2中断服务函数中添加解析逻辑:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { static uint8_t rx_buf[32], index = 0; static bool frame_start = false; if(huart->Instance == USART2) { uint8_t byte = rx_byte; // 接收到的字节 if(!frame_start && byte == 0x42) { frame_start = true; rx_buf[0] = byte; index = 1; } else if(frame_start) { rx_buf[index++] = byte; // 完整帧接收完成 if(index >= 32 && rx_buf[1] == 0x4D) { uint16_t pm25 = (rx_buf[6] << 8) | rx_buf[7]; printf("PM2.5: %d ug/m3\r\n", pm25); frame_start = false; } } } }

5. 常见问题排查

问题1:接收不到任何数据

  • 检查接线是否正确(TXD-RX交叉连接)
  • 用万用表测量传感器VCC电压是否为3.3V
  • 尝试降低波特率(如4800)

问题2:数据乱码

  • 确认双方波特率一致
  • 检查STM32时钟配置是否正确
  • 尝试在传感器TXD线上加1K上拉电阻

问题3:数据偶尔丢失

  • 增加接收缓冲区大小
  • 优化中断优先级(建议设置USART2中断优先级高于其他外设)
  • 在传感器电源端并联100μF电容

6. 进阶优化建议

  1. 数据平滑处理:传感器数据可能有波动,可以添加滑动平均滤波
#define FILTER_SIZE 5 uint16_t pm25_buffer[FILTER_SIZE] = {0}; uint8_t filter_index = 0; // 在数据解析后添加 pm25_buffer[filter_index++] = pm25; if(filter_index >= FILTER_SIZE) filter_index = 0; uint32_t avg = 0; for(int i=0; i<FILTER_SIZE; i++) avg += pm25_buffer[i]; avg /= FILTER_SIZE;
  1. 低功耗模式:适合电池供电场景

    • 间隔唤醒采集(如每5分钟唤醒一次)
    • 采集完成后进入Stop模式
  2. 多传感器融合:可搭配温湿度传感器(如DHT22)获取更全面的环境数据

7. 完整项目代码结构

建议按模块化方式组织代码:

├── Core │ ├── Src │ │ ├── main.c │ │ ├── stm32f1xx_it.c │ │ └── usart.c │ └── Inc │ ├── main.h │ └── zh03b.h ├── Drivers └── zh03b_driver ├── zh03b.c └── zh03b.h

关键数据结构封装:

// zh03b.h typedef struct { UART_HandleTypeDef *huart; uint16_t pm1_0; uint16_t pm2_5; uint16_t pm10; } ZH03B_HandleTypeDef; void ZH03B_Init(ZH03B_HandleTypeDef *hzh03b); HAL_StatusTypeDef ZH03B_ReadData(ZH03B_HandleTypeDef *hzh03b);

在调试过程中发现,ZH03B对电源稳定性要求较高,建议在VCC和GND之间并联一个100μF的电解电容加一个0.1μF的陶瓷电容,这样数据稳定性会明显提升。另外,传感器的激光头容易积灰,建议每隔几个月用棉签轻轻清洁,否则测量精度会逐渐下降。

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

相关文章:

  • 2026年聊聊华聊能不能执行下去,深圳靠谱的社交电商公司排名 - 工业品牌热点
  • 【实测指南】英文文章AI率86%怎么救?好用的降AI软件推荐与重构技巧
  • picclp32.ocx文件丢失找不到怎么办?免费下载方法分享
  • 2026年口碑好的网带式抛丸机/抛丸机精选厂家推荐 - 行业平台推荐
  • 【大模型微调实战】第4期:从失败到迭代终局——SFT三轮修复与DPO复盘全记录前言
  • 为什么 Cortex-M3 需要向量表?向量表为什么必须放在地址 0 附近?
  • 聊聊2026年华聊可不可以运作,深圳哪些社交软件性价比高? - 工业推荐榜
  • 前端资源加载管理
  • 用户故事管理化技术中的用户故事计划用户故事实施用户故事验证
  • 别再用暴力枚举了!PTA L1-006连续因子题,用数学优化把复杂度降下来
  • 宁波推荐工商注册公司服务费用大概多少钱 - myqiye
  • 别再只用timeNow了!CAPL时间函数全解析:从毫秒到纳秒,精准掌控你的CANoe测试时序
  • GPU实例选型指南:从推理到训练的全场景适配
  • 2026年靠谱的广州烘干机/离心烘干机/热风烘干机主流厂家对比评测 - 品牌宣传支持者
  • Spring Boot 多线程任务池管理技巧
  • 从Sensor到屏幕:深入浅出聊聊Camera 3A算法里的那些“坑”与优化实战
  • 英文论文AI率居高不下?实测6款降AI工具,教你写出地道“学术风”
  • 如何查看物化视图DDL_DBMS_METADATA.GET_DDL提取完整的视图与日志语句
  • 2026好用的持久净水炭,高性价比净水活性炭供应商推荐 - 工业推荐榜
  • ESP32开发环境Python依赖报错?别慌,这份保姆级排查指南帮你搞定(附ESP-IDF V4.2实战)
  • 别再乱用Instant和Duration了!用UE5 GAS的Gameplay Effect,完整构建你的角色Buff/Debuff系统
  • RWKV-7 (1.5B World)流式输出优化:WebSocket协议适配与前端渲染技巧
  • 3DMAX插件避坑指南:Geometry Projection几何投影安装后没反应?可能是你的‘标准基本体’没转换
  • 【Docker网络隔离终极指南】:20年运维专家亲授5种生产级隔离配置方案,99%的团队都用错了
  • Windows屏幕标注终极指南:免费开源工具ppInk的完整教程与实战应用
  • 嵌入式Linux开发踩坑记:TI AM62x平台SD卡初始化报错-110的完整修复流程
  • AI Agent 开发: 你需要知道的 9 个核心技术 -- 从 ReAct 到多 Agent 协作的技术全景
  • 2026年除重金属净水炭费用大揭秘,哪家收费合理 - myqiye
  • pidgenx.dll文件丢失找不到怎么办?免费下载方法分享
  • Phi-mini-MoE-instruct多语言效果:中→英→法→中回译保真度测试与语义一致性分析