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 + 滤波电路 │
└─────────────────────────────────────────────────────────────┘
说白了,整个系统就干三件事:
- 采集:PMS5003每秒钟吐一组数据,STM32通过UART接收
- 处理:做数据校验、滑动平均滤波、单位换算
- 输出:本地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。记住一句话:选型决定下限,设计决定上限。硬件选对了,后面写代码才顺心。