Skip to content

Commit 8edea61

Browse files
committed
use compensation from reference implementation
1 parent 6508738 commit 8edea61

File tree

1 file changed

+43
-50
lines changed

1 file changed

+43
-50
lines changed

Adafruit_BME280.cpp

Lines changed: 43 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -409,28 +409,24 @@ float Adafruit_BME280::readTemperature(void) {
409409
return NAN;
410410
adc_T >>= 4;
411411

412-
var1 = ((((adc_T >> 3) - ((int32_t)_bme280_calib.dig_T1 << 1))) *
413-
((int32_t)_bme280_calib.dig_T2)) >>
414-
11;
415-
416-
var2 = (((((adc_T >> 4) - ((int32_t)_bme280_calib.dig_T1)) *
417-
((adc_T >> 4) - ((int32_t)_bme280_calib.dig_T1))) >>
418-
12) *
419-
((int32_t)_bme280_calib.dig_T3)) >>
420-
14;
412+
var1 = (int32_t)((adc_T / 8) - ((int32_t)_bme280_calib.dig_T1 * 2));
413+
var1 = (var1 * ((int32_t)_bme280_calib.dig_T2)) / 2048;
414+
var2 = (int32_t)((adc_T / 16) - ((int32_t)_bme280_calib.dig_T1));
415+
var2 = (((var2 * var2) / 4096) * ((int32_t)_bme280_calib.dig_T3)) / 16384;
421416

422417
t_fine = var1 + var2;
423418

424-
float T = (t_fine * 5 + 128) >> 8;
425-
return T / 100;
419+
int32_t T = (t_fine * 5 + 128) / 256;
420+
421+
return (float)T / 100;
426422
}
427423

