Why PM2.5 specifically?

I am curious why PM2.5 is given specific attention in this project. The whole project, and related documentation, and even the identifiers in the code consistently refer to PM2.5. The sensor is named in the code as if it is a PM2.5 sensor.

The PMS5003 is capable of outputting many more things, including PM1.0, PM10, and a full 6-bucket histogram of the distribution of particles by differing diameters. The air gradient library is written to only return the PM2.5 value which seems to me (maybe naively?) to be a shame since it is the most expensive single component and we are only getting one out of 12 possible values it can return.

I have modified the airgradient library to return all the values, although 3 of them are the non-standard-particle forms of the PM readings which I am not interested in, so I’m using 9 out of the 12 metrics it produces (still more than 1 out of 12).

I can find no discussion about this, is it because the library was written to only get 1 out of 12 values and everyone takes that as a given and is unaware it can do more? Or is there something special about PM2.5 that makes it more of a standard, or more important for health purposes, that it was chosen to be the one thing we read off the sensor with the rest of the data thrown away?

I don’t really know much about “air quality” as a subject, I just know from the spec sheet of the device it can do more.

I’m using ESPHome and collecting 1.0, 2.5 and 10.0 and so far they all scale at the same rate. Doesn’t necessarily mean the others aren’t accurate, but I’m not seeing anything new by monitoring them.

PMSX003 Particulate Matter Sensor — ESPHome

Most low cost monitors are calibrated to be relatively exact for PM2.5 and then estimate the PM1 and PM10 based on this value. So the accuracy of PM1 and PM10 is much less.

Additionally, most health based recommendations e.g. from the WHO are focusing on PM2.5.

However, we currently rewrite the Arduino library and I believe it is a good idea to make PM1 and PM10 available, incl. bucket counts etc.


Thanks Achim that is good context to know about the health recommendations being focused on PM2.5, which explains why it was given focus in the library. I had a vague suspicion it was something like that. I’ve decided to continue showing PM2.5 on my display, while the other metrics I make available to my backend.

I did also have my display draw a histogram from the particle size buckets. Just for interest here’s what it looks like:
The bars of the histogram are square-rooted to stretch them to more useful visual scale. I tried a logarithm, but I found that a log curve got too flat on the top too fast and sqrt worked better.

1 Like

This looks really nice!

Would you like to post the code changes for others?

I’d be more than happy to. However I have made pretty extensive changes including to airgradient.h/cpp, and I don’t know that anyone would want all of them. Structurally it’s only half recognizable as having come from the DIY_PRO template originally.

There is also a somewhat overkill animated OLED view of the startup process visible here

The display code is organized into small functions that make it easy to tweak spacing “objects” that are in nested groups (and should make it easy to lift that part of the code) , there is still coupling to these other changes.

What do you think is the most productive way to share it?


This is so awesome! Great work!

We started completely redoing the airgradient library and putting in quite a number of improvements and some of the code could be interesting to just drop in.

If you ok to share, best would probably with github or you can just attach a ZIP file here.

1 Like

Useful context on sensor accuracy in this paper: https://www.scirp.org/journal/paperinformation.aspx?paperid=107924#:~:text=In%20general%2C%20the%20PMS5003%20sensor,SM-UART-04L%20sensor.

But it does make it look like this PMS5003 sensor does indeed take separate “real” measurements of different particle sizes, though it seems like accuracy at PM1 is much lower than it is at PM2.5 (which is common).

While PM2.5 is the most health-significant (smaller particles get absorbed into the body and processed as toxins, and larger particles get caught in mucus and expelled - PM2.5 just sticks in your lungs), if we are getting a legit measurement of PM 1 and PM 10, then might as well include them as data points.