Pollution monitoring node

Dear all,

I’m looking for some feedback on pollution monitoring node (NOx, SOx, O3, PM2.5 and PM10…).

What sensors did you choose? Are they working well?

How frequently are you retrieving information?

I want to run the node on battery, so I’m looking at some clever choices as some sensors need to warm up before use and that is eating lots of battery…

Thanks for your help.

I‘m using a Nova SDS011 but it‘s fan uses about 150mA and should run at least 30 seconds before taking samples.
the rest of all could be low current components …
to make it operational on batteries you need a big solar panel reloading them

I’ve a SDS011 Dust Sensor and a DHT22 in a Uno mains powered node that has been working nicely sending data once every 15 minutes. The SDS011 wakes up and waits for 10 seconds before taking a reading and powering down to extend the quoted life. Working on the theory that without a long pipe on the inlet the short time will be OK.

no experience but maybe interesting in combination with particle sensors

The CCS811 Air Quality Breakout is a digital gas sensor solution that senses a wide range of Total Volatile Organic Compounds (TVOCs), including equivalent carbon dioxide (eCO2) and metal oxide (MOX) levels. VOCs are often categorized as pollutants and/or sensory irritants and can come from a variety of sources like construction materials (paint, carpet, etc.), machines (copiers, processors, etc.) and even people (breathing, smoking, etc.). This breakout is intended for indoor air quality monitoring in personal devices such as watches and phones, but we’ve put it on a breakout board so you can use it as a regular I2C device.
The onboard CCS811 supports multiple measurement modes that have been optimized for low-power consumption during an active sensor measurement and idle mode extending battery life in portable applications.

Total Volatile Organic Compound (TVOC) sensing from 0 to 1,187 parts per billion
eCO2 sensing from 400 to 8,192 parts per million
Five Operating Modes
Integrated MCU
Onboard Processing
Standard I2C Digital Interface
Optimized Low-Power Modes

datasheet pdf
arduinoi lib zip

I have a PMS5003 (bought at around $20USD on AliExpress) unit running controlled from a ESP32 cheap Heltec devboard.I have been running it for a few weeks and the data is solid and consistent with publically published numbers.
The data is easy to parse out for tiny packet delivery over LoRaWAN but I haven’t done that yet, due to Heltec board being so poor at antenna reach, instead I just publish via MQTT to local WiFi . I really should swap it for my LoPy.
I used Micropython and followed this excellent tutorial
Note it really needs a humidity sensor in parallel to discount readings where water droplets impact the accuracy.
For those interested in using Micropython for this sensor type, considerAdafruit’s site or Rob’s library.

Sorry, I just read your question again@kalon33, here are some answers to your specific question:roll_eyes:s:
. I run the sensor hourly, the exact time is not important to me
. The PMS5003 requires at least 30s of fan (5V) running time prior to reading. I often find the initial reading is false also so expect the moto to be running for a minute or so.
. I do not run it on batteries at the moment however the tutorial I posted spent some time analyzing this area.

I think the battery requirements makes it almost impossible, unless you consider very serious batteries that need to be replaced quite often. Or, as said, a solar panel. Particle sensors need fans and (or a resistor), and gas sensors need to heat up. The escape might be digging into which particle sensor can provide the fastest reading but I think it’s of more use to check if you can use a wall outlet somewhere.

@TijnOnlijn My problem is that I want to monitor pollution in a garden located ~500m away from the nearest power outlet (that isn’t mine, mine is 2.5km away!), that’s why energy has to be optimised :wink:

I have a 3,7V 2000mAh battery linked to a TTGO V2 ESP32 board (that is really better than Heltec ones @Phil_Wilko) that is pretty power savvy using deepsleep mode, and a solar power board that charges the battery, coupled to a 3W solar panel.

If i’m considering buying PMS7003 (which is nearly the same as your PMS5003 @Phil_Wilko), you advise me to power it for one minute before reading the value, to have a correct one?

Thanks :slight_smile:

Hi Kalon, slightly offtopic, but I guess relevant for any pollution (power hungry?) node.
How are you controlling the charge to your battery - do you just use a solar panel to power a USB power board like this

to power the TTGO (which has a lipo battery?)
Just wondering about the performance of a 3W solar panel

