@@ -20,6 +20,7 @@ Distributed as-is; no warranty is given.
20
20
******************************************************************************/
21
21
// See SparkFunBME280.h for additional topology notes.
22
22
23
+ #include < math.h>
23
24
#include " SparkFunBME280.h"
24
25
25
26
// ****************************************************************************//
@@ -355,6 +356,29 @@ void BME280::reset( void )
355
356
356
357
}
357
358
359
+ // ****************************************************************************//
360
+ //
361
+ // Burst Measurement Section
362
+ //
363
+ // ****************************************************************************//
364
+
365
+ // Read all sensor registers as a burst. See BME280 Datasheet section 4. Data readout
366
+ // tempScale = 0 for Celsius scale (default setting)
367
+ // tempScale = 1 for Fahrenheit scale
368
+ void BME280::readAllMeasurements (BME280_SensorMeasurements *measurements, byte tempScale){
369
+
370
+ uint8_t dataBurst[8 ];
371
+ readRegisterRegion (dataBurst, BME280_MEASUREMENTS_REG, 8 );
372
+
373
+ if (tempScale == 0 ){
374
+ readTempCFromBurst (dataBurst, measurements);
375
+ }else {
376
+ readTempFFromBurst (dataBurst, measurements);
377
+ }
378
+ readFloatPressureFromBurst (dataBurst, measurements);
379
+ readFloatHumidityFromBurst (dataBurst, measurements);
380
+ }
381
+
358
382
// ****************************************************************************//
359
383
//
360
384
// Pressure Section
@@ -390,6 +414,37 @@ float BME280::readFloatPressure( void )
390
414
391
415
}
392
416
417
+ void BME280::readFloatPressureFromBurst (uint8_t buffer[], BME280_SensorMeasurements *measurements)
418
+ {
419
+
420
+ // Set pressure in Pa as unsigned 32 bit integer in Q24.8 format (24 integer bits and 8 fractional bits).
421
+ // Output value of “24674867” represents 24674867/256 = 96386.2 Pa = 963.862 hPa
422
+
423
+ int32_t adc_P = ((uint32_t )buffer[0 ] << 12 ) | ((uint32_t )buffer[1 ] << 4 ) | ((buffer[2 ] >> 4 ) & 0x0F );
424
+
425
+ int64_t var1, var2, p_acc;
426
+ var1 = ((int64_t )t_fine) - 128000 ;
427
+ var2 = var1 * var1 * (int64_t )calibration.dig_P6 ;
428
+ var2 = var2 + ((var1 * (int64_t )calibration.dig_P5 )<<17 );
429
+ var2 = var2 + (((int64_t )calibration.dig_P4 )<<35 );
430
+ var1 = ((var1 * var1 * (int64_t )calibration.dig_P3 )>>8 ) + ((var1 * (int64_t )calibration.dig_P2 )<<12 );
431
+ var1 = (((((int64_t )1 )<<47 )+var1))*((int64_t )calibration.dig_P1 )>>33 ;
432
+ if (var1 == 0 )
433
+ {
434
+ measurements->pressure = 0 ; // avoid exception caused by division by zero
435
+ }
436
+ else
437
+ {
438
+ p_acc = 1048576 - adc_P;
439
+ p_acc = (((p_acc<<31 ) - var2)*3125 )/var1;
440
+ var1 = (((int64_t )calibration.dig_P9 ) * (p_acc>>13 ) * (p_acc>>13 )) >> 25 ;
441
+ var2 = (((int64_t )calibration.dig_P8 ) * p_acc) >> 19 ;
442
+ p_acc = ((p_acc + var1 + var2) >> 8 ) + (((int64_t )calibration.dig_P7 )<<4 );
443
+
444
+ measurements->pressure = (float )p_acc / 256.0 ;
445
+ }
446
+ }
447
+
393
448
// Sets the internal variable _referencePressure so the altitude is calculated properly.
394
449
// This is also known as "sea level pressure" and is in Pascals. The value is probably
395
450
// within 10% of 101325. This varies based on the weather:
@@ -459,6 +514,25 @@ float BME280::readFloatHumidity( void )
459
514
return (float )(var1>>12 ) / 1024.0 ;
460
515
}
461
516
517
+ void BME280::readFloatHumidityFromBurst (uint8_t buffer[], BME280_SensorMeasurements *measurements)
518
+ {
519
+
520
+ // Set humidity in %RH as unsigned 32 bit integer in Q22. 10 format (22 integer and 10 fractional bits).
521
+ // Output value of “47445” represents 47445/1024 = 46. 333 %RH
522
+ int32_t adc_H = ((uint32_t )buffer[6 ] << 8 ) | ((uint32_t )buffer[7 ]);
523
+
524
+ int32_t var1;
525
+ var1 = (t_fine - ((int32_t )76800 ));
526
+ var1 = (((((adc_H << 14 ) - (((int32_t )calibration.dig_H4 ) << 20 ) - (((int32_t )calibration.dig_H5 ) * var1)) +
527
+ ((int32_t )16384 )) >> 15 ) * (((((((var1 * ((int32_t )calibration.dig_H6 )) >> 10 ) * (((var1 * ((int32_t )calibration.dig_H3 )) >> 11 ) + ((int32_t )32768 ))) >> 10 ) + ((int32_t )2097152 )) *
528
+ ((int32_t )calibration.dig_H2 ) + 8192 ) >> 14 ));
529
+ var1 = (var1 - (((((var1 >> 15 ) * (var1 >> 15 )) >> 7 ) * ((int32_t )calibration.dig_H1 )) >> 4 ));
530
+ var1 = (var1 < 0 ? 0 : var1);
531
+ var1 = (var1 > 419430400 ? 419430400 : var1);
532
+
533
+ measurements->humidity = (float )(var1>>12 ) / 1024.0 ;
534
+ }
535
+
462
536
// ****************************************************************************//
463
537
//
464
538
// Temperature Section
@@ -494,6 +568,29 @@ float BME280::readTempC( void )
494
568
return output;
495
569
}
496
570
571
+ float BME280::readTempFromBurst (uint8_t buffer[])
572
+ {
573
+ int32_t adc_T = ((uint32_t )buffer[3 ] << 12 ) | ((uint32_t )buffer[4 ] << 4 ) | ((buffer[5 ] >> 4 ) & 0x0F );
574
+
575
+ // By datasheet, calibrate
576
+ int64_t var1, var2;
577
+
578
+ var1 = ((((adc_T>>3 ) - ((int32_t )calibration.dig_T1 <<1 ))) * ((int32_t )calibration.dig_T2 )) >> 11 ;
579
+ var2 = (((((adc_T>>4 ) - ((int32_t )calibration.dig_T1 )) * ((adc_T>>4 ) - ((int32_t )calibration.dig_T1 ))) >> 12 ) *
580
+ ((int32_t )calibration.dig_T3 )) >> 14 ;
581
+ t_fine = var1 + var2;
582
+ float output = (t_fine * 5 + 128 ) >> 8 ;
583
+
584
+ output = output / 100 + settings.tempCorrection ;
585
+
586
+ return output;
587
+ }
588
+
589
+ void BME280::readTempCFromBurst (uint8_t buffer[], BME280_SensorMeasurements *measurements)
590
+ {
591
+ measurements->temperature = readTempFromBurst (buffer);
592
+ }
593
+
497
594
float BME280::readTempF ( void )
498
595
{
499
596
float output = readTempC ();
@@ -502,6 +599,14 @@ float BME280::readTempF( void )
502
599
return output;
503
600
}
504
601
602
+ void BME280::readTempFFromBurst (uint8_t buffer[], BME280_SensorMeasurements *measurements)
603
+ {
604
+ float output = readTempFromBurst (buffer);
605
+ output = (output * 9 ) / 5 + 32 ;
606
+
607
+ measurements->temperature = output;
608
+ }
609
+
505
610
// ****************************************************************************//
506
611
//
507
612
// Dew point Section
0 commit comments