攀藤 PMS 系列传感器是基于激光散射原理的数字式通用颗粒物浓度传感器,可连续采集并计算单位体积内空气中不同粒径的悬浮颗粒物个数,即颗粒物浓度分布,进而换算成为质量浓度,并以通用数字接口形式输出。PMS 传感器可嵌入各种与空气中悬浮颗粒物浓度相关的仪器仪表或环境改善设备,为其提供及时准确的浓度数据,比如小米的空气净化器。
PMS 系列包括很多款传感器,具体选型可以查看 http://www.plantower.com 页面。
为了方便在 MCU 产品上应用 PMS 系列传感器,笔者基于 RT-Thread 物联网操作系统制作了一个软件包 pmsxx。该软件包兼容多款 PMS 传感器,支持 MCU 串口配置为中断或 DMA 接收模式,支持线程初始化,支持使用 device 接口进行读写、控制操作。
GitHub 地址:https://github.com/luhuadong/rtt-pmsxx
攀藤 PMS 系列传感器提供 TTL 电平串口与主机通信,开发者可以通过 USB 转串口模块连接 PMS 传感器的 RX 和 TX 引脚,使用 PC 端的串口调试工具进行调试。默认波特率为 9600 bps,无校验位,1 位停止位。
不同型号的传感器的接口略微不同,以 PMS9003M 为例,是一个带锁槽的 8 pin 接口,间距 1.27 mm。
管脚定义如下:
管脚序号 | 功能标号 | 描述 |
---|---|---|
PIN1 | VCC | 电源正(+5V) |
PIN2 | GND | 电源负 |
PIN3 | SET | 设置管脚(TTL 电平 3.3V),高电平或悬空为正常工作状态,低电平为休眠状态 |
PIN4 | RXD | 串口接收管脚(TTL 电平 3.3V) |
PIN5 | TXD | 串口发送管脚(TTL 电平 3.3V) |
PIN6 | RESET | 模块复位信号(TTL 电平 3.3V),低复位 |
PIN7 | NC | |
PIN8 | NC |
PMS 传感器与 MCU 的典型电路连接示意图如下:
本测试只需连接 VCC、GND、RXD、TXD 即可。
pmsxx 软件包目前支持基础型和增强型两类 PMS 传感器。
基础型 PMSxx 传感器传输协议如下:
如果使用 Env 工具,在添加软件包前需要先执行 pkgs --upgrade
更新软件包索引。以 STM32L4R5 Nucleo BSP 为例,在项目工程目录执行 menuconfig
打开配置页面,pmsxx 软件包的具体路径如下:
RT-Thread online packages --->
peripheral libraries and drivers --->
[*] sensors drivers --->
[*] PMSxx: Plantower pms serial PM2.5 sensor driver.
pmsxx 软件包位于 sensor drivers 内,已对接 sensor 设备驱动框架,因此 pmsxx 可为上层应用提供标准的 device 操作接口。pmsxx 软件包选项配置如下:
这里使用 STM32L4R5 Nucleo 板上 Arduino 接口的 D0(RX)和 D1(TX),对应为 uart3 串口。因此还需要配置 uart3 并开启 DMA 接收功能。
OK,保存配置并退出。执行 pkgs --update
更新/拉取软件包。
--- PMSxx: Plantower pms serial PM2.5 sensor driver.
Select pms sensor type (Basic) --->
(X) Basic
( ) Enhanced
(2000) The waiting time after send command (ms)
[ ] Enable initialize by thread
[ ] Enable serial device DMA RX
[ ] Debug command and response
[ ] Show commands
[ ] Show response data
[ ] Dump raw response data
[ ] Show ruler for raw response data
[ ] Enable pmsxx sample
(uart3) Select uart device name
选项说明:
当硬件和软件准备就绪,就可以编译工程,并将固件下载到 MCU 上。打开 msh 终端,由于开启了 pmsxx 的测试示例和命令/响应调试输出,因此会自动注册传感器设备,并打印出一些信息,比如 MCU 发送给传感器的命令。
+-----------------------------------------------------+
| HEAD1 | HEAD2 | CMD | DATAH | DATAL | LRCH | LRCL |
-----------------------------------------------------
| 42 | 4d | e2 | 00 | 00 | 01 | 71 |
+-----------------------------------------------------+
以及传感器发送给 MCU 的数据。
_________________________________________________________________________________
01 02 03 04 05 06 07 08 09 10 11 12 ...... 20 21 22 23 24 25 26 27 28 29 30 31 32
---------------------------------------------------------------------------------
42 4d 00 1c 00 03 00 04 00 07 00 04 ...... f9 00 1b 00 06 00 03 00 03 9a 00 02 a2
PMS 传感器上电默认进入主动输出模式,为了方便使用,pmsxx 软件包将其初始化为被动模式。初始化成功,执行 list_device
命令可以查看该设备。
msh >list_device
device type ref count
-------- -------------------- ----------
dust_pms Sensor Device 0
由于 PMS 传感器包含多种检测数据,pms 注册为 dust 设备,使用 rt_device_read
接口读取的是通常比较关心的 PM2.5(大气环境)值。如果想要获取所有数据,可以使用 rt_device_control
接口。
示例代码提供了两个测试命令:
以下是使用 PMS9003M 传感器,执行 pms_dump_sample 命令的运行效果:
以下是使用 PMS5003ST 传感器,执行 pms_dump_sample 命令的运行效果:(需要切换为 Enhanced 类型)
以上测试均是通过 sensor 设备驱动框架进行。另外,pmsxx 软件包示例还提供了自定义接口测试命令 cat_pmsxx_passive 和 cat_pmsxx_active,分别用于被动式和主动式测试。小伙伴们可以试一下,那我们下次再见咯~