PMSA003A Dust Sensor: Difference between revisions

From Leo's Notes
This page was last edited on 19 December 2021, at 20:44.
No edit summary
m Categories
Line 181: Line 181:
*https://cassiopeia.hk/laserdust/
*https://cassiopeia.hk/laserdust/


<br />
 
{{Navbox Tinkering}}
[[Category:Tinkering]]
{{Navbox Hardware}}
[[Category:Hardware]]

Revision as of 20:44, 19 December 2021

PMSA003A dust sensor
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.

PMSA003A Pinout
PMSA003A Pinout

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 the orientation. It should be the one below pin 1. See picture above.
3 Gnd
4 Gnd
5 Reset Module reset signal / TTL level @ 3.3V (reset when high, you can leave it not connected)
6 NC
7 RX Serial receiver pin / TTL level @ 3.3V (not really useful since there're only 2 commands you can send)
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.

To get data, toggle the GPIO 4 pin on: echo 1 > /sys/class/gpio/gpio4/value. This takes a short while (30 seconds?) for the fan to spin up and the measurement be read and returned. Toggle off the sensor again with echo 0 > /sys/class/gpio/gpio4/value.

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

The module seems to print 'x's when no data is available or when it's not ready. So long as you are reading for the 'BM' header, the next 30 bytes should be data.

See Also