bme280, nRF51822 internal temperature, oled ssd1306 128x64. Короче сборный тест.

Dependencies:   mbed SSD1306_128x64_I2C BLE_API nRF51822 Buzzer

Committer:
mamont090671
Date:
Sat Nov 30 04:49:09 2019 +0000
Revision:
2:4700f7e71737
nRF51822

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mamont090671 2:4700f7e71737 1 /*
mamont090671 2:4700f7e71737 2 bme280.cpp - driver for Bosch Sensortec BME280 combined humidity and pressure sensor.
mamont090671 2:4700f7e71737 3
mamont090671 2:4700f7e71737 4 Copyright (c) 2015 Elektor
mamont090671 2:4700f7e71737 5
mamont090671 2:4700f7e71737 6 26/11/2015 - CPV, Initial release.
mamont090671 2:4700f7e71737 7
mamont090671 2:4700f7e71737 8 This library is free software; you can redistribute it and/or
mamont090671 2:4700f7e71737 9 modify it under the terms of the GNU Lesser General Public
mamont090671 2:4700f7e71737 10 License as published by the Free Software Foundation; either
mamont090671 2:4700f7e71737 11 version 2.1 of the License, or (at your option) any later version.
mamont090671 2:4700f7e71737 12
mamont090671 2:4700f7e71737 13 This library is distributed in the hope that it will be useful,
mamont090671 2:4700f7e71737 14 but WITHOUT ANY WARRANTY; without even the implied warranty of
mamont090671 2:4700f7e71737 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
mamont090671 2:4700f7e71737 16 Lesser General Public License for more details.
mamont090671 2:4700f7e71737 17
mamont090671 2:4700f7e71737 18 You should have received a copy of the GNU Lesser General
mamont090671 2:4700f7e71737 19 Public License along with this library; if not, write to the
mamont090671 2:4700f7e71737 20 Free Software Foundation, Inc., 59 Temple Place, Suite 330,
mamont090671 2:4700f7e71737 21 Boston, MA 02111-1307 USA
mamont090671 2:4700f7e71737 22
mamont090671 2:4700f7e71737 23 */
mamont090671 2:4700f7e71737 24
mamont090671 2:4700f7e71737 25 #include "bme280.h"
mamont090671 2:4700f7e71737 26
mamont090671 2:4700f7e71737 27
mamont090671 2:4700f7e71737 28 BME280::BME280(void)
mamont090671 2:4700f7e71737 29 {
mamont090671 2:4700f7e71737 30 _i2c_address = 0;
mamont090671 2:4700f7e71737 31 _t_fine = 0;
mamont090671 2:4700f7e71737 32 _temperature = 0;
mamont090671 2:4700f7e71737 33 _pressure = 0;
mamont090671 2:4700f7e71737 34 _humidity = 0;
mamont090671 2:4700f7e71737 35 clearCalibrationData();
mamont090671 2:4700f7e71737 36 }
mamont090671 2:4700f7e71737 37
mamont090671 2:4700f7e71737 38
mamont090671 2:4700f7e71737 39 void BME280::clearCalibrationData(void)
mamont090671 2:4700f7e71737 40 {
mamont090671 2:4700f7e71737 41 _dig_T1 = 0;
mamont090671 2:4700f7e71737 42 _dig_T2 = 0;
mamont090671 2:4700f7e71737 43 _dig_T3 = 0;
mamont090671 2:4700f7e71737 44 _dig_P1 = 0;
mamont090671 2:4700f7e71737 45 _dig_P2 = 0;
mamont090671 2:4700f7e71737 46 _dig_P3 = 0;
mamont090671 2:4700f7e71737 47 _dig_P4 = 0;
mamont090671 2:4700f7e71737 48 _dig_P5 = 0;
mamont090671 2:4700f7e71737 49 _dig_P6 = 0;
mamont090671 2:4700f7e71737 50 _dig_P7 = 0;
mamont090671 2:4700f7e71737 51 _dig_P8 = 0;
mamont090671 2:4700f7e71737 52 _dig_P9 = 0;
mamont090671 2:4700f7e71737 53 _dig_H1 = 0;
mamont090671 2:4700f7e71737 54 _dig_H2 = 0;
mamont090671 2:4700f7e71737 55 _dig_H3 = 0;
mamont090671 2:4700f7e71737 56 _dig_H4 = 0;
mamont090671 2:4700f7e71737 57 _dig_H5 = 0;
mamont090671 2:4700f7e71737 58 _dig_H6 = 0;
mamont090671 2:4700f7e71737 59 }
mamont090671 2:4700f7e71737 60
mamont090671 2:4700f7e71737 61
mamont090671 2:4700f7e71737 62 uint8_t BME280::begin(uint8_t i2cAddress)
mamont090671 2:4700f7e71737 63 {
mamont090671 2:4700f7e71737 64 _i2c_address = i2cAddress;
mamont090671 2:4700f7e71737 65 if (readId()==BME280_ID)
mamont090671 2:4700f7e71737 66 {
mamont090671 2:4700f7e71737 67 clearCalibrationData();
mamont090671 2:4700f7e71737 68 readCalibrationData();
mamont090671 2:4700f7e71737 69 return 0;
mamont090671 2:4700f7e71737 70 }
mamont090671 2:4700f7e71737 71 return (uint8_t)-1;
mamont090671 2:4700f7e71737 72 }
mamont090671 2:4700f7e71737 73
mamont090671 2:4700f7e71737 74
mamont090671 2:4700f7e71737 75 void BME280::busWrite(uint8_t *p_data, uint8_t data_size, uint8_t repeated_start)
mamont090671 2:4700f7e71737 76 {
mamont090671 2:4700f7e71737 77 if (_i2c_address==BME280_I2C_ADDRESS1 || _i2c_address==BME280_I2C_ADDRESS2)
mamont090671 2:4700f7e71737 78 {
mamont090671 2:4700f7e71737 79 // Assume I2C bus.
mamont090671 2:4700f7e71737 80 i2cWrite(_i2c_address,p_data,data_size,repeated_start);
mamont090671 2:4700f7e71737 81 }
mamont090671 2:4700f7e71737 82 /* else
mamont090671 2:4700f7e71737 83 {
mamont090671 2:4700f7e71737 84 // Assume SPI bus.
mamont090671 2:4700f7e71737 85 // First byte is supposed to be the address of the register to write to, set R/~W bit to 0.
mamont090671 2:4700f7e71737 86 p_data[0] &= 0x7f;
mamont090671 2:4700f7e71737 87 spiWrite(p_data,data_size);
mamont090671 2:4700f7e71737 88 }*/
mamont090671 2:4700f7e71737 89 }
mamont090671 2:4700f7e71737 90
mamont090671 2:4700f7e71737 91
mamont090671 2:4700f7e71737 92 void BME280::busRead(uint8_t *p_data, uint8_t data_size)
mamont090671 2:4700f7e71737 93 {
mamont090671 2:4700f7e71737 94 if (_i2c_address==BME280_I2C_ADDRESS1 || _i2c_address==BME280_I2C_ADDRESS2)
mamont090671 2:4700f7e71737 95 {
mamont090671 2:4700f7e71737 96 // Assume I2C bus.
mamont090671 2:4700f7e71737 97 i2cRead(_i2c_address,p_data,data_size);
mamont090671 2:4700f7e71737 98 }
mamont090671 2:4700f7e71737 99 /** else
mamont090671 2:4700f7e71737 100 {
mamont090671 2:4700f7e71737 101 // Assume SPI bus.
mamont090671 2:4700f7e71737 102 // First byte is supposed to be the address of the register to write to, set R/~W bit to 1.
mamont090671 2:4700f7e71737 103 p_data[0] |= 0x80;
mamont090671 2:4700f7e71737 104 spiRead(p_data,data_size);
mamont090671 2:4700f7e71737 105 }**/
mamont090671 2:4700f7e71737 106 }
mamont090671 2:4700f7e71737 107
mamont090671 2:4700f7e71737 108
mamont090671 2:4700f7e71737 109 uint8_t BME280::readUint8(uint8_t reg)
mamont090671 2:4700f7e71737 110 {
mamont090671 2:4700f7e71737 111 uint8_t data;
mamont090671 2:4700f7e71737 112 busWrite(&reg,1,1); // Use repeated start.
mamont090671 2:4700f7e71737 113 busRead(&data,1); // Read one byte.
mamont090671 2:4700f7e71737 114 return data;
mamont090671 2:4700f7e71737 115 }
mamont090671 2:4700f7e71737 116
mamont090671 2:4700f7e71737 117
mamont090671 2:4700f7e71737 118 uint16_t BME280::readUint16(uint8_t reg)
mamont090671 2:4700f7e71737 119 {
mamont090671 2:4700f7e71737 120 uint8_t data[2];
mamont090671 2:4700f7e71737 121 uint16_t value;
mamont090671 2:4700f7e71737 122 busWrite(&reg,1,1); // Use repeated start.
mamont090671 2:4700f7e71737 123 busRead(data,2); // Read two bytes.
mamont090671 2:4700f7e71737 124 // Process as little endian, which is the case for calibration data.
mamont090671 2:4700f7e71737 125 value = data[1];
mamont090671 2:4700f7e71737 126 value = (value<<8) | data[0];
mamont090671 2:4700f7e71737 127 return value;
mamont090671 2:4700f7e71737 128 }
mamont090671 2:4700f7e71737 129
mamont090671 2:4700f7e71737 130
mamont090671 2:4700f7e71737 131 void BME280::readCalibrationData(void)
mamont090671 2:4700f7e71737 132 {
mamont090671 2:4700f7e71737 133 _dig_T1 = readUint16(BME280_CAL_T1);
mamont090671 2:4700f7e71737 134 _dig_T2 = (int16_t) readUint16(BME280_CAL_T2);
mamont090671 2:4700f7e71737 135 _dig_T3 = (int16_t) readUint16(BME280_CAL_T3);
mamont090671 2:4700f7e71737 136 _dig_P1 = readUint16(BME280_CAL_P1);
mamont090671 2:4700f7e71737 137 _dig_P2 = (int16_t) readUint16(BME280_CAL_P2);
mamont090671 2:4700f7e71737 138 _dig_P3 = (int16_t) readUint16(BME280_CAL_P3);
mamont090671 2:4700f7e71737 139 _dig_P4 = (int16_t) readUint16(BME280_CAL_P4);
mamont090671 2:4700f7e71737 140 _dig_P5 = (int16_t) readUint16(BME280_CAL_P5);
mamont090671 2:4700f7e71737 141 _dig_P6 = (int16_t) readUint16(BME280_CAL_P6);
mamont090671 2:4700f7e71737 142 _dig_P7 = (int16_t) readUint16(BME280_CAL_P7);
mamont090671 2:4700f7e71737 143 _dig_P8 = (int16_t) readUint16(BME280_CAL_P8);
mamont090671 2:4700f7e71737 144 _dig_P9 = (int16_t) readUint16(BME280_CAL_P9);
mamont090671 2:4700f7e71737 145 _dig_H1 = readUint8(BME280_CAL_H1);
mamont090671 2:4700f7e71737 146 _dig_H2 = (int16_t) readUint16(BME280_CAL_H2);
mamont090671 2:4700f7e71737 147 _dig_H3 = readUint8(BME280_CAL_H3);
mamont090671 2:4700f7e71737 148 // H4 & H5 share a byte.
mamont090671 2:4700f7e71737 149 uint8_t temp1 = readUint8(BME280_CAL_H4);
mamont090671 2:4700f7e71737 150 uint8_t temp2 = readUint8(BME280_CAL_H45);
mamont090671 2:4700f7e71737 151 uint8_t temp3 = readUint8(BME280_CAL_H5);
mamont090671 2:4700f7e71737 152 _dig_H4 = (temp1<<4) | (temp2&0x0f);
mamont090671 2:4700f7e71737 153 _dig_H5 = (temp3<<4) | (temp2>>4);
mamont090671 2:4700f7e71737 154 _dig_H6 = (int8_t) readUint8(BME280_CAL_H6);
mamont090671 2:4700f7e71737 155 }
mamont090671 2:4700f7e71737 156
mamont090671 2:4700f7e71737 157
mamont090671 2:4700f7e71737 158 uint8_t BME280::readFrom(uint8_t reg, uint8_t data_size, uint8_t *p_data)
mamont090671 2:4700f7e71737 159 {
mamont090671 2:4700f7e71737 160 // Set start address to read from.
mamont090671 2:4700f7e71737 161 busWrite(&reg,1,1); // Use repeated start.
mamont090671 2:4700f7e71737 162 // Now read the requested number of bytes.
mamont090671 2:4700f7e71737 163 busRead(p_data,data_size);
mamont090671 2:4700f7e71737 164 return data_size;
mamont090671 2:4700f7e71737 165 }
mamont090671 2:4700f7e71737 166
mamont090671 2:4700f7e71737 167
mamont090671 2:4700f7e71737 168 void BME280::read(void)
mamont090671 2:4700f7e71737 169 {
mamont090671 2:4700f7e71737 170 // Get all the measurements in one burst (recommended).
mamont090671 2:4700f7e71737 171 uint8_t data[BME280_MEASUREMENT_SIZE];
mamont090671 2:4700f7e71737 172 readFrom(BME280_MEASUREMENT_REGISTER,BME280_MEASUREMENT_SIZE,data);
mamont090671 2:4700f7e71737 173 // We assume Normal mode, so it is not necessary to reissue a Forced mode command here.
mamont090671 2:4700f7e71737 174
mamont090671 2:4700f7e71737 175 // Process data.
mamont090671 2:4700f7e71737 176 int32_t p = assembleRawValue(&data[0],1);
mamont090671 2:4700f7e71737 177 int32_t t = assembleRawValue(&data[3],1);
mamont090671 2:4700f7e71737 178 int32_t h = assembleRawValue(&data[6],0);
mamont090671 2:4700f7e71737 179
mamont090671 2:4700f7e71737 180 _temperature = compensateTemperature(t); // First call this before calling the other compensate functions.
mamont090671 2:4700f7e71737 181 _pressure = compensatePressure(p); // Uses value calculated by compensateTemperature.
mamont090671 2:4700f7e71737 182 _humidity = compensateHumidity(h); // Uses value calculated by compensateTemperature.
mamont090671 2:4700f7e71737 183 }
mamont090671 2:4700f7e71737 184
mamont090671 2:4700f7e71737 185
mamont090671 2:4700f7e71737 186 int32_t BME280::assembleRawValue(uint8_t *p_data, uint8_t has_xlsb)
mamont090671 2:4700f7e71737 187 {
mamont090671 2:4700f7e71737 188 // Needed to decode sensor data.
mamont090671 2:4700f7e71737 189 uint32_t value = p_data[0];
mamont090671 2:4700f7e71737 190 value <<= 8;
mamont090671 2:4700f7e71737 191 value |= p_data[1];
mamont090671 2:4700f7e71737 192 if (has_xlsb!=0)
mamont090671 2:4700f7e71737 193 {
mamont090671 2:4700f7e71737 194 value <<= 4;
mamont090671 2:4700f7e71737 195 value |= (p_data[2]>>4);
mamont090671 2:4700f7e71737 196 }
mamont090671 2:4700f7e71737 197 return (int32_t) value;
mamont090671 2:4700f7e71737 198 }
mamont090671 2:4700f7e71737 199
mamont090671 2:4700f7e71737 200
mamont090671 2:4700f7e71737 201 void BME280::writeControlRegisters(uint8_t osrs_t, uint8_t osrs_p, uint8_t osrs_h, uint8_t mode)
mamont090671 2:4700f7e71737 202 {
mamont090671 2:4700f7e71737 203 uint8_t data[2];
mamont090671 2:4700f7e71737 204 data[0] = BME280_CTRL_HUM_REGISTER;
mamont090671 2:4700f7e71737 205 data[1] = (osrs_h&0x07);
mamont090671 2:4700f7e71737 206 busWrite(data,2,0);
mamont090671 2:4700f7e71737 207 // Writing CTRL_MEAS validates previous write to CTRL_HUM.
mamont090671 2:4700f7e71737 208 data[0] = BME280_CTRL_MEAS_REGISTER;
mamont090671 2:4700f7e71737 209 data[1] = ((osrs_t&0x07)<<5) | ((osrs_p&0x07)<<2) | (mode&0x03);
mamont090671 2:4700f7e71737 210 busWrite(data,2,0);
mamont090671 2:4700f7e71737 211 }
mamont090671 2:4700f7e71737 212
mamont090671 2:4700f7e71737 213
mamont090671 2:4700f7e71737 214 void BME280::writeConfigRegister(uint8_t t_sb, uint8_t filter, uint8_t spi)
mamont090671 2:4700f7e71737 215 {
mamont090671 2:4700f7e71737 216 uint8_t data[2];
mamont090671 2:4700f7e71737 217 data[0] = BME280_CONFIG_REGISTER;
mamont090671 2:4700f7e71737 218 data[1] = ((t_sb&0x07)<<5) | ((filter&0x07)<<2) | (spi&0x01);
mamont090671 2:4700f7e71737 219 busWrite(data,2,0);
mamont090671 2:4700f7e71737 220 }
mamont090671 2:4700f7e71737 221
mamont090671 2:4700f7e71737 222
mamont090671 2:4700f7e71737 223 void BME280::reset(void)
mamont090671 2:4700f7e71737 224 {
mamont090671 2:4700f7e71737 225 uint8_t data[2] = { BME280_RESET_REGISTER, BME280_RESET };
mamont090671 2:4700f7e71737 226 busWrite(data,2,0);
mamont090671 2:4700f7e71737 227 }
mamont090671 2:4700f7e71737 228
mamont090671 2:4700f7e71737 229
mamont090671 2:4700f7e71737 230 uint8_t BME280::readId(void)
mamont090671 2:4700f7e71737 231 {
mamont090671 2:4700f7e71737 232 return readUint8(BME280_ID_REGISTER);
mamont090671 2:4700f7e71737 233 }
mamont090671 2:4700f7e71737 234
mamont090671 2:4700f7e71737 235
mamont090671 2:4700f7e71737 236 #if BME280_ALLOW_FLOAT!=0
mamont090671 2:4700f7e71737 237
mamont090671 2:4700f7e71737 238 // From the driver by Bosch Sensortec
mamont090671 2:4700f7e71737 239
mamont090671 2:4700f7e71737 240 //!
mamont090671 2:4700f7e71737 241 // @brief Reads actual temperature from uncompensated temperature
mamont090671 2:4700f7e71737 242 // @note returns the value in Degree centigrade
mamont090671 2:4700f7e71737 243 // @note Output value of "51.23" equals 51.23 DegC.
mamont090671 2:4700f7e71737 244 //
mamont090671 2:4700f7e71737 245 // @param adc_T : value of uncompensated temperature
mamont090671 2:4700f7e71737 246 //
mamont090671 2:4700f7e71737 247 // @return Return the actual temperature in floating point
mamont090671 2:4700f7e71737 248 //
mamont090671 2:4700f7e71737 249 temperature_t BME280::compensateTemperature(int32_t adc_T)
mamont090671 2:4700f7e71737 250 {
mamont090671 2:4700f7e71737 251 double v_x1_u32;
mamont090671 2:4700f7e71737 252 double v_x2_u32;
mamont090671 2:4700f7e71737 253 double temperature;
mamont090671 2:4700f7e71737 254
mamont090671 2:4700f7e71737 255 v_x1_u32 = (((double)adc_T) / 16384.0 - ((double)_dig_T1) / 1024.0) * ((double)_dig_T2);
mamont090671 2:4700f7e71737 256 v_x2_u32 = ((((double)adc_T) / 131072.0 - ((double)_dig_T1) / 8192.0) * (((double)adc_T) / 131072.0 - ((double)_dig_T1) / 8192.0)) * ((double)_dig_T3);
mamont090671 2:4700f7e71737 257 _t_fine = (int32_t)(v_x1_u32 + v_x2_u32);
mamont090671 2:4700f7e71737 258 temperature = (v_x1_u32 + v_x2_u32) / 5120.0;
mamont090671 2:4700f7e71737 259 return temperature;
mamont090671 2:4700f7e71737 260 }
mamont090671 2:4700f7e71737 261
mamont090671 2:4700f7e71737 262
mamont090671 2:4700f7e71737 263 //!
mamont090671 2:4700f7e71737 264 // @brief Reads actual pressure from uncompensated pressure
mamont090671 2:4700f7e71737 265 // @note Returns pressure in Pa as double.
mamont090671 2:4700f7e71737 266 // @note Output value of "96386.2"
mamont090671 2:4700f7e71737 267 // equals 96386.2 Pa = 963.862 hPa.
mamont090671 2:4700f7e71737 268 //
mamont090671 2:4700f7e71737 269 // @param adc_P : value of uncompensated pressure
mamont090671 2:4700f7e71737 270 //
mamont090671 2:4700f7e71737 271 // @return Return the actual pressure in floating point
mamont090671 2:4700f7e71737 272 //
mamont090671 2:4700f7e71737 273 pressure_t BME280::compensatePressure(int32_t adc_P)
mamont090671 2:4700f7e71737 274 {
mamont090671 2:4700f7e71737 275 double v_x1_u32;
mamont090671 2:4700f7e71737 276 double v_x2_u32;
mamont090671 2:4700f7e71737 277 double pressure;
mamont090671 2:4700f7e71737 278
mamont090671 2:4700f7e71737 279 v_x1_u32 = ((double)_t_fine / 2.0) - 64000.0;
mamont090671 2:4700f7e71737 280 v_x2_u32 = v_x1_u32 * v_x1_u32 * ((double)_dig_P6) / 32768.0;
mamont090671 2:4700f7e71737 281 v_x2_u32 = v_x2_u32 + v_x1_u32 * ((double)_dig_P5) * 2.0;
mamont090671 2:4700f7e71737 282 v_x2_u32 = (v_x2_u32 / 4.0) + (((double)_dig_P4) * 65536.0);
mamont090671 2:4700f7e71737 283 v_x1_u32 = (((double)_dig_P3) * v_x1_u32 * v_x1_u32 / 524288.0 + ((double)_dig_P2) * v_x1_u32) / 524288.0;
mamont090671 2:4700f7e71737 284 v_x1_u32 = (1.0 + v_x1_u32 / 32768.0) * ((double)_dig_P1);
mamont090671 2:4700f7e71737 285 pressure = 1048576.0 - (double)adc_P;
mamont090671 2:4700f7e71737 286 // Avoid exception caused by division by zero.
mamont090671 2:4700f7e71737 287 if (v_x1_u32 != 0) pressure = (pressure - (v_x2_u32 / 4096.0)) * 6250.0 / v_x1_u32;
mamont090671 2:4700f7e71737 288 else return 0;
mamont090671 2:4700f7e71737 289 v_x1_u32 = ((double)_dig_P9) * pressure * pressure / 2147483648.0;
mamont090671 2:4700f7e71737 290 v_x2_u32 = pressure * ((double)_dig_P8) / 32768.0;
mamont090671 2:4700f7e71737 291 pressure = pressure + (v_x1_u32 + v_x2_u32 + ((double)_dig_P7)) / 16.0;
mamont090671 2:4700f7e71737 292
mamont090671 2:4700f7e71737 293 return pressure;
mamont090671 2:4700f7e71737 294 }
mamont090671 2:4700f7e71737 295
mamont090671 2:4700f7e71737 296
mamont090671 2:4700f7e71737 297 //!
mamont090671 2:4700f7e71737 298 // @brief Reads actual humidity from uncompensated humidity
mamont090671 2:4700f7e71737 299 // @note returns the value in relative humidity (%rH)
mamont090671 2:4700f7e71737 300 // @note Output value of "42.12" equals 42.12 %rH
mamont090671 2:4700f7e71737 301 //
mamont090671 2:4700f7e71737 302 // @param adc_H : value of uncompensated humidity
mamont090671 2:4700f7e71737 303 //
mamont090671 2:4700f7e71737 304 // @return Return the actual humidity in floating point
mamont090671 2:4700f7e71737 305 //
mamont090671 2:4700f7e71737 306 humidity_t BME280::compensateHumidity(int32_t adc_H)
mamont090671 2:4700f7e71737 307 {
mamont090671 2:4700f7e71737 308 double var_h;
mamont090671 2:4700f7e71737 309
mamont090671 2:4700f7e71737 310 var_h = (((double)_t_fine) - 76800.0);
mamont090671 2:4700f7e71737 311 if (var_h != 0)
mamont090671 2:4700f7e71737 312 {
mamont090671 2:4700f7e71737 313 var_h = (adc_H - (((double)_dig_H4) * 64.0 + ((double)_dig_H5) / 16384.0 * var_h)) *
mamont090671 2:4700f7e71737 314 (((double)_dig_H2) / 65536.0 * (1.0 + ((double) _dig_H6) / 67108864.0 *
mamont090671 2:4700f7e71737 315 var_h * (1.0 + ((double)_dig_H3) / 67108864.0 * var_h)));
mamont090671 2:4700f7e71737 316 }
mamont090671 2:4700f7e71737 317 else return 0;
mamont090671 2:4700f7e71737 318 var_h = var_h * (1.0 - ((double)_dig_H1)*var_h / 524288.0);
mamont090671 2:4700f7e71737 319 if (var_h > 100.0) var_h = 100.0;
mamont090671 2:4700f7e71737 320 else if (var_h < 0.0) var_h = 0.0;
mamont090671 2:4700f7e71737 321 return var_h;
mamont090671 2:4700f7e71737 322 }
mamont090671 2:4700f7e71737 323
mamont090671 2:4700f7e71737 324 #else /* BME280_ALLOW_FLOAT */
mamont090671 2:4700f7e71737 325
mamont090671 2:4700f7e71737 326 // From the datasheet.
mamont090671 2:4700f7e71737 327 // Returns temperature in DegC, resolution is 0.01 DegC. Output value of 5123 equals 51.23 DegC.
mamont090671 2:4700f7e71737 328 // _t_fine carries fine temperature as "global" value.
mamont090671 2:4700f7e71737 329 temperature_t BME280::compensateTemperature(int32_t adc_T)
mamont090671 2:4700f7e71737 330 {
mamont090671 2:4700f7e71737 331 int32_t var1, var2, T;
mamont090671 2:4700f7e71737 332 var1 = ((((adc_T>>3) - ((int32_t)_dig_T1<<1))) * ((int32_t)_dig_T2)) >> 11;
mamont090671 2:4700f7e71737 333 var2 = (((((adc_T>>4) - ((int32_t)_dig_T1)) * ((adc_T>>4) - ((int32_t)_dig_T1))) >> 12) * ((int32_t)_dig_T3)) >> 14;
mamont090671 2:4700f7e71737 334 _t_fine = var1 + var2;
mamont090671 2:4700f7e71737 335 T = (_t_fine * 5 + 128) >> 8;
mamont090671 2:4700f7e71737 336 return T;
mamont090671 2:4700f7e71737 337 }
mamont090671 2:4700f7e71737 338
mamont090671 2:4700f7e71737 339
mamont090671 2:4700f7e71737 340 // From the datasheet.
mamont090671 2:4700f7e71737 341 // Returns pressure in Pa as unsigned 32 bit integer. Output value of 96386 equals 96386 Pa = 963.86 hPa
mamont090671 2:4700f7e71737 342 pressure_t BME280::compensatePressure(int32_t adc_P)
mamont090671 2:4700f7e71737 343 {
mamont090671 2:4700f7e71737 344 int32_t var1, var2;
mamont090671 2:4700f7e71737 345 uint32_t p;
mamont090671 2:4700f7e71737 346 var1 = (((int32_t)_t_fine)>>1) - (int32_t)64000;
mamont090671 2:4700f7e71737 347 var2 = (((var1>>2) * (var1>>2)) >> 11 ) * ((int32_t)_dig_P6);
mamont090671 2:4700f7e71737 348 var2 = var2 + ((var1*((int32_t)_dig_P5))<<1);
mamont090671 2:4700f7e71737 349 var2 = (var2>>2)+(((int32_t)_dig_P4)<<16);
mamont090671 2:4700f7e71737 350 var1 = (((_dig_P3 * (((var1>>2) * (var1>>2)) >> 13 )) >> 3) + ((((int32_t)_dig_P2) * var1)>>1))>>18;
mamont090671 2:4700f7e71737 351 var1 =((((32768+var1))*((int32_t)_dig_P1))>>15);
mamont090671 2:4700f7e71737 352 if (var1 == 0)
mamont090671 2:4700f7e71737 353 {
mamont090671 2:4700f7e71737 354 return 0; // avoid exception caused by division by zero
mamont090671 2:4700f7e71737 355 }
mamont090671 2:4700f7e71737 356 p = (((uint32_t)(((int32_t)1048576)-adc_P)-(var2>>12)))*3125;
mamont090671 2:4700f7e71737 357 if (p < 0x80000000)
mamont090671 2:4700f7e71737 358 {
mamont090671 2:4700f7e71737 359 p = (p << 1) / ((uint32_t)var1);
mamont090671 2:4700f7e71737 360 }
mamont090671 2:4700f7e71737 361 else
mamont090671 2:4700f7e71737 362 {
mamont090671 2:4700f7e71737 363 p = (p / (uint32_t)var1) * 2;
mamont090671 2:4700f7e71737 364 }
mamont090671 2:4700f7e71737 365 var1 = (((int32_t)_dig_P9) * ((int32_t)(((p>>3) * (p>>3))>>13)))>>12;
mamont090671 2:4700f7e71737 366 var2 = (((int32_t)(p>>2)) * ((int32_t)_dig_P8))>>13;
mamont090671 2:4700f7e71737 367 p = (uint32_t)((int32_t)p + ((var1 + var2 + _dig_P7) >> 4));
mamont090671 2:4700f7e71737 368 return p;
mamont090671 2:4700f7e71737 369 }
mamont090671 2:4700f7e71737 370
mamont090671 2:4700f7e71737 371
mamont090671 2:4700f7e71737 372 // From the datasheet.
mamont090671 2:4700f7e71737 373 // Returns humidity in %RH as unsigned 32 bit integer in Q22.10 format (22 integer and 10 fractional bits).
mamont090671 2:4700f7e71737 374 // Output value of 47445 represents 47445/1024 = 46.333 %RH
mamont090671 2:4700f7e71737 375 humidity_t BME280::compensateHumidity(int32_t adc_H)
mamont090671 2:4700f7e71737 376 {
mamont090671 2:4700f7e71737 377 int32_t v_x1_u32r;
mamont090671 2:4700f7e71737 378 v_x1_u32r = (_t_fine - ((int32_t)76800));
mamont090671 2:4700f7e71737 379 v_x1_u32r = (((((adc_H << 14) - (((int32_t)_dig_H4) << 20) - (((int32_t)_dig_H5) * v_x1_u32r)) +
mamont090671 2:4700f7e71737 380 ((int32_t)16384)) >> 15) * (((((((v_x1_u32r * ((int32_t)_dig_H6)) >> 10) * (((v_x1_u32r *
mamont090671 2:4700f7e71737 381 ((int32_t)_dig_H3)) >> 11) + ((int32_t)32768))) >> 10) + ((int32_t)2097152)) *
mamont090671 2:4700f7e71737 382 ((int32_t)_dig_H2) + 8192) >> 14));
mamont090671 2:4700f7e71737 383 v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((int32_t)_dig_H1)) >> 4));
mamont090671 2:4700f7e71737 384 v_x1_u32r = (v_x1_u32r < 0 ? 0 : v_x1_u32r);
mamont090671 2:4700f7e71737 385 v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400 : v_x1_u32r);
mamont090671 2:4700f7e71737 386 return (uint32_t)(v_x1_u32r>>12);
mamont090671 2:4700f7e71737 387 }
mamont090671 2:4700f7e71737 388
mamont090671 2:4700f7e71737 389 #endif /* BME280_ALLOW_FLOAT */