PMSA003A Dust Sensor

The PMSA003A dust sensor can be found on Ebay for around $20 USD. Based on the datasheet, it is a laser based sensor that is capable of measuring particles as small as 0.3 micrometers.
Related and probably older dust sensors in this family include the PMS7003, PMS5003, and PMS1003.
Usage
The PMSA003A uses a 1.27mm 10 pin header. This header is smaller than the usual DIP header (those are 2.54mm). Be aware that some sellers do not sell the sensor with an adapter board or the female header which makes using this module incredibly hard to do if you don't have this header.

Pinout
The pinouts for the unit I received appears to be different from the one described on the CityOS-air docs (which only lists 8 pins). Based on what I can find, here are the pinouts for this 10-pin model:
| Pin | CityOS Docs | Description |
|---|---|---|
| 1 | Vcc | Pin 1 is the pin one closest to the corner |
| 2 | Vcc | Do a continuity test to confirm. If pin 2 isn't directly connected to pin 1, you might have a different pinout. |
| 3 | Gnd | |
| 4 | Gnd | |
| 5 | Reset | Module reset signal / TTL level @ 3.3V |
| 6 | NC | |
| 7 | RX | Serial receiver pin / TTL level @ 3.3V (not really useful) |
| 8 | NC | |
| 9 | TX | Serial transmission pin / TTL level @ 3.3V |
| 10 | Set | Set/enable pin / TTL level @ 3.3V (high to activate, low to suspend) |
Interfacing with the module
As a quick test, I connected the PMSA003A to a Raspberry Pi using the following pinout:
| Function | PMSA003A | Raspberry Pi |
|---|---|---|
| 5V | 1 | 2 (5v) |
| Ground | 2 | 6 (Ground) |
| Serial transmit | 9 | 10 (UART0 RX) |
| Enable pin (set high) | 10 | 7 (GPIO 4) |
Set /dev/ttyAMA0 to 9600 baud with stty -F /dev/ttyAMA0 9600. You can then read the data coming in from the sensor with cat /dev/ttyAMA0.
The GPIO pin can be set up with by exporting it: echo 4 > /sys/class/gpio/export and then setting the direction: echo out > /sys/class/gpio/gpio4/direction.
Reading the serial data
The data sheet outlines what a data packet looks like. In summary, the structure of a payload is:
| Description | Offset | Length | Comment |
|---|---|---|---|
| Start header | 0 | 2 bytes | 0x42 0x4d (ASCII "BM")
|
| Frame length | 2 | 2 bytes | Frame length=2*13+2(data+check bytes) |
| PM1.0 concentration (μ g/m3) | 4 | 2 bytes | CF=1,standard particle |
| PM2.5 concentration (μ g/m3) | 6 | 2 bytes | CF=1,standard particle |
| PM10 concentration (μ g/m3) | 8 | 2 bytes | CF=1,standard particle |
| PM1.0 concentration (μ g/m3) | 10 | 2 bytes | under atmospheric environment |
| PM2.5 concentration (μ g/m3) | 12 | 2 bytes | under atmospheric environment |
| PM10 concentration (μ g/m3) | 14 | 2 bytes | under atmospheric environment |
| >0.3um | 16 | 2 bytes | number of particles with diameter beyond 0.3 um in 0.1 L of air. |
| >0.5um | 18 | 2 bytes | number of particles with diameter beyond 0.5 um in 0.1 L of air. |
| >1.0um | 20 | 2 bytes | number of particles with diameter beyond 1.0 um in 0.1 L of air. |
| >2.5um | 22 | 2 bytes | number of particles with diameter beyond 2.5 um in 0.1 L of air. |
| >5.0um | 24 | 2 bytes | number of particles with diameter beyond 5.0 um in 0.1 L of air. |
| >10.0um | 26 | 2 bytes | number of particles with diameter beyond 10.0 um in 0.1 L of air. |
| Reserved | 28 | 2 bytes | Reserved |
| Check code | 30 | 2 bytes | Check code is computed by adding all values into two bytes |
See Also
- Datasheet: https://www.evelta.com/content/datasheets/PMSA003%20series%20data%20manual_English_V2.5.pdf
- https://cityos-air.readme.io/docs/pms1003-digital-laser-dust-sensor-pm25-and-pm10
- https://cassiopeia.hk/laserdust/