@@ -421,28 +421,24 @@ float Adafruit_BME280::readTemperature(void) {
421
421
return NAN;
422
422
adc_T >>= 4 ;
423
423
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 ;
433
428
434
429
t_fine = var1 + var2 + t_fine_adjust;
435
430
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 ;
438
434
}
439
435
440
436
/* !
441
437
* @brief Returns the pressure from the sensor
442
438
* @returns the pressure value (in Pascal) read from the device
443
439
*/
444
440
float Adafruit_BME280::readPressure (void ) {
445
- int64_t var1, var2, p ;
441
+ int64_t var1, var2, var3, var4 ;
446
442
447
443
readTemperature (); // must be done first to get t_fine
448
444
@@ -453,61 +449,59 @@ float Adafruit_BME280::readPressure(void) {
453
449
454
450
var1 = ((int64_t )t_fine) - 128000 ;
455
451
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 ;
462
458
463
459
if (var1 == 0 ) {
464
460
return 0 ; // avoid exception caused by division by zero
465
461
}
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 ;
470
462
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;
473
473
}
474
474
475
475
/* !
476
476
* @brief Returns the humidity from the sensor
477
477
* @returns the humidity value read from the device
478
478
*/
479
479
float Adafruit_BME280::readHumidity (void ) {
480
+ int32_t var1, var2, var3, var4, var5;
481
+
480
482
readTemperature (); // must be done first to get t_fine
481
483
482
484
int32_t adc_H = read16 (BME280_REGISTER_HUMIDDATA);
483
485
if (adc_H == 0x8000 ) // value in case humidity measurement was disabled
484
486
return NAN;
485
487
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 ;
511
505
}
512
506
513
507
/* !
0 commit comments