On the tutorial I posted; Dominik managed 80 hours on a 700mAh battery. That included a significant amount of power drain removal work and use of deep sleep modes on the ESP32. That seems realistic, so you may want to look for a large battery and solar panel to support your node. For many potential use cases the power requirements of the sensor now far exceed the microcontoller.
One obvious option may be to run the sensor much less often; say once a day; dropping into deepsleep
Another option is to build up a bytearray of very limited data from the sensor (say PM2.5 reading only) and send the readings via LoraWAN only infrequently (weekly?)

Sorry, I am really bad at reading (and answering) questions…
The PM5003 datasheet indicates 30 seconds of fan running should allow a correct reading.
My experience is that it takes 30+ seconds to get a decent reading. Also, the first reading from the PM5003 is usually poor for some reason. This observation has been made by others too.

Sorry, @kalon33 I have no experience of the PMS7003.

@CurlyWurly not that offtopic, because power is key for such nodes.

I will use Solar charger shield from Seeedstudio to deal with the solar panel and recharge the battery that is connected on the TTGO board battery connector (that has a LiPo charger module). I don’t have tested that yet, and hopefully I will receive the board in the next few days. But indeed, there are cheaper board that could do the job. Here I was looking on a easy to use solution, being able to produce both 3V3 and 5V, deal with LiPo charging and Solar panel variable power input.

I don’t know yet how to deal with the fact that the PM sensor requires 5V and I only have 3.3V. The solar charger board is switchable from 3.3 to 5V, and if I looked at it correctly, can produce both. So that could be a solution, moving the battery from TTGO to the solar board. But I exclude the fact that the PM sensor would then be constantly powered on…

Ideally, it would be great to find a switchable step up power regulator PCB, that would convert 3V to 5V, and that I could switch on and off using the TTGO in order to save battery between measurements.

Any idea? Maybe @BoRRoZ who has seen lots of hardwares has the solution?

@Phil_Wilko on the tutorial you posted, it seems that he waits only 7 seconds before measurement, discarding the first one, you confirm that you need not less than 30s? That might be because he averages ~10 measures, so finally, more time is spend.


I have been testing a few solar panels recently.
Today, It is cloudy (no sun) and my cheap 10w solar panel shows an open circuit voltage of about 11V.
This morning, I connected it (via diode) to a fully charged 6V wet battery (7ah) which has no load.
With this setup, I see a charging current of 17 mA and the battery voltage has floated to 7.2V.
(I’ve disconnected the battery now)

However, it was very sunny a few days ago and a similar test showed a current considerably more. So much so, that the non-loaded battery voltage went too high and I could hear the battery outgassing (!)

I’ll be interested in the performance of the shield. From what I am seeing, the problem with seasonal solar power is that it has to be wildly overspec’d to cater for Winter.
i.e. even a 10w solar panel only gives 17ma for a few hours during Winter to a 6v battery.
Thats not 10W, more like 0.1W going into the battery :frowning:
(N.B. On a Sunny day, this setup gives about 40ma)
I have tried to use buck/boost convertors, but they take too much power to operate and during the cold darkish days of winter, I found it better to just put the solar panel straight to the battery.

I’m thinking of adding Zener diodes / LEDs to shunt the charge on sunny days when the battery is fully charged. I can then start the measuring of how much power can be sustainably drained.

Total cost of this is under £40 (£18 for panel, £16 for Battery, £4 for other stuff), its way too high for LoRawan, but I need the power capability for other reasons, and high drain is expected at night as and when :frowning:
Hopefully, others can chime on on their experiences for solar stuff for more “in between” power such as your case?

Please can you post back on the performance of the shield ?
Maybe you need to alter the measuring frequency depending on battery condition?

This looks a good option - to power a Heltec/TTGO with Lipo


in NL I buy them here

I use different dc/dc 5v converters depending on the use case

for a bit more power (RPI mobile or multiple sensors+uno) I prefer these

1 - https://www.ebay.com/itm/TPS61030-3-5V-to-5V-2A-Lithium-18650-Battery-boost-Charge-module-96-efficiency/172628109173
2 - https://www.ebay.com/itm/DC-DC-Step-up-Converter-3V-3-7V-4-2V-to-5V-3A-15W-Lithium-battery-Boost-Power-/322476516268

don’t use to small dc/dc converters, you need some 'overhead or the voltage drops in peakcurrent

