Particle Powered Air Quality Sensor Logging to Google Docs
-
@fotofieber said in Particle Powered Air Quality Sensor Logging to Google Docs:
The MHZ19B is working out of the box without tuning. NDIR sensors seem to be easier to handle but are more power hungry.
Nice! Glad to see something working for you. The MHZ19B seems like a good option when you have the space. I wonder how it is long term.
How many hours have you continuously run your CCS811? I'm seeing the fresh one I had normalize to zero over almost 24h of continuous running. (See the blue trace below for TVOC & C02)
I'm also not surprised by the readings you're getting on temp. Unless you get a sensors that is specifically more precise you could get some significant deviations. I would expect ±1 °C from most sensors though..
-
@jaredwolff said in Particle Powered Air Quality Sensor Logging to Google Docs:
Nice! Glad to see something working for you. The MHZ19B seems like a good option when you have the space.
The MH-Z19B does use less space than the MH-Z14B. I thinkt the footprint is similar to my CCS811 PCB from aliexpress. But it is taller. I think the main argument against the MH-Z19B could be power consumption.
I wonder how it is long term.
I have some MH-Z14B working fine for more than two years. Accoriding to the datasheet, the MH-Z19B should last more than 15 years.
How many hours have you continuously run your CCS811?
More than two days. It didn't get better.
I'm seeing the fresh one I had normalize to zero over almost 24h of continuous running. (See the blue trace below for TVOC & C02)
I can't see the time on your graph. I only see 2019-0... would it be possible to show the time?
The manufacturer has improved accuracy with the last firmware of the CCS811. Which version of firmware do you have on your CCS811?
-
@fotofieber said in Particle Powered Air Quality Sensor Logging to Google Docs:
The manufacturer has improved accuracy with the last firmware of the CCS811. Which version of firmware do you have on your CCS811?
Good question. According to my code: 1.1.0
@fotofieber said in Particle Powered Air Quality Sensor Logging to Google Docs:
I can't see the time on your graph. I only see 2019-0... would it be possible to show the time?
Hmm. Yea they're full timestamps. Pretty useless huh? What are you using to create your graphs? That way we're looking at the same thing.
On another note: I did get SPG30 and BME680 up and running. I ran the SPG30 while I was tinkering with the BME680. It's about 12 hours of data. (Sorry the x axis is not quite working out.)
My initial impressions from the integration:
SPG30 is about as easy as the CCS811. As you can see it has its own demons. It does require another power supply (1.8V typical for this part) And it can get power hungry if you run it tons (48mA when the heater is on).
The BME680 is not so easy to integrate into the Particle platform. Mostly due to the added archive file (i.e. static library, i.e..a file). After tinkering with what they had I have it taking in and processing data. The only thing I really care about is the IAQ calculation which is not open source. It does some other calculations on the temperature and humidity if you choose to integrated it with a space heater. (or HVAC unit for that matter)
-
@jaredwolff said in Particle Powered Air Quality Sensor Logging to Google Docs:
Hmm. Yea they're full timestamps. Pretty useless huh? What are you using to create your graphs? That way we're looking at the same thing.
I am using grafana with influxdb (both in docker).
SPG30 is about as easy as the CCS811. As you can see it has its own demons. It does require another power supply (1.8V typical for this part) And it can get power hungry if you run it tons (48mA when the heater is on).
Awaiting mine impatiently. Power consumption is not a real problem in my usage scenario.
The BME680 is not so easy to integrate into the Particle platform. Mostly due to the added archive file (i.e. static library, i.e..a file).
Do you build with platform.io? I only found instructions for the arduino ide...
Temp and hum are measured on the heated sensor and must be calibrated to be useful according to some discussions I read.
-
@fotofieber said in Particle Powered Air Quality Sensor Logging to Google Docs:
I am using grafana with influxdb (both in docker).
I like it. It may make sense to have my own infrastructure in the future. But then again, I don't feel like dealing with it all.
@fotofieber said in Particle Powered Air Quality Sensor Logging to Google Docs:
Do you build with platform.io? I only found instructions for the arduino ide...
I'm building using the Particle SDK on my machine. They can build Arduino libraries but can't quite include external/static libraries yet (As far as I can tell) out of the box. The Particle platform, in general, has been for convenience and getting to proof of concept (really) fast. Plus they're an awesome company.
As for the data, I'm just pushing the data from the Particle platform into Google docs (as my original post described). It's great for short tests but longer data streams you definitely need a time-based database and some nice front end graphing capabilities.
Another update on the TVOC eval. Looks like the BME680 outputs on the same scale as the SPG30 and CCS811. (i.e. 500ppb == a reading of 500 IAQ on the BME680)
(The timestamps are there if you click on the image itself. )
@fotofieber said in Particle Powered Air Quality Sensor Logging to Google Docs:
Temp and hum are measured on the heated sensor and must be calibrated to be useful according to some discussions I read.
I was thinking about this more considering the discrepancy I'm seeing in temperatures and humidity. If you're serious about the results and the accuracy of the temp & humidity it may require a 3rd temperature sensor with no heater inside.
Supposedly the BME680 has a calibrated output but it hasn't fired up. I'll have to figure that out..
-
Firmware upgrade time!
My CCS811 has bootloader version: 1000
and had application version: 1100
I upgraded to the newest firmware (2.0.1). Now waiting for another two days.... Hope then I get reasonable results like you have....
-
@fotofieber yeehaw. I hope that fixes the craziness you were seeing. I'm curious if that will fix the early unreliable data I've been seeing too..
-
@FotoFieber if you check out my
tvoc_test
branch, I implemented the CCS811 update routine. I'm interested to see how it compares to the SPG30 and BME680..
-
@jaredwolff
The update has brought a big improvement.
I think one could derive airquality from the measurements, but the CO2 ppm value is still way off.
-
@fotofieber that's great news! Pretty much what I've seen. I've stopped eC02 all together because it correlates 1:1 with TVOC on that part. Plus I don't know how actionable the C02 reading is. Does it indicate stale air? C02 is a byproduct of the VOCs? Maybe it's more useful for more industrial environments..
Are you logging anything other than C02?
-
@jaredwolff
CO2 is an indicator of air quality. I use it since years mainly with consumer devices from Netatmo. In my graphs you can see, when people are in the rooms consume the air, when they leave, when I open the windows...The CO2 measurement with NDIR-sensors seems much more reliable than what I see here from CCS811. They usually show quite good results just plugged in without calibration. They are easier to handle, because you don''t need to bother with handling basline (save and restore). And they don't need a temp/hum measurement to correct their values.
Yesterday arrived another NDIR-Sensor (Senseair S8) and a SGP30. I am curious, how they perform. Hope I have the first results in two days.
Are you logging anything other than C02?
In general I have much more values I log (radioactivity, luminosity, window open/close, motion...)
In this setup I log what I can get from the sensors.
-
This night was a complete fail for the CCS811 I have here:
Fresh air at 20:00
Sleep till 6:15 with closed windows
-> NDIR sensors show, how air quality gets worse
-> CCS811 shows, how the air quality gets better during sleep with closed window!
Fresh air at 06:15WTF....
-
S8 readings seem quite goot. (NDIR)
SGP30 Will try with the adafruit library instead of the sparktech.
-
@fotofieber said in Particle Powered Air Quality Sensor Logging to Google Docs:
SGP30 Will try with the adafruit library instead of the sparktech.
I have that one in the same branch I mentioned before if you need a working reference.
I followed your lead on the Grafana + InfluxDB stuff. It was dead simple to setup.
I just want to get HTTPS/SSL working. Pretty nifty little piece of software.
-
@jaredwolff said in Particle Powered Air Quality Sensor Logging to Google Docs:
I followed your lead on the Grafana + InfluxDB stuff. It was dead simple to setup.
Yes, really simple. I use docker for grafana and influxdb.
Your SGP30 CO2 ppm graph looks like mine...
I just want to get HTTPS/SSL working.
I use an nginx-setup here for https.
Pretty nifty little piece of software.
Yepp! They are real software gems.
-
@fotofieber also, I compiled my conclusions about some of the smaller form factor TVOC/C02 sensors. It was inspired by everything we talked about here. Our back and forth conversation has been awesome. So I wanted to say thanks for the inspiration
The above is a screenshot from the side-by-side data of the BME680, CCS811 and SGP30.
The BME680 seemed impressive at first but I'm seeing a big difference in temperature and humidity. My thinking it's likely due to the heating elements inside keeping it a little less humid and a little more hot. (These are the compensated values by the way. The non-compensated values are even lower humidity and a hotter.)
The SGP30 is a bit of a power hog but the TVOC readings seemed to align well with the response from the BME680.
The CCS811, like we've seen throughout this thread, had some wacky responses using the 1.0.0 firmware. I haven't seen that since all of my CCS811 are up to date.
It's a toss up between all three but I'd shy away from the CCS811. If anyone here plans on building a production device, the stock is not reliable enough. (Digikey and Mouser have been out of stock lately) I'm not sure if you'd have the same problem in the EU or how things are in Asia.
Anyway my TLDR conclusions are here if anyone is interested. They include software implementation factors, hardware factors, availability factors and data output factors all rolled into one.
-
@fotofieber said in Particle Powered Air Quality Sensor Logging to Google Docs:
Your SGP30 CO2 ppm graph looks like mine...
Also, Is your SGP30 plot the dark red one? Definitely not what I'd expect from this sensor. At first I thought it was the CCS811 as that one appears to be less reactive (at least in my testing)
-
@jaredwolff said in Particle Powered Air Quality Sensor Logging to Google Docs:
The BME680 seemed impressive at first but I'm seeing a big difference in temperature and humidity. My thinking it's likely due to the heating elements inside keeping it a little less humid and a little more hot. (These are the compensated values by the way. The non-compensated values are even lower humidity and a hotter.)
I have tested several temperature sensors in the same setup and will use seperate HTU21D in my production devices anyway. So temperature and humidity would be no problem for me.
@jaredwolff said in Particle Powered Air Quality Sensor Logging to Google Docs:
Also, Is your SGP30 plot the dark red one? Definitely not what I'd expect from this sensor. At first I thought it was the CCS811 as that one appears to be less reactive (at least in my testing)
Yes, it's is the dark red one.
Yesterday another CCS811 arrived. I will add it to my setup.My final setup drifts to:
- HTU21D temp/hum
- MHZ19B CO2
- HC-SR501 (modified for 3.3V) motion
- WS 2812B led stripes
-
@fotofieber said in Particle Powered Air Quality Sensor Logging to Google Docs:
I have tested several temperature sensors in the same setup and will use seperate HTU21D in my production devices anyway. So temperature and humidity would be no problem for me.
After someone on a different forum suggested, I actually switched it from continuous to low power mode and the temperature and humidity readings look better.
(Red line is in the middle between before and after the change.)
@fotofieber said in Particle Powered Air Quality Sensor Logging to Google Docs:
Yesterday another CCS811 arrived. I will add it to my setup.
Nice, curious to see your results!
-
BME680 sensor mith MCU arrived. Hope I can read the chinese specification of the module.... (What stand PS for?)
-
@fotofieber hmm I'm not sure. Can you send me more info about the board you got?
-
@jaredwolff
Found something on https://de.aliexpress.com/item/GY-MCU680V1-BME680-Sensor-Module-Temperature-and-Humidity-Air-Pressure-Air-Quality-IAQ-MCU680-Module/32902672818.html?spm=a2g0x.10010108.1000016.1.3bc92080ZxA8fs&isOrigTitle=trueWhen soldering the PS solder joint, the module is in the chip's own IIC mode, at which point the MCU does not participate in the operation and does not consume current. Can be used as a simple BME680 module.
And in serial mode:
https://playground.cmmakerclub.com/2018/12/esp32/วิธีการใช้งาน-gy-mcu680-กับ-esp32/I will try the I2C mode first.
-
@fotofieber I'm using I2C over here with great success. Let me know how it goes!
-
@jaredwolff
Seems like I only get an IAQ value for the BME680 and no (e)CO2. Is this correct?
-
@fotofieber correct! No C02. There's also temp, humidity and pressure. Here's a little code to get up and running with their C++ library.
-
@jaredwolff
Managed to compile Bosch arduino demo code on ESP32 on platformio after 3 hours.But then....
BSEC library version 1.4.7.3 Timestamp [ms], raw temperature [°C], pressure [hPa], raw relative humidity [%], gas [Ohm], IAQ, IAQ accuracy, temperature [°C], relative humidity [%], Static IAQ, CO2 equivalent, breath VOC equivalent BSEC error code : -2
Maybe I give up here, as I really don't like to use binary code in my sensors....
-
@fotofieber integrating their static library is a PITA.
What processor are you using exactly? That wold dictate which version of the BSEC you'd integrate.
For Arduino, the library should handle the import of the
.a
file. If you're in any other environment you'll have to add a few lines:LIB_DEPS += $(USER_LIB_DIR)/libalgobsec.a LDFLAGS += -Wl,--whole-archive $(USER_LIB_DIR)/libalgobsec.a -Wl,--no-whole-archive
I had to add these to the makefile in
.particle/toolchains/deviceOS/1.2.0-beta.1/firmware-1.2.0-beta.1/modules/xenon/user-part
for the Particle stuff to work.
-
@jaredwolff
ESP32 is the platform I use.Linking is no problem (after trial and error of two hours ).
I seem to have made a call to the lib:
BSEC library version 1.4.7.3
Now adding DEBUG-Messages to the BSEC arduino library.
-
@fotofieber said in Particle Powered Air Quality Sensor Logging to Google Docs:
Linking is no problem (after trial and error of two hours ).
Yea it took me a bit to figure that out too.
Have you fired up the standard I2C library to see if you can talk to the BME680? Or maybe throw a logic analyzer on it to maker sure it's communicating? I'd imaging the compiler would barf if you used the wrong static library. Bosch does have an ESP32 specific one.
Unfortunately, I don't have any way of testing that here. Keep me posted, I'm curious as to why it's not working.
-
@jaredwolff
The data is read correctly:temp 1883 hum 54739 press 94317 gas resistance 118267 call bsec_do_steps(.. return of bsec_do_steps -2
And -2 means:
BSEC_E_DOSTEPS_VALUELIMITS = -2, /*!< Value of input (physical) sensor signal passed to bsec_do_steps() is not in the valid range */
I wish I had the source code of the lib....
-
@fotofieber the library does have an error I found earlier. Divide
_data.temperature
by100.0f
and_data.humidity
by1000.0f
. This is inBSEC.cpp
See below:
/** * @brief Read data from the BME680 and process it */ bool Bsec::readProcessData(int64_t currTimeNs, bsec_bme_settings_t bme680Settings) { bme680Status = bme680_get_sensor_data(&_data, &_bme680); if (bme680Status != BME680_OK) { return false; } bsec_input_t inputs[BSEC_MAX_PHYSICAL_SENSOR]; // Temp, Pres, Hum & Gas uint8_t nInputs = 0, nOutputs = 0; if (_data.status & BME680_NEW_DATA_MSK) { if (bme680Settings.process_data & BSEC_PROCESS_TEMPERATURE) { inputs[nInputs].sensor_id = BSEC_INPUT_TEMPERATURE; inputs[nInputs].signal = _data.temperature/100.0f; // Need to divide by 100 for fp inputs[nInputs].time_stamp = currTimeNs; nInputs++; /* Temperature offset from the real temperature due to external heat sources */ inputs[nInputs].sensor_id = BSEC_INPUT_HEATSOURCE; inputs[nInputs].signal = _tempOffset; inputs[nInputs].time_stamp = currTimeNs; nInputs++; } if (bme680Settings.process_data & BSEC_PROCESS_HUMIDITY) { inputs[nInputs].sensor_id = BSEC_INPUT_HUMIDITY; inputs[nInputs].signal = _data.humidity/1000.0f; // Need to divide by 1000 for fp; inputs[nInputs].time_stamp = currTimeNs; nInputs++; } if (bme680Settings.process_data & BSEC_PROCESS_PRESSURE) { inputs[nInputs].sensor_id = BSEC_INPUT_PRESSURE; inputs[nInputs].signal = _data.pressure; inputs[nInputs].time_stamp = currTimeNs; nInputs++; } if (bme680Settings.process_data & BSEC_PROCESS_GAS) { inputs[nInputs].sensor_id = BSEC_INPUT_GASRESISTOR; inputs[nInputs].signal = _data.gas_resistance; inputs[nInputs].time_stamp = currTimeNs; nInputs++; } }
-
@jaredwolff said in Particle Powered Air Quality Sensor Logging to Google Docs:
...
inputs[nInputs].signal = _data.humidity/1000.0f; // Need to divide by 1000 for fp;
...WTF, they have a known bug in the library and we all have to discover it by ourselves?....
How cool is that, you seem to have solved the problem I had....
BSEC library version 1.4.7.3 Timestamp [ms], raw temperature [°C], pressure [hPa], raw relative humidity [%], gas [Ohm], IAQ, IAQ accuracy, temperature [°C], relative humidity [%], Static IAQ, CO2 equivalent, breath VOC equivalent End setup() 279, 21.37, 94698.00, 57.66, 80982.00, 25.00, 0, 21.37, 57.66, 25.00, 500.00, 0.50 3278, 21.21, 94700.00, 57.42, 111997.00, 25.00, 0, 21.15, 58.10, 25.00, 500.00, 0.50 6278, 21.22, 94700.00, 57.25, 127972.00, 25.00, 0, 21.16, 57.80, 25.00, 500.00, 0.50 9278, 21.22, 94702.00, 57.10, 135341.00, 25.00, 0, 21.16, 57.58, 25.00, 500.00, 0.50
I hope I will have a graph in two days and I can compare the Bosch sensor to the NIDIR-Sensors...
-
@fotofieber I'm not sure they know.. haha I should tell them.
Good luck and let me know how it goes!
-
They know about it. They keep their library up to date on Github:
Here's the diff:
Here's the library link:
https://github.com/BoschSensortec/BSEC-Arduino-library
You probably downloaded it from the website just like I did.
I'll have to update my repo and point it to this as a submodule.
-
@jaredwolff
I downloaded the binaries from the Bosch site and the source library from the github repo.In the binaries archive is an arduino library with an example with the error, you found.... The github repo has no binaries and I couldn't get it up with the binary.
The binary distribution of essential code makes it more complicated than it could be...
The integration in platformio is not to complicated in my code. I only had to add (after investigating for some hours)
build_flags = -Llib/BSEC/src/esp32/ -lalgobsec
-
@FotoFieber how goes the testing?
The BME680 and the SGP30 both correlate in their readings with temperature. This means when the temperature goes up and down, i've seen the TVOC reading go up and down as well. Hardly useful for a sensor that is supposed to tell you if your air is bad or not.
Take a look at the screenshot below:
You can see that both sensors react wildly to temperature. Whereas the CCS811 has a bump but not significantly. If I go by the scales in the data sheets for the BME680 and SGP30, the room that these sensors are in require immediate venting.
Even right now, the SGP30 sensor is half way to the danger zone.
Danger zone!
While testing that, I also threw everything together into an enclosure. Even added GPS:
So it sits up in the kitchen and chirps at me when I burn my food. I switch on my air purifier and the particulate level goes down pretty quick!
-
Thank you for the feedback @jaredwolff, that is very useful.
Do you confirm that you use the BSEC library for the BME680 and not direct values from the sensor ?
-
@nca78 I am using the BSEC library. I’m using the compensated humidity and temperature so I’m sure if that. I may have to take a second look at the code for both sensors. I may have mucked something up!
-
@jaredwolff
My experiments with VOC sensors were all not satisfactory.The NDIR-sensors reported more or less the same as the netatmo devices and I will therefore stick with them. Apart from that, using the NDIR-sensors in arduino is much easier and you don't have to store baselines or link precompiled code.
-
@fotofieber said in Particle Powered Air Quality Sensor Logging to Google Docs:
@jaredwolff
My experiments with VOC sensors were all not satisfactory.The NDIR-sensors reported more or less the same as the netatmo devices and I will therefore stick with them. Apart from that, using the NDIR-sensors in arduino is much easier and you don't have to store baselines or link precompiled code.
Of course sensors measuring CO2 will give better results than sensors trying to guess the CO2 levels by measuring something else.
But the power consumption is way too high, my hope was to be able to have a battery (li-ion) powered sensor able to run the BME680 in low power settings for a few months and just use it as a warning on when you need to ventilate a room. Unfortunately it seems to not even be fit for this limited use case
-
@nca78 I mean, you can run it on a battery. Just need a really big one!
Because of the internal heater it does make it hard to integrate into a battery powered application.
I haven’t measured the low power mode on the BME. What were you getting @Nca78
-
@jaredwolff said in Particle Powered Air Quality Sensor Logging to Google Docs:
I haven’t measured the low power mode on the BME. What were you getting @Nca78
With 5mn interval it's supposed to use only 90uA, it's good enough for a li-ion battery of a reasonable size.
-
@nca78 agreed. It totally depends on the application. On a 225mA button cell that may not work especially if it has to last a year or two!
-
So @jaredwolff & @FotoFieber what sensor would you suggest to use for measuring air quality using an Arduino (nano/uno), with the option to make it battery powered in the future. From my understanding this will remove the BME from the list due to memory/computing requirements. What are your suggestions?
-
Hey @Sebex
After running my setup for more than 8 months here are a few suggestions:
- If you care about particulates then the PM2.5 sensor works wonders. I've been using the HPMA115S0. It uses UART which you should be able to use with any Arduino variant.
- If you're more concerned with chemicals, a MOx sensor like the CCS811 is still my choice.
The CCS811 is available as development boards from Adafruit and Sparkfun. The HPMA115S0 can be purchased from Arrow, Mouser and Digikey.
I actually developed an all-in-one for Featherwing board. You can check that out for inspiration as well.
-
Regarding the bme680, has anyone yet figured out the correct amount of pre-heating that should be applied to it, or is that still unknown? See https://forum.mysensors.org/topic/7788/bosch-bme680-sensor/15?_=1578489395821 .
-
@jaredwolff thanks. I noticed that for the CSS811 there's no mysensor sketch example, any suggestions for a good guide to build one myself?
Something else I wondered is adding multiple sensors to 1 pin. I want to combine the CCS811 with the Si7021 that I am running now on an Arduino. Perhaps I don't necessarily need to use the same pins but lets say you have running X amount of sensors that it becomes inevitable to use a similar pin. Is it possible to share pins in arduino sketches, if so how does this work? Or is every value sent by the sensor tagged. Couldn't find the answer anywhere on the forum.
-
@Sebex said in Particle Powered Air Quality Sensor Logging to Google Docs:
Perhaps I don't necessarily need to use the same pins
Both the sensors you quote are using I2C. So they both use the same 2 pins (SDA, SCL) to communicate. You can put many I2C sensors on those same pins, they each have an address to know which sensor is receiving/sending data to the master (here, your arduino).
Look for a tutorial on I2C first.
-
I've set up the BME680 to use low power mode. I saw that the temperature readings were much higher in normal mode. Here's the init:
// Begin BME680 work #ifdef HAS_BME680 bsec.begin(BME680_I2C_ADDR_PRIMARY, Wire); checkIaqSensorStatus(); // Set up BME680 sensors bsec_virtual_sensor_t sensorList[7] = { BSEC_OUTPUT_RAW_TEMPERATURE, BSEC_OUTPUT_RAW_PRESSURE, BSEC_OUTPUT_RAW_HUMIDITY, BSEC_OUTPUT_RAW_GAS, BSEC_OUTPUT_IAQ, BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE, BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY }; bsec.updateSubscription(sensorList, 7, BSEC_SAMPLE_RATE_LP); //BSEC_SAMPLE_RATE_LP checkIaqSensorStatus(); #endif
@Sebex I agree with @Nca78, you can look into how I2C works. The cool thing is you can add up to 255 sensors as long as they have different addresses. (or if you do some tricky hardware stuff for devices with the same address) Unfortunately I only have implementations for my Featherwing.
-
@Nca78 said in Particle Powered Air Quality Sensor Logging to Google Docs:
@Sebex said in Particle Powered Air Quality Sensor Logging to Google Docs:
Perhaps I don't necessarily need to use the same pins
Both the sensors you quote are using I2C. So they both use the same 2 pins (SDA, SCL) to communicate. You can put many I2C sensors on those same pins, they each have an address to know which sensor is receiving/sending data to the master (here, your arduino).
Look for a tutorial on I2C first.Thanks I get it now
Suggested Topics
-
Welcome
Announcements • • hek