Ok, just to double-check that I haven’t made a logic error, here’s the code for converting raw value as reported by the nRF52 into units of 0.01 C as given by BME280.
// If only temperature sensor is present.
int32_t temp; // variable to hold temp reading
(void)sd_temp_get(&temp); // get new temperature
temp *= 25; // SD returns temp * 4. Ruuvi format expects temp * 100. 4*25 = 100.
raw_t = (int32_t) temp;
In other words, BME280 returns raw value at the units of 0.01 C, ie. 100 => 1.00 C and -100 => -1.00 C.
nRF52 returns temperature in units of 0.25 C, ie. 4 => 1.00 C and -4 => -1.00 C. We multiply the nRF52 value by 25 to give it the same scale as BME280 results: (4*25) = 100 => 1.00 C, (-4*25) = -100 => -1.00 C.
I measured one Kickstarter-era tag with 1.2.12 against 3 “various” RuuviTags with BME280 running 1.2.12 in freezer, fridge and office:
Environment BME280 nRF52 Difference
Freezer -19.14 C -22.75 C -3.61 C
Fridge 6,81 C 4.25 C -2.56 C
Office 22.32 C 20.25 C -2.07 C
It seems to me that there is some gain error in my sensor too, but nowhere near as dramatic as in yours and my piece is within the specified ± 4 C.
I’d think that this issue is in your sensor internal calibration, and not a larger problem in all RuuviTags.
Kickstarter-era tags are past of our one year warranty, but I can compile a firmware with a constant correction factor just for you if you calculate the desired correction