I did a load of testing today, so apologies for this long post.
Here are some of my calibration notes on these BME680 sensors. I have calibrated my 3 sensors using 3 other cheapo sensors (AMIR hygrometers) and a Netatmo thermostat (very accurate, but only temperature).
In my setup I started off with the sensors positioned about 40cm away from their respective Raspberry Pi using some wire jerky (more on that later), and the gas measurements disabled (more on that later). Under these circumstances, I’m impressed how stable the BME680 sensors are. The humidity deviates no more than 0.2% between sensors, the hPA deviates by no more than 1 hPA and the temperature is within 0.2C. Not bad at all.
The thermostat reads 20.4C (± 0.1), the BME680s read 20.52C, 20.57C, and 20.32C (± 0.5), and the AMIR read 20.8C, 20.5, 20.1 (± 1). As you would expect, the most accurate sensor sits in the middle of the temperature range, the BME680 closely cluster around that reading, and the AMIR cluster around the BME680s readings. I also ordered the readings according to how far they sit away from the radiator. As it turned out, the AMIR near the radiator liked to overreport and the one furthest liked to underreport. When I swapped their positions all three agreed on the temperature given by the thermostat. I did the readings a number of times, and the results were always in the same ballpark.
A lot of measuring later and I calibrated each BME680 sensor by ±0.1C. If your sensor needs more calibrating, something is off (read on).
The humidity is trickier. For example, at one point the AMIRs all read 50% (± 5), with the BME680s reading 41.9%, 41.8%, and 41.6% (± 3%). Those readings are very close to the range limit, so I’m wondering if the BME680s need to have a +3% humidity reading? Another measurement, an hour later, gave me 49%, 50%, and 47% for the AMIRs and 43.6%, 43.3%, and 43.2% for the BME680s. Closer, but still suggesting the BME680s are underreporting. The problem is that I don’t have a third type of sensor to validate the humidity. I think the AMIR overreport, but I’m gonna err on the side of caution (I’m in the humid UK after all), and add 3% to each sensor. If anyone could try this out on their end, that would be great!
I don’t know (or care too much) about the pressure reading. One sensor measured 0.2 hPa higher than the others, so I corrected it accordingly.
With all sensors calibrated, now was the time to figure out the effect of the heating profile. I used the standard profile with heating to 320°C for a duration of 150ms. This caused the temperature to jump by 0.7C and the humidity to drop by 2%. Without a doubt, you need to apply some temperature compensation to correct for these errors. For the fun of it, I tried to reduce the duration to 40ms. Now the temperature jumped by 0.25C and the humidity dropped by 0.7%. Not surprisingly, the error doesn’t scale linearly. A drop in duration of a factor 3.75 caused the error to drop by 2.8. it also halved the Ohms that were read … I don’t have a clue what I’m doing and this Ohms reading still feels completely arbitrary. For the time being, until some proper temperature compensation is available, I’m disabling the gas readings.
And one final thing. Mounting the BME680 as on the pictures on the product page is A Bad Idea™. The temperature measures were more than 3.4C higher from the heat radiation from the Pi Zero (not even a W, only running read-all.py). I tested it naked (the Pi, that is), with the official case, and with a Pibow. The results were always similar. If you want reliable readings, use some wire jerky and get the sensor away from the Pi. Don’t do it like Pimoroni did in the photos. Bad Pirates.