Skip to content

Commit a5fcef0

Browse files
authored
Merge pull request #79 from elli89/compensation
use compensation from reference implementation
2 parents ee53e8b + 6acf82e commit a5fcef0

File tree

1 file changed

+43
-49
lines changed

1 file changed

+43
-49
lines changed

Adafruit_BME280.cpp

Lines changed: 43 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -421,28 +421,24 @@ float Adafruit_BME280::readTemperature(void) {
421421
return NAN;
422422
adc_T >>= 4;
423423

424-
var1 = ((((adc_T >> 3) - ((int32_t)_bme280_calib.dig_T1 << 1))) *
425-
((int32_t)_bme280_calib.dig_T2)) >>
426-
11;
427-
428-
var2 = (((((adc_T >> 4) - ((int32_t)_bme280_calib.dig_T1)) *
429-
((adc_T >> 4) - ((int32_t)_bme280_calib.dig_T1))) >>
430-
12) *
431-
((int32_t)_bme280_calib.dig_T3)) >>
432-
14;
424+
var1 = (int32_t)((adc_T / 8) - ((int32_t)_bme280_calib.dig_T1 * 2));
425+
var1 = (var1 * ((int32_t)_bme280_calib.dig_T2)) / 2048;
426+
var2 = (int32_t)((adc_T / 16) - ((int32_t)_bme280_calib.dig_T1));
427+
var2 = (((var2 * var2) / 4096) * ((int32_t)_bme280_calib.dig_T3)) / 16384;
433428

434429
t_fine = var1 + var2 + t_fine_adjust;
435430

436-
float T = (t_fine * 5 + 128) >> 8;
437-
return T / 100;
431+
int32_t T = (t_fine * 5 + 128) / 256;
432+
433+
return (float)T / 100;
438434
}
439435

