07-22-2021 04:16 PM
I am attempting to get the BME680 up and running on the nrf52840dk board and I am using the iot example provided code.
My problem is that after a certain amount of time (its the same timestamp), output_ready is no longer called and only bme680_get_sensor_mode is called every ~33 seconds despite being on LP mode.
I'm hoping for some guidance in how to start troubleshooting this because I am a little lost as to what I can do without modifying the bsec library. The numbers at the end of the status values are tags I added for identification (so I knew which one was called).
I have attached the .c file for the iot_example I am using and the main function is below (its just the stock code included):
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(env_test_process, ev, data)
{
PROCESS_BEGIN();
return_values_init ret;
i2c_init();
ret = bsec_iot_init(BSEC_SAMPLE_RATE_LP, 0.0f, bus_write, bus_read, sleep, state_load, config_load);
if (ret.bme680_status)
{
LOG_INFO_("Could not initialise BME680\n");
}
else if (ret.bsec_status)
{
LOG_INFO_("Could Not Initialise BSEC Library\n");
}
bsec_iot_loop(sleep, get_timestamp_us, output_ready,state_save, 10000);
PROCESS_END();
}
/*---------------------------------------------------------------------------*/
LOG OUTPUT:
__________________________
------------MEASUREMENTS----------x100--------
bsec_status: 0
timestamp: 24101562000
IAQ index: 2500, Accuracy: 0
Temperature: 2900
Humidity: 4600
Pressure: 10020800
Gas: 2773500
CO2 Equivalent: 0
VOC Equivalent: 0
bme680_status = 0 4
bme680_status = 0 3
bme680_status = 0 1
bme680_status = 0 6
bsec_status = 0 5
------------MEASUREMENTS----------x100--------
bsec_status: 0
timestamp: 27101562000
IAQ index: 2500, Accuracy: 0
Temperature: 2900
Humidity: 4600
Pressure: 10020400
Gas: 2983900
CO2 Equivalent: 0
VOC Equivalent: 0
bme680_status = 0 4
bme680_status = 0 3
bme680_status = 0 1
bme680_status = 0 6
bsec_status = 0 5
------------MEASUREMENTS----------x100--------
bsec_status: 0
timestamp: 30101562000
IAQ index: 2500, Accuracy: 0
Temperature: 2900
Humidity: 4600
Pressure: 10020800
Gas: 3168200
CO2 Equivalent: 0
VOC Equivalent: 0
bme680_status = 0 4
bme680_status = 0 3
bme680_status = 0 1
bme680_status = 0 6
bsec_status = 0 5
------------MEASUREMENTS----------x100--------
bsec_status: 0
timestamp: 33109375000
IAQ index: 2500, Accuracy: 0
Temperature: 2900
Humidity: 4600
Pressure: 10020800
Gas: 3320700
CO2 Equivalent: 0
VOC Equivalent: 0
bme680_status = 0 1
bme680_status = 0 1
bme680_status = 0 1
bme680_status = 0 1
bme680_status = 0 1
bme680_status = 0 1
bme680_status = 0 1
bme680_status = 0 1
bme680_status = 0 1
Solved! Go to Solution.
07-28-2021 02:17 AM
Does your clock time have 32 bits output or 64 bits?
its 32 bits -> type is uint32_t
get_timestamp_us is micro second unit. Why did you multiply 1000000 and devide clock_second?
the output of clock_time is the system time in ticks, not ms or us which is why I've had to divide by CLOCK_SECOND which converts to s, and multiply before the divide to not lose resolution and get us.
07-29-2021 01:52 AM
Hello acanthe,
I understood.
If you don't have any system clock which is 64 bits, need to make it your own timestamp.
Since, BSEC library checks it how long it BME688 can sleep.
Thanks,
08-03-2021 11:17 AM
Hi,
I managed to fix the problem, the cause was that I had divided by 128 to get the clock in seconds BEFORE i cast to int64_t. Casting afterwards allowed the clock the manage its max value as it normally would do. In other words, because the clock never reached the max value of a uint32_t the clock never knew it had reset.
The sensor takes 10 or so minutes but it seems to be getting accuracy readings now (1/2/3) which is great.
Thanks for your help Minhwan walking through the steps.