1. 项目概述与硬件选型

各位同学,咱们今天正式开干。做这个空气颗粒物监测项目,说白了就是让STM32去“闻”空气,然后把PM2.5和PM10的浓度告诉你。听起来挺酷对吧?但别急着焊板子,先把底层的逻辑理清楚。

1.1 PM2.5/PM10监测原理——其实没那么玄乎

PM2.5和PM10,说白了就是空气中直径小于2.5微米和10微米的颗粒物。你想想看,头发丝的直径大概是70微米,PM2.5只有它的三十分之一。这么小的东西怎么测?

目前主流方案有两种:

  • 激光散射法:激光照过去,颗粒物会把光散射掉。传感器接收散射光信号,通过算法反推出浓度。精度高,响应快,我项目里一直用这个。
  • 红外法:便宜,但精度差得远。说实话,做产品的话我不推荐。

咱们选的PMS5003就是激光散射法。它内部有个激光器、一个光电探测器,再加上一颗DSP芯片做数据处理。你给它供电,它直接吐出数字信号——PM1.0、PM2.5、PM10全都有。嗯,这里要注意:它输出的是质量浓度,单位是μg/m³,不是粒子个数。

核心要点:PMS5003通过UART输出数据,波特率9600,数据帧固定32字节。每次读取需要先发0x42 0x4D唤醒它,然后等它主动发数据。

1.2 主控选型——为什么是STM32F103C8T6?

很多新手会问:为啥不用Arduino?便宜又简单。我的回答是:Arduino做原型可以,做产品不行

STM32F103C8T6这颗芯片,我用了不下十年。它的优势很明显:

  • 72MHz主频:处理PMS5003的数据绰绰有余,还能跑个FreeRTOS
  • 20KB RAM + 64KB Flash:存个历史数据、跑个简单滤波算法,够用
  • 3路UART:一路接传感器,一路接WiFi模块,一路留作调试
  • 价格便宜:淘宝上几块钱一片,坏了不心疼

我记得有一次项目赶工期,客户要求一周出样机。我直接用F103C8T6搭了个最小系统板,配合PMS5003,三天就把数据调通了。要是换别的芯片,光看手册就得两天。

个人经验:F103C8T6的UART1和UART2的引脚不冲突,建议UART1接传感器,UART2接调试串口。这样调试时不会干扰传感器数据。

1.3 PMS5003传感器详解——别被它的“脾气”坑了

PMS5003这个传感器,我用过好几个批次。说实话,它挺“娇气”的。下面是我踩过的坑:

参数 数值 注意事项
工作电压 5V ± 0.5V 不能直接用3.3V供电,否则数据飘得厉害
工作电流 100mA(典型) 启动瞬间会冲到200mA,注意电源余量
数据输出 UART 9600 8N1 TTL电平,3.3V兼容,可以直接连STM32
预热时间 30秒 刚上电的数据不要用,等稳定后再读
测量范围 0~1000 μg/m³ 超过这个范围,数据会饱和

我曾经犯过一个低级错误:直接用STM32的3.3V给PMS5003供电。结果数据读出来全是0xFF,折腾了两天才发现是电压不够。所以,供电一定要用5V,而且最好加个100μF的电解电容滤波。

避坑指南:PMS5003的风扇是有寿命的,连续运行大概能撑8000小时。如果做长期监测项目,建议加个继电器控制它的电源,每隔一小时采样一次,能延长好几倍寿命。

1.4 项目整体框架——先画个“地图”

做嵌入式项目,我习惯先画个框图。别急着写代码,先把各个模块的关系理清楚。咱们这个项目的框架是这样的:

┌─────────────────────────────────────────────────────────────┐
│                    空气颗粒物监测系统                          │
├──────────────┬──────────────┬──────────────┬────────────────┤
│  传感器层    │   主控层     │   显示层     │   通信层       │
│  PMS5003     │  STM32F103   │  OLED 0.96寸 │  ESP8266 WiFi  │
│  (激光散射)  │  (数据处理)  │  (本地显示)  │  (云端上传)    │
├──────────────┴──────────────┴──────────────┴────────────────┤
│  电源层:5V/3.3V 稳压,AMS1117-3.3 + 滤波电路               │
└─────────────────────────────────────────────────────────────┘

说白了,整个系统就干三件事:

  1. 采集:PMS5003每秒钟吐一组数据,STM32通过UART接收
  2. 处理:做数据校验、滑动平均滤波、单位换算
  3. 输出:本地OLED显示 + 通过WiFi上传到服务器

你想想看,这个框架是不是很清晰?每个模块各司其职,出了问题也好排查。我刚开始做项目时,总喜欢把所有代码写在一个main.c里,结果调试时改一个功能就得重新编译整个工程。后来学乖了,模块化设计才是王道

1.5 硬件选型清单——照着买就行

下面是我整理好的物料清单,都是经过验证的型号。你照着买,基本不会出问题:

器件 型号/规格 数量 备注
主控板 STM32F103C8T6最小系统板 1 带8MHz晶振和32.768KHz RTC晶振
传感器 PMS5003(含排线) 1 注意买带转接板的版本,好接线
显示屏 0.96寸 OLED SSD1306 1 I2C接口,4个引脚,好焊
WiFi模块 ESP8266-01S 1 刷好AT固件,直接用串口控制
稳压芯片 AMS1117-3.3 1 把5V转成3.3V给STM32和OLED用
电容 100μF + 0.1μF 各若干 若干 电源滤波用,别省

省钱小技巧:如果你手头有现成的STM32开发板(比如野火、正点原子的),可以直接用,省得自己焊最小系统。但注意开发板的3.3V输出电流要够,至少能提供300mA。

好了,这一章的内容就到这里。硬件选型搞定了,下一章咱们开始画原理图和PCB。记住一句话:选型决定下限,设计决定上限。硬件选对了,后面写代码才顺心。