440436
/*!
441437
* @brief Returns the pressure from the sensor
442438
* @returns the pressure value (in Pascal) read from the device
443439
*/
444440
float Adafruit_BME280::readPressure(void) {
445-
int64_t var1, var2, p;
441+
int64_t var1, var2, var3, var4;
446442

447443
readTemperature(); // must be done first to get t_fine
448444

@@ -453,61 +449,59 @@ float Adafruit_BME280::readPressure(void) {
453449

454450
var1 = ((int64_t)t_fine) - 128000;
455451
var2 = var1 * var1 * (int64_t)_bme280_calib.dig_P6;
456-
var2 = var2 + ((var1 * (int64_t)_bme280_calib.dig_P5) << 17);
457-
var2 = var2 + (((int64_t)_bme280_calib.dig_P4) << 35);
458-
var1 = ((var1 * var1 * (int64_t)_bme280_calib.dig_P3) >> 8) +
459-
((var1 * (int64_t)_bme280_calib.dig_P2) << 12);
460-
var1 =
461-
(((((int64_t)1) << 47) + var1)) * ((int64_t)_bme280_calib.dig_P1) >> 33;
452+
var2 = var2 + ((var1 * (int64_t)_bme280_calib.dig_P5) * 131072);
453+
var2 = var2 + (((int64_t)_bme280_calib.dig_P4) * 34359738368);
454+
var1 = ((var1 * var1 * (int64_t)_bme280_calib.dig_P3) / 256) +
455+
((var1 * ((int64_t)_bme280_calib.dig_P2) * 4096));
456+
var3 = ((int64_t)1) * 140737488355328;
457+
var1 = (var3 + var1) * ((int64_t)_bme280_calib.dig_P1) / 8589934592;
462458

463459
if (var1 == 0) {
464460
return 0; // avoid exception caused by division by zero
465461
}
466-
p = 1048576 - adc_P;
467-
p = (((p << 31) - var2) * 3125) / var1;
468-
var1 = (((int64_t)_bme280_calib.dig_P9) * (p >> 13) * (p >> 13)) >> 25;
469-
var2 = (((int64_t)_bme280_calib.dig_P8) * p) >> 19;
470462

471-
p = ((p + var1 + var2) >> 8) + (((int64_t)_bme280_calib.dig_P7) << 4);
472-
return (float)p / 256;
463+
var4 = 1048576 - adc_P;
464+
var4 = (((var4 * 2147483648) - var2) * 3125) / var1;
465+
var1 = (((int64_t)_bme280_calib.dig_P9) * (var4 / 8192) * (var4 / 8192)) /
466+
33554432;
467+
var2 = (((int64_t)_bme280_calib.dig_P8) * var4) / 524288;
468+
var4 = ((var4 + var1 + var2) / 256) + (((int64_t)_bme280_calib.dig_P7) * 16);
469+
470+
float P = var4 / 256.0;
471+
472+
return P;
473473
}
474474

475475
/*!
476476
* @brief Returns the humidity from the sensor
477477
* @returns the humidity value read from the device
478478
*/
479479
float Adafruit_BME280::readHumidity(void) {
480+
int32_t var1, var2, var3, var4, var5;
481+
480482
readTemperature(); // must be done first to get t_fine
481483

482484
int32_t adc_H = read16(BME280_REGISTER_HUMIDDATA);
483485
if (adc_H == 0x8000) // value in case humidity measurement was disabled
484486
return NAN;
485487

486-
int32_t v_x1_u32r;
487-
488-
v_x1_u32r = (t_fine - ((int32_t)76800));
489-
490-
v_x1_u32r = (((((adc_H << 14) - (((int32_t)_bme280_calib.dig_H4) << 20) -
491-
(((int32_t)_bme280_calib.dig_H5) * v_x1_u32r)) +
492-
((int32_t)16384)) >>
493-
15) *
494-
(((((((v_x1_u32r * ((int32_t)_bme280_calib.dig_H6)) >> 10) *
495-
(((v_x1_u32r * ((int32_t)_bme280_calib.dig_H3)) >> 11) +
496-
((int32_t)32768))) >>
497-
10) +
498-
((int32_t)2097152)) *
499-
((int32_t)_bme280_calib.dig_H2) +
500-
8192) >>
501-
14));
502-
503-
v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) *
504-
((int32_t)_bme280_calib.dig_H1)) >>
505-
4));
506-
507-
v_x1_u32r = (v_x1_u32r < 0) ? 0 : v_x1_u32r;
508-
v_x1_u32r = (v_x1_u32r > 419430400) ? 419430400 : v_x1_u32r;
509-
float h = (v_x1_u32r >> 12);
510-
return h / 1024.0;
488+
var1 = t_fine - ((int32_t)76800);
489+
var2 = (int32_t)(adc_H * 16384);
490+
var3 = (int32_t)(((int32_t)_bme280_calib.dig_H4) * 1048576);
491+
var4 = ((int32_t)_bme280_calib.dig_H5) * var1;
492+
var5 = (((var2 - var3) - var4) + (int32_t)16384) / 32768;
493+
var2 = (var1 * ((int32_t)_bme280_calib.dig_H6)) / 1024;
494+
var3 = (var1 * ((int32_t)_bme280_calib.dig_H3)) / 2048;
495+
var4 = ((var2 * (var3 + (int32_t)32768)) / 1024) + (int32_t)2097152;
496+
var2 = ((var4 * ((int32_t)_bme280_calib.dig_H2)) + 8192) / 16384;
497+
var3 = var5 * var2;
498+
var4 = ((var3 / 32768) * (var3 / 32768)) / 128;
499+
var5 = var3 - ((var4 * ((int32_t)_bme280_calib.dig_H1)) / 16);
500+
var5 = (var5 < 0 ? 0 : var5);
501+
var5 = (var5 > 419430400 ? 419430400 : var5);
502+
uint32_t H = (uint32_t)(var5 / 4096);
503+
504+
return (float)H / 1024.0;
511505
}
512506

513507
/*!

0 commit comments

Comments
 (0)