A laser particulate sensor is one of the most satisfying parts you can wire to an ESP board. Ten minutes after powering it up you have a live PM2.5 graph, and the first time you fry onions or light a candle you watch it jump. The hard part is not getting a number. It is knowing what the number means, how far to trust it and how long the sensor will last.
This guide compares four modules that turn up in most DIY projects, the Plantower PMS5003, the Nova Fitness SDS011, the Sensirion SPS30 and Sensirion's newer SEN6x family. Then it covers the things the datasheets mention only in passing: humidity, PM10, fan wear and placement.
What these sensors actually measure
All four are optical particle counters. A fan pulls air through a small chamber, a laser lights it, and a photodetector picks up light scattered by passing particles. From the pulses, the sensor estimates how many particles of each size went by.
Mass concentration in µg/m³ is a calculation on top of that count. Sensirion's specification statement explains why this matters: the conversion depends on the optical properties of the particles, such as their refractive index and shape, so an optical sensor has an intrinsic discrepancy compared with the gravimetric method, which weighs particles collected on a filter. Sensirion adds that even high-end reference instruments can disagree with each other by more than 20% of the measured value if they are not properly configured and maintained.
That is why manufacturers specify these sensors as they do. Sensirion's main figure is precision, meaning how far one sensor deviates from the average of a batch, not accuracy against an absolute reference. Plantower's PMS5003 manual is even more direct: only the consistency between Plantower sensors is promised, and the sensor "should not be checked with any third party equipment".
So a hobby PM sensor is best at telling you whether the air is getting better or worse, and roughly by how much. Treat it as a well-calibrated trend meter, not a laboratory instrument.
Four common modules side by side
| Plantower PMS5003 | Nova Fitness SDS011 | Sensirion SPS30 | Sensirion SEN6x | |
|---|---|---|---|---|
| Supply | 4.5-5.5 V | 4.7-5.3 V | 5 V ±10% | 3.15-3.6 V |
| Current while measuring | ≤100 mA | 70 mA ±10 mA | 45-65 mA | depends on variant |
| Interface | UART, 3.3 V logic | UART, 3.3 V logic | UART or I2C | I2C |
| PM outputs | PM1, PM2.5, PM10, particle counts | PM2.5, PM10 | PM1, PM2.5, PM4, PM10, counts | PM1, PM2.5, PM4, PM10 |
| Rated life | MTTF ≥3 years | laser up to 8000 hours | over 10 years, 24 h/day | 10 years (formaldehyde cell over 6) |
All figures come from the manufacturers' datasheets. A few details behind the table matter in practice.
PMS5003. It measures 50 x 38 x 21 mm. The fan needs 5 V, but the data pins use 3.3 V logic, which suits an ESP32 or ESP8266 directly. In its default active mode it streams data every 2.3 seconds when the air is stable, and faster when concentration changes quickly. It has a SET pin for sleep mode, and Plantower says stable readings need at least 30 seconds after waking, because of the fan. The stated consistency is ±10 µg/m³ from 0 to 100 µg/m³ and ±10% from 100 to 500 µg/m³. Counting efficiency is 50% at 0.3 µm and 98% at 0.5 µm and above.
SDS011. At 71 x 70 x 23 mm it is the bulkiest of the four, and it is the one used in the Sensor.Community airRohr kit. Its datasheet gives a working humidity limit of 70% RH and a maximum relative error of ±15% and ±10 µg/m³ at 25 °C and 50% RH. Its laser is rated for up to 8000 hours. That is less than a year of continuous running, so Nova suggests intermittent operation, such as running for 30 seconds per minute, when real-time data is not needed.
SPS30. Only 41 x 41 x 12 mm, with both UART and I2C on a JST ZHR-5 connector. Sensirion recommends UART for cables longer than 20 cm because it is more robust against interference. It calibrates against TSI reference instruments and gives PM1 and PM2.5 precision as ±(5 µg/m³ + 5% of the measured value) from 0 to 100 µg/m³. It also cleans itself: once a week by default, the fan runs at full speed for 10 seconds to blow out dust, and readings are not updated during that time.
SEN6x. Sensirion's newer platform runs from 3.3 V on I2C and combines PM with other measurements depending on the variant. SEN62 measures PM, humidity and temperature; SEN63C adds CO2; SEN65 adds VOC and NOx indices; SEN66 combines PM, humidity, temperature, VOC, NOx and CO2; SEN68 swaps CO2 for formaldehyde. If you want one module for a whole indoor air station, this is the family to look at.
PM10 is the weak spot
Look closely at the SPS30 and SEN6x datasheets and you find a footnote: PM4 and PM10 values are calculated from the distribution profile of all measured particles. They are not measured separately. The specified precision for those outputs is also much looser, ±25 µg/m³ from 0 to 100 µg/m³ for both families.
Plantower, for its part, states the PMS5003's consistency figures for the PM2.5 output only. Use PM2.5 as your main value. Treat PM10 from these modules as a rough indicator.
Humidity inflates readings
Humidity changes how particles scatter light, as the EPA researchers quoted below point out, and optical sensors tend to read high in humid air.
The best-documented example is the US EPA's evaluation of PurpleAir monitors, which use Plantower sensors. Comparing almost 12,000 24-hour averages against regulatory instruments across 16 states, the researchers found that raw PurpleAir data overestimated PM2.5 by about 40% in most parts of the US. They developed a correction that uses the sensor's PM2.5 value and relative humidity:
PM2.5 = 0.524 × PA_cf1 - 0.0862 × RH + 5.75
Here PA_cf1 is the Plantower CF=1 PM2.5 value in µg/m³ and RH is relative humidity in percent. The correction cut the error (RMSE) of 24-hour data from 8 to 3 µg/m³.
Two practical points follow. First, measure humidity next to the PM sensor if you want to correct for it. Second, know which output you are using. The PMS5003 reports two sets of mass values, "CF=1, standard particle" and "under atmospheric environment". The EPA paper notes they are equal below roughly 25 µg/m³, after which the atmospheric value settles at about two thirds of the CF=1 value. In ESPHome's pmsx003 component, pm_2_5_std is the CF=1 value and pm_2_5 is the atmospheric one. The EPA formula expects CF=1.
The correction was fitted to US outdoor data averaged over 24 hours. It is a sensible reference, not a universal calibration for your living room.
Fans wear out: plan the duty cycle
A PM sensor is a small fan and a laser running continuously, and both age. The rated lives in the table differ a lot, and the documents do not always agree. Plantower's manual gives an MTTF of at least three years for the PMS5003, while the ESPHome documentation for the pmsx003 component says the laser lasts about 8000 hours, nearly one year.
If you do not need second-by-second data, run the sensor in bursts:
- In ESPHome,
pmsx003spins the fan down between readings ifupdate_intervalis longer than 30 seconds and the UARTtx_pinis connected. The docs suggest 120 seconds or more to extend sensor life. - For the SDS011, Nova's datasheet recommends intermittent operation for air monitoring, for example 30 seconds of measurement per minute.
- After waking, discard the first readings. Plantower specifies at least 30 seconds, and Sensirion lists a 30 second PM start-up time for the SEN6x.
One trap with the SPS30: its self-cleaning timer resets whenever power is removed. If you power-cycle the sensor daily, Sensirion says to trigger a cleaning cycle manually at least once a week.
Placement and enclosure
Plantower's installation notes apply to any of these modules:
- Keep the inlet and outlet in the same plane as the enclosure wall, or put a barrier between them, so exhaust air is not sucked straight back in.
- Make the opening in the enclosure no smaller than the sensor's inlet.
- Keep the sensor out of the airflow of an air purifier, or shield it.
- Mount it at least 20 cm above the floor so settled dust does not block it.
- Add protection for kitchens, bathrooms and outdoor use. Plantower lists those as conditions outside normal indoor use.
Both the PMS5003 and SPS30 have metal housings connected to ground. Do not let the housing touch anything else in the circuit.
Outdoors, Sensor.Community's airRohr guide suggests a mounting height of 1.5 to 3.5 m above the street in a well-ventilated spot. Its build uses drainpipe bends as a weather shield and recommends pointing the ESP8266's Wi-Fi antenna away from the sensor. When you register a station, the project asks for height and position relative to the street, because placement shapes the data.
Making sense of the numbers
For a reference point, the WHO's 2021 air quality guidelines set PM2.5 levels of 5 µg/m³ as an annual mean and 15 µg/m³ as a 24-hour mean. These are long averages. A short spike while cooking is a different thing from a whole day at an elevated level, so log your data and look at hourly and daily means, not only the live value.
Indoors, the EPA lists cooking, burning candles, fireplaces, unvented heaters, smoking and some hobbies as sources of particles, on top of what comes in from outside. In homes without strong indoor sources, it says indoor PM would be expected to be the same as or lower than outdoors. That makes a pair of sensors, one inside and one outside, more useful than either alone. Comparing the two helps you decide whether to open a window, run a purifier or keep the windows shut.
Getting the data into your system
Firmware support for these sensors is good. ESPHome has components for the Plantower family (pmsx003), SDS011, SPS30, SEN5x and SEN6x, among others. If you prefer an open data project, the Sensor.Community airRohr firmware runs on an ESP8266 NodeMCU with an SDS011 and BME280, supports other sensors including Plantower models and the SPS30, and publishes readings to a public map.
Common mistakes
- Reading PM10 from a small optical sensor as if it were measured. On the SPS30 and SEN6x it is calculated.
- Ignoring humidity. Readings in fog, after showering or outdoors in humid weather can be inflated. Log RH alongside PM.
- Running a sensor flat out for months. Use sleep or longer update intervals unless you need fast response.
- Feeding the fan from 3.3 V. The PMS5003, SDS011 and SPS30 need 5 V. Only the SEN6x runs from 3.3 V.
- Building an enclosure that recirculates air. Separate the inlet from the outlet.
- Comparing two brands and expecting the same number. Different algorithms and calibrations give different absolute values. Compare trends.
Pick the module by what else you want to measure and how you will power it. Then put most of your effort into placement and logging, because that is where good PM data actually comes from.