05-28-2021 09:00 AM
Hello,
I'm trying to measure the IAQ with a BME688 sensor and the new BSEC2.0 library on an RaspberryPi.
I had everything working with the BME680 and the BSEC1.4.
All values despite the IAQ are calculated and updatet correctly but the IAQ status is 0 even after letting it run for over 20 minutes.
What could be reasons for the IAQ to not update?
Thanks for any advice
Nathan
Solved! Go to Solution.
07-09-2021 07:49 AM
Hello MightyNate,
Coul we know detailed software you used? Original code, and your modification.
07-21-2021 04:10 PM
Helllo. I'm having this exact problem with BME688 & BSEC2.0 .
Migrated my code from BSEC 1.4 to BSEC 2.0 (ESP32 board) and now IAQ Accuracy is always 0.
I'm using "BSEC_SAMPLE_RATE_HIGH_PERFORMANCE".
And in "setConfig" I'm using BSEC provided configuration file "bsec_serialized_configurations_iaq.h"
I was wondering... In BSEC 1.4 I used a configurating file (generic_33v_3s_4d) which configured, among other things (I guess), the sample rate (lp), the sensor voltage (3.3v) and sensor history (4days). Those configurations are not needed in BSEC 2.0 or it's supposed they're included in bsec_serialized_configurations.h?
I'm also having problems when try to use BSEC 2.0 in any other mode than HIGH_PERFORMANCE. For example, if I change the sample rate to BSEC_SAMPLE_RATE_LP as I was using with BSEC 1.4, I got the following error: BSEC error code : -12. Which according to bsec_datatypes.h means:
"The sample_rate of the requested output (virtual) sensor passed to bsec_update_subscription() does not match with the sampling rate allowed for that sensor"
Thanks!
08-13-2021 11:06 PM
Hello.
I am using the
1. BME688 Sensor
2. BME68x API downloaded form: https://github.com/BoschSensortec/BME68x-Sensor-API
3. BSEC library Version 2.0.6.1 downloaded from: https://www.bosch-sensortec.com/products/environmental-sensors/gas-sensors/bme688/
4. using the esp32 huzzah32 as the electronics base
5. I have a custom board, similar to the BME688 Shuttle Board, with 8 BME688 sensors on the PCB. I am using SPI to communicating with only 1 sensor for now.
It seems that:
a) SPI communications drivers work well,
b) BME68x API works well to read/write BME688 sensor registers, set modes and retrieve measurement data.
c) BSEC library was successfully integrated into the firmware source code.
After Hardware initialization, BME68x API and BSEC library configuration and init successfully, I call bsec_sensor_control on a loop without any timing delay. I see that every 35 milliseconds the (curr_time_ns >= bsec_bme_settings.next_call) condition is accomplished. So it means that bsec_sensor_control function is exactly called every 35 milliseconds on the firmware.
On the very first bsec_sensor_control call, the Parallel Mode is set to the BME688 sensor.
989 milliseconds after the Parallel Mode is set, a bsec_bme_settings.trigger_measurement condition is accomplished and the bme68x_get_data function is called to read data from sensor.
In this case only Temperature, Pressure, Humidity, Gas resistance and Gas index is gotten from the BSEC library and printed as follows:
timestamp bsec [ns] = 4027000000
timestamp [ns] = 4027000000
#### bsec_do_steps returned 0
Temperature = 27.568842
Pressure = 73798.656250
Humidity = 48.260582
Gas resistance = 39421.003906
Gas index = 0.000000
280 milliseconds after again bsec_bme_settings.trigger_measurement condition is accomplished and the bme68x_get_data function is called to read data from sensor and again only Temperature, Pressure, Humidity, Gas resistance and Gas index is gotten from the BSEC library and printed as follows:
timestamp bsec [ns] = 4307000000
timestamp [ns] = 4307000000
#### bsec_do_steps returned 0
Temperature = 27.365967
Pressure = 73800.343750
Humidity = 48.222721
Gas resistance = 1254517
Gas index = 1.000000
This condition repeats for different time periods. 1,365 milliseconds, 4,165 milliseconds, 700 milliseconds, ...... You can see the LOG file I attached to better understand
And on the millisecond 14002 (current_time [ms] = 14002 equals to next_call [ms]: 14002) the BSEC library issues a bsec_bme_settings.trigger_measurement condition and bme68x_get_data function is called to read data from sensor.
But at this time different variables are processed and printed out as follows:
current_time [ms] = 14002, next_call [ms]: 14002
timestamp bsec [ns] = 14002000000
timestamp [ns] = 14002000000
#### bsec_do_steps returned 0
IAQ = 25.000000
IAQ accuracy = 0
Co2 Equivalent = 500.000000
Breathe VOC Equivalent = 0.500000
Temperature = 28.608572
Pressure = 73786.507812
Humidity = 45.241417
Gas resistance = 80553.804688
Stabilization status = 1.000000
Run in status = 0.000000
Compensated temperature = 25.608572
Compensated humidity = 53.947281
Gas Estimate 1 = 0.250000
Gas Estimate 1 accuracy = 3
Gas Estimate 2 = 0.250000
Gas Estimate 2 accuracy = 3
Gas Estimate 3 = 0.250000
Gas Estimate 3 accuracy = 3
Gas Estimate 4 = 0.250000
Gas Estimate 4 accuracy = 3
Gas index = 9.000000
I see Compensated temperature, Compensated humidity are pretty similar to environment.
I calculate Air Pressure by mysel from: Pressure at sea Level: 101,325 Pa, Ambient Temperature at 25.6°C, Aproximate Altitude over sea level at I am 2700 m
and the calculation result is: 73,709.93 Pa, which is similar to the Pressure = 73,786.507812 printed out by the Firmware.
I could say that the environment measurements from BME688 are close to reality.
So far, so good!!!
But, I am facing similar problems with IAQ value (25) and Accuracy (0). They are not changing even after several minutes executing the firmware.
I don't really know too if Gas resistance, stabilization, Gas Estimate 1,2,3,4 and Gas Estimate accuracy 1,2,3,4 are good.
I attach the source code I am using.
The bsec_integration.c .h have all fuctions called by the firmware and they have the same logic and function calls on the Bosch BSEC library example folder (bsec.c .h source code), but in this case is on C language.
I found these implementation source code on C language from:
Can you see any timing anomaly or do you think it could be timing on lower SPI communication level?
Thank you and my best regards
08-17-2021 12:22 AM
I changed the sample rate from BSEC_SAMPLE_RATE_HIGH_PERFORMANCE to BSEC_SAMPLE_RATE_LP for the virtual sensors in the bsec_update_subscription function call.
With this new configuration an error with code -12 occurs when calling bsec_update_subscription:
BSEC_E_SU_SAMPLERATELIMITS = -12, /*!< The sample_rate of the requested output (virtual) sensor passed to bsec_update_subscription() does not match with the sampling rate allowed for that sensor */
Checking the BSEC Integration Guidelines documentation (1.2.4 Supported Virtual Sensor Output Signals), I see that BSEC_OUTPUT_RAW_GAS_INDEX and BSEC_OUTPUT_GAS_ESTIMATE_1 to _4 have a sample rate of SEL (1/300, 1/3, 1, 1/heater step duration, 1/scan duration)Hz respectively. So I removed those virtual sensors from the the bsec_update_subscription requested_virtual_sensir list for now.
After the firmware initializes correctly, (curr_time_ns >= bsec_bme_settings.next_call) condition is satisfied every 3 seconds exactly and then bsec_sensor_control function is called every 3 seconds exactly, and the sensor is set into FORCED Mode operation.
In this BSEC_SAMPLE_RATE_LP configuration now I can see IAQ, Co2 Equivalent and Breath VOC Equivalent values being changing, with measurements every 3 seconds:
next_call [ns]: 2994030000000 --------->This mean that next bsec_sensor_control call must be at this nanosecond
current_time [ns] = 2994030000000, this_call [ns]: 2994030000000 -------> This mean that current time and next time are equals, no time lag, bsec_sensor_control will be executed rigth now
####Setting FORCED Mode
timestamp bsec [ns] = 2994030000000
timestamp [ns] = 2994030000000
#### bsec_do_steps returned 0
*****************************
IAQ = 100.527153, accuracy = 1
Static IAQ = 57.992462, accuracy = 1
Co2 Equivalent = 631.969849, accuracy = 1
Breathe VOC Equivalent = 0.823313, accuracy = 1
Temperature = 25.753147
Pressure = 73262.335938
Humidity = 37.276054
Gas resistance = 51800.890625
Stabilization status = 1.000000
Run in status = 1.000000
Heat Compensated temperature = 25.688456
Heat Compensated humidity = 37.406696
Gas percentage = 34.426498
*****************************
next_call [ns]: 2997030000000
current_time [ns] = 2997030000000, this_call [ns]: 2997030000000
####Setting FORCED Mode
timestamp bsec [ns] = 2997030000000
timestamp [ns] = 2997030000000
#### bsec_do_steps returned 0
*****************************
IAQ = 101.312813, accuracy = 1
Static IAQ = 58.335663, accuracy = 1
Co2 Equivalent = 633.342651, accuracy = 1
Breathe VOC Equivalent = 0.827595, accuracy = 1
Temperature = 25.748074
Pressure = 73262.609375
Humidity = 37.264271
Gas resistance = 52021.945312
Stabilization status = 1.000000
Run in status = 1.000000
Heat Compensated temperature = 25.683382
Heat Compensated humidity = 37.406395
Gas percentage = 34.776802
*****************************
next_call [ns]: 3000030000000
current_time [ns] = 3000030000000, this_call [ns]: 3000030000000
####Setting FORCED Mode
timestamp bsec [ns] = 3000030000000
timestamp [ns] = 3000030000000
#### bsec_do_steps returned 0
*****************************
IAQ = 101.402786, accuracy = 1
Static IAQ = 58.374962, accuracy = 1
Co2 Equivalent = 633.499878, accuracy = 1
Breathe VOC Equivalent = 0.828087, accuracy = 1
Temperature = 25.753147
Pressure = 73263.554688
Humidity = 37.270420
Gas resistance = 52085.453125
Stabilization status = 1.000000
Run in status = 1.000000
Heat Compensated temperature = 25.688456
Heat Compensated humidity = 37.403931
Gas percentage = 34.817921
*****************************
next_call [ns]: 3003030000000
current_time [ns] = 3003030000000, this_call [ns]: 3003030000000
####Setting FORCED Mode
timestamp bsec [ns] = 3003030000000
timestamp [ns] = 3003030000000
#### bsec_do_steps returned 0
*****************************
IAQ = 97.066452, accuracy = 1
Static IAQ = 56.480728, accuracy = 1
Co2 Equivalent = 625.922913, accuracy = 1
Breathe VOC Equivalent = 0.804712, accuracy = 1
Temperature = 25.753147
Pressure = 73263.554688
Humidity = 37.259148
Gas resistance = 52729.144531
Stabilization status = 1.000000
Run in status = 1.000000
Heat Compensated temperature = 25.688456
Heat Compensated humidity = 37.394669
Gas percentage = 32.891785
*****************************
next_call [ns]: 3006030000000
So here my questions:
What is the difference between BSEC_SAMPLE_RATE_HIGH_PERFORMANCE and BSEC_SAMPLE_RATE_LP for the virtual sensors in the bsec_update_subscription function call?
What could be the reason why in BSEC_SAMPLE_RATE_HIGH_PERFORMANCE cannot see IAQ values?
In BSEC_SAMPLE_RATE_LP, How can I calibrate the sensor, since the accuracy flag is 1 (meaning that sensor needs to be calibrated)?
Thank you and regards.
Alejandro Medina
Alejandro Medina
08-30-2021 10:02 AM - edited 09-06-2021 09:51 AM
For BSEC1 and BSEC2, the example code are totally different, you should strictly use the example code in bsec2 release package. The config string in bsec_serialized_configurations_selectivity.h and bsec_serialized_configurations_selectivity.c shall be used instead of bsec_serialized_configurations_iaq.
BSEC_SAMPLE_RATE_HIGH_PERFORMANCE and BSEC_SAMPLE_RATE_LP is just different in HZ setting. You can have a check on bsec_datatypes.h.
Please follow the example code in BSEC2 release package strictly then we can see if the issue can be fixed or not.