@@ -409,28 +409,24 @@ float Adafruit_BME280::readTemperature(void) {
409
409
return NAN;
410
410
adc_T >>= 4 ;
411
411
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 ;
421
416
422
417
t_fine = var1 + var2;
423
418
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 ;
426
422
}
427
423
428
424
/* !
429
425
* @brief Returns the pressure from the sensor
430
426
* @returns the pressure value (in Pascal) read from the device
431
427
*/
432
428
float Adafruit_BME280::readPressure (void ) {
433
- int64_t var1, var2, p ;
429
+ int64_t var1, var2, var3, var4 ;
434
430
435
431
readTemperature (); // must be done first to get t_fine
436
432
@@ -441,63 +437,60 @@ float Adafruit_BME280::readPressure(void) {
441
437
442
438
var1 = ((int64_t )t_fine) - 128000 ;
443
439
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 ;
450
445
451
446
if (var1 == 0 ) {
452
- return 0 ; // avoid exception caused by division by zero
447
+ return 0 ; // avoid exception caused by division by zero
453
448
}
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 ;
458
449
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 ;
461
459
}
462
460
463
461
/* !
464
462
* @brief Returns the humidity from the sensor
465
463
* @returns the humidity value read from the device
466
464
*/
467
465
float Adafruit_BME280::readHumidity (void ) {
466
+ int32_t var1, var2, var3, var4, var5;
467
+
468
468
readTemperature (); // must be done first to get t_fine
469
469
470
470
int32_t adc_H = read16 (BME280_REGISTER_HUMIDDATA);
471
471
if (adc_H == 0x8000 ) // value in case humidity measurement was disabled
472
472
return NAN;
473
473
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 ;
499
491
}
500
492
493
+
501
494
/* !
502
495
* Calculates the altitude (in meters) from the specified atmospheric
503
496
* pressure (in hPa), and sea-level pressure (in hPa).
0 commit comments