getValues method

BME280result getValues()

Returns BME280result with temperature, pressure and humidity (only BME280).

Implementation

BME280result getValues() {
  // Read the pressure, temperature, and humidity registers
  var buffer = ByteBuffer(
      _readByteBlock(pressMsbReg, _model == BME280model.bmp280 ? 6 : 8),
      isI2C ? ByteBufferSrc.i2c : ByteBufferSrc.spi,
      bitOrder);

  // Unpack the raw 20-bit unsigned pressure value
  var adcP = ((buffer.getInt8() & 0xff) << 12) |
      ((buffer.getInt8() & 0xff) << 4) |
      ((buffer.getInt8() & 0xf0) >> 4);
  // Unpack the raw 20-bit unsigned temperature value
  var adcT = ((buffer.getInt8() & 0xff) << 12) |
      ((buffer.getInt8() & 0xff) << 4) |
      ((buffer.getInt8() & 0xf0) >> 4);
  var adcH = 0;
  if (_model == BME280model.bme280) {
    // Unpack the raw 16-bit unsigned humidity value
    adcH = ((buffer.getInt8() & 0xff) << 8) | (buffer.getInt8() & 0xff);
  }

  var tvar1 = (((adcT >> 3) - (_digT1 << 1)) * _digT2) >> 11;
  var tvar2 =
      (((((adcT >> 4) - _digT1) * ((adcT >> 4) - _digT1)) >> 12) * _digT3) >>
          14;
  var tFine = tvar1 + tvar2;

  var temp = (tFine * 5 + 128) >> 8;

  var pvar1 = tFine - 128000;
  var pvar2 = pvar1 * pvar1 * _digP6;
  pvar2 = pvar2 + ((pvar1 * _digP5) << 17);
  pvar2 = pvar2 + ((_digP4) << 35);
  pvar1 = ((pvar1 * pvar1 * _digP3) >> 8) + ((pvar1 * _digP2) << 12);
  pvar1 = (((1 << 47) + pvar1)) * _digP1 >> 33;
  int pressure;
  if (pvar1 == 0) {
    pressure = 0; // Avoid exception caused by division by zero
  } else {
    pressure = 1048576 - adcP;
    pressure = (((pressure << 31) - pvar2) * 3125) ~/ pvar1;
    pvar1 = (_digP9 * (pressure >> 13) * (pressure >> 13)) >> 25;
    pvar2 = (_digP8 * pressure) >> 19;
    pressure = ((pressure + pvar1 + pvar2) >> 8) + (_digP7 << 4);
  }

  var humidity = 0;
  if (_model == BME280model.bme280) {
    var vX1u32r = tFine - 76800;
    vX1u32r =
        ((((adcH << 14) - (_digH4 << 20) - (_digH5 * vX1u32r)) + 16384) >>
                15) *
            (((((((vX1u32r * _digH6) >> 10) *
                                    (((vX1u32r * _digH3) >> 11) + 32768)) >>
                                10) +
                            2097152) *
                        _digH2 +
                    8192) >>
                14);
    vX1u32r = vX1u32r -
        (((((vX1u32r >> 15) * (vX1u32r >> 15)) >> 7) * _digH1) >> 4);
    vX1u32r = vX1u32r < 0 ? 0 : vX1u32r;
    vX1u32r = vX1u32r > 419430400 ? 419430400 : vX1u32r;
    humidity = (vX1u32r) >> 12;
  }

  return BME280result(temp / 100.0, pressure / 25600.0, humidity / 1024.0);
}