428424
/*!
429425
* @brief Returns the pressure from the sensor
430426
* @returns the pressure value (in Pascal) read from the device
431427
*/
432428
float Adafruit_BME280::readPressure(void) {
433-
int64_t var1, var2, p;
429+
int64_t var1, var2, var3, var4;
434430

435431
readTemperature(); // must be done first to get t_fine
436432

@@ -441,63 +437,60 @@ float Adafruit_BME280::readPressure(void) {
441437

442438
var1 = ((int64_t)t_fine) - 128000;
443439
var2 = var1 * var1 * (int64_t)_bme280_calib.dig_P6;
444-
var2 = var2 + ((var1 * (int64_t)_bme280_calib.dig_P5) << 17);
445-
var2 = var2 + (((int64_t)_bme280_calib.dig_P4) << 35);
446-
var1 = ((var1 * var1 * (int64_t)_bme280_calib.dig_P3) >> 8) +
447-
((var1 * (int64_t)_bme280_calib.dig_P2) << 12);
448-
var1 =
449-
(((((int64_t)1) << 47) + var1)) * ((int64_t)_bme280_calib.dig_P1) >> 33;
440+
var2 = var2 + ((var1 * (int64_t)_bme280_calib.dig_P5) * 131072);
441+
var2 = var2 + (((int64_t)_bme280_calib.dig_P4) * 34359738368);
442+
var1 = ((var1 * var1 * (int64_t)_bme280_calib.dig_P3) / 256) + ((var1 * ((int64_t)_bme280_calib.dig_P2) * 4096));
443+
var3 = ((int64_t)1) * 140737488355328;
444+
var1 = (var3 + var1) * ((int64_t)_bme280_calib.dig_P1) / 8589934592;
450445

451446
if (var1 == 0) {
452-
return 0; // avoid exception caused by division by zero
447+
return 0; // avoid exception caused by division by zero
453448
}
454-
p = 1048576 - adc_P;
455-
p = (((p << 31) - var2) * 3125) / var1;
456-
var1 = (((int64_t)_bme280_calib.dig_P9) * (p >> 13) * (p >> 13)) >> 25;
457-
var2 = (((int64_t)_bme280_calib.dig_P8) * p) >> 19;
458449

459-
p = ((p + var1 + var2) >> 8) + (((int64_t)_bme280_calib.dig_P7) << 4);
460-
return (float)p / 256;
450+
var4 = 1048576 - adc_P;
451+
var4 = (((var4 * 2147483648) - var2) * 3125) / var1;
452+
var1 = (((int64_t)_bme280_calib.dig_P9) * (var4 / 8192) * (var4 / 8192)) / 33554432;
453+
var2 = (((int64_t)_bme280_calib.dig_P8) * var4) / 524288;
454+
var4 = ((var4 + var1 + var2) / 256) + (((int64_t)_bme280_calib.dig_P7) * 16);
455+
456+
uint32_t P = (uint32_t)(((var4 / 2) * 100) / 128);
457+
458+
return (float)P / 256;
461459
}
462460

463461
/*!
464462
* @brief Returns the humidity from the sensor
465463
* @returns the humidity value read from the device
466464
*/
467465
float Adafruit_BME280::readHumidity(void) {
466+
int32_t var1, var2, var3, var4, var5;
467+
468468
readTemperature(); // must be done first to get t_fine
469469

470470
int32_t adc_H = read16(BME280_REGISTER_HUMIDDATA);
471471
if (adc_H == 0x8000) // value in case humidity measurement was disabled
472472
return NAN;
473473

474-
int32_t v_x1_u32r;
475-
476-
v_x1_u32r = (t_fine - ((int32_t)76800));
477-
478-
v_x1_u32r = (((((adc_H << 14) - (((int32_t)_bme280_calib.dig_H4) << 20) -
479-
(((int32_t)_bme280_calib.dig_H5) * v_x1_u32r)) +
480-
((int32_t)16384)) >>
481-
15) *
482-
(((((((v_x1_u32r * ((int32_t)_bme280_calib.dig_H6)) >> 10) *
483-
(((v_x1_u32r * ((int32_t)_bme280_calib.dig_H3)) >> 11) +
484-
((int32_t)32768))) >>
485-
10) +
486-
((int32_t)2097152)) *
487-
((int32_t)_bme280_calib.dig_H2) +
488-
8192) >>
489-
14));
490-
491-
v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) *
492-
((int32_t)_bme280_calib.dig_H1)) >>
493-
4));
494-
495-
v_x1_u32r = (v_x1_u32r < 0) ? 0 : v_x1_u32r;
496-
v_x1_u32r = (v_x1_u32r > 419430400) ? 419430400 : v_x1_u32r;
497-
float h = (v_x1_u32r >> 12);
498-
return h / 1024.0;
474+
var1 = calib_data->t_fine - ((int32_t)76800);
475+
var2 = (int32_t)(adc_H * 16384);
476+
var3 = (int32_t)(((int32_t)_bme280_calib.dig_H4) * 1048576);
477+
var4 = ((int32_t)_bme280_calib.dig_H5) * var1;
478+
var5 = (((var2 - var3) - var4) + (int32_t)16384) / 32768;
479+
var2 = (var1 * ((int32_t)_bme280_calib.dig_H6)) / 1024;
480+
var3 = (var1 * ((int32_t)_bme280_calib.dig_H3)) / 2048;
481+
var4 = ((var2 * (var3 + (int32_t)32768)) / 1024) + (int32_t)2097152;
482+
var2 = ((var4 * ((int32_t)_bme280_calib.dig_H2)) + 8192) / 16384;
483+
var3 = var5 * var2;
484+
var4 = ((var3 / 32768) * (var3 / 32768)) / 128;
485+
var5 = var3 - ((var4 * ((int32_t)_bme280_calib.dig_H1)) / 16);
486+
var5 = (var5 < 0 ? 0 : var5);
487+
var5 = (var5 > 419430400 ? 419430400 : var5);
488+
uint32_t H = (uint32_t)(var5 / 4096);
489+
490+
return (float)H / 1024.0;
499491
}
500492

493+
501494
/*!
502495
* Calculates the altitude (in meters) from the specified atmospheric
503496
* pressure (in hPa), and sea-level pressure (in hPa).

0 commit comments

Comments
 (0)