@@ -20,6 +20,7 @@ Distributed as-is; no warranty is given.
2020******************************************************************************/
2121// See SparkFunBME280.h for additional topology notes.
2222
23+ #include < math.h>
2324#include " SparkFunBME280.h"
2425
2526// ****************************************************************************//
@@ -355,6 +356,29 @@ void BME280::reset( void )
355356
356357}
357358
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+
358382// ****************************************************************************//
359383//
360384// Pressure Section
@@ -390,6 +414,37 @@ float BME280::readFloatPressure( void )
390414
391415}
392416
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+
393448// Sets the internal variable _referencePressure so the altitude is calculated properly.
394449// This is also known as "sea level pressure" and is in Pascals. The value is probably
395450// within 10% of 101325. This varies based on the weather:
@@ -459,6 +514,25 @@ float BME280::readFloatHumidity( void )
459514 return (float )(var1>>12 ) / 1024.0 ;
460515}
461516
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+
462536// ****************************************************************************//
463537//
464538// Temperature Section
@@ -494,6 +568,29 @@ float BME280::readTempC( void )
494568 return output;
495569}
496570
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+
497594float BME280::readTempF ( void )
498595{
499596 float output = readTempC ();
@@ -502,6 +599,14 @@ float BME280::readTempF( void )
502599 return output;
503600}
504601
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+
505610// ****************************************************************************//
506611//
507612// Dew point Section
0 commit comments