So @kalon33 the problem with deviating from the manufacturer’s datasheet is that, although you may get at reading in less than 30 seconds, you cannot really trust the result. A temp sensor reading is relatively easy to verify but an air pollution particle sensor is another thing altogether.
How important is the measurement accuracy?
Isn’t it better to get an accurate measurement, less often?
Also, don’t forget to take the humidity reading first, if its too high, don’t start the PMS5003 at all as the reading will be incorrect.

@Phil_Wilko OK, thanks for your answer. For humidity, what is considered as too high to get a correct PM value with this sensor?

Hi guys, I authored the tutorial that @Phil_Wilko mentioned. I’m so glad that you found it useful! Allow me to chip in with a bit of further explanation:

On 30s offset requirement

I didn’t find the 30-seconds requirement in my 5003 datasheet, and I suppose it might have been coined by the users finding out that the initial measurements are skewed. The only thing mentioned there is “the response time less than 10s”, and indeed around 5-7 seconds is needed from booting up the sensor until it starts transmitting data.

I have seen a 30s requirement mentioned in PMS7003 datasheet though. I actually just searched the Chinese datasheets for PMS5003 and PMS7003 for “30” and found it only in the second one, in context of a response time.

My point is, I couldn’t verify the 30s measurement delay with my testing. After booting up the sensor and reading frame by frame, the first one was off by some margin, but then already the second measurement was pretty close to the rest of them, with no significant difference after 10, 30 or 60 seconds. Maybe I was lucky enough to get an exceptionally good sensor :wink: but that’s what my numbers say.

Also, I’m getting pretty stable results with every measurement - I’m reading the sensor data every 10 minutes and don’t see a huge variation in readouts, but rather they follow a trend line, especially if you draw a 1-hour mean. I mean, I wouldn’t expect a laser precision anyway from a 20$ sensor.

For a “production” version of the sensor I’d probably go with measuring every 30 minutes and then I could afford a 30s wait time, considering power consumption…


While it makes sense that high humidity (>70-80% RH) would affect the measurement, I can’t confirm it either. It manifests itself e.g. when I take the sensor back home from the outside on a cold day, and the droplets gather on the surface of the sensor. Also, a friend of mine noticed that the sensor goes nuts when placed close to the humidifier, most probably by recognizing water particles as dust. In normal measurement conditions, however, I can’t see that the readout is skewed.

There might be some systematic error added to my measurements, especially that now in winter I rarely observe humidity lower than 70%, but I would need some more testing to confirm that. It would make sense to put the sensor next to the official air quality monitoring station (the nearest one is downtown around 5km from my place), but anytime I compare my results with official info or data from other public sensors, it’s very similar, I’d say within 5-10%. And most importantly, I don’t see my results being significantly higher than those of other sensors around me.

Perhaps the placement of the sensor makes a difference. In my case, it’s on the wall outside, but still under the roof, so it’s not affected directly by rain or snow.
When I read similar discussions on PMS5003 and humidity on Polish forums, the consensus was that companies that sell PMS5003-based sensors don’t adjust the readout for humidity :wink:

Battery life

If possible, go with LoRa. I’m now evaluating LoRaWAN with my sensor and even though the PMS5003 accounts for most of the battery drain, I’m getting close to 20 days on a single battery charge (sending packets one by one), while with Wi-Fi my battery died (permanently) after 16 days (sending batched data for 6 measurements every hour). Read more here:

That’s how it works for me, but apparently, your mileage may vary. I hope it helps though and let me know if anything is unclear :slight_smile:


@kap great to see you are on the forum, I could not recognise your name!

The English Product Data Manual “Circuit Attentions” section states
"4. Stable data should be got at least 30 seconds after the sensor wakeup from the sleep mode because of the fan’s performance."
Accounting for the Chinese English, I take this 30 s as a requirement.
Having re-read the manual I agree with @kap and cannot see a humidity constraint. However I have definitely read this somewhere, I have 80% in my code which is pretty low (but not for Australia where my sensor is located). Perhaps it is on the Citizen Science website somewhere. I will keep looking.

1 Like

That was my first post on the forum, as I noticed traffic coming to my website from here so I went to check what was going on :slight_smile:

I’ll be getting 10 PMS5003 units soon (waiting for shipment) so I’ll definitely do some more testing with various devices. I believe that waiting for 30s and measuring AQ every 30 minutes would drain even less battery than what I have currently, and having a readout twice an hour is still an acceptable granularity. Thanks for bringing this up Phil!