BMP280 I2C Library

Fork of BMP280 by Edwin Cho

Committer:
brdarji
Date:
Thu Nov 23 11:44:38 2017 +0000
Revision:
8:0aae5bf93aaa
Parent:
7:c72b726c7dc9
BMP280 I2C Library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
brdarji 8:0aae5bf93aaa 1 /******************************************************************//**
brdarji 8:0aae5bf93aaa 2 * @file BMP280.c
brdarji 8:0aae5bf93aaa 3 * @brief Contains all functions support for I2C based BMP280
brdarji 8:0aae5bf93aaa 4 * Pressure Sensor library
brdarji 8:0aae5bf93aaa 5 * @version 1.0
brdarji 8:0aae5bf93aaa 6 * @date 26. May. 2016
brdarji 8:0aae5bf93aaa 7 * @author Bhavin.Edutech Learning Solutions
brdarji 8:0aae5bf93aaa 8 **********************************************************************/
MACRUM 1:763a4018aaec 9
12104404 5:7139d5accbc3 10 #include "BMP280.h"
MACRUM 0:ade9be832910 11
brdarji 8:0aae5bf93aaa 12 //******************************************************************************
brdarji 8:0aae5bf93aaa 13 BMP280::BMP280(PinName sda, PinName scl)
MACRUM 0:ade9be832910 14 {
brdarji 8:0aae5bf93aaa 15 i2c_ = new I2C(sda, scl);
brdarji 8:0aae5bf93aaa 16 i2c_owner = true;
brdarji 8:0aae5bf93aaa 17
brdarji 8:0aae5bf93aaa 18 i2c_->frequency(400000);
MACRUM 0:ade9be832910 19 }
MACRUM 0:ade9be832910 20
brdarji 8:0aae5bf93aaa 21 //******************************************************************************
brdarji 8:0aae5bf93aaa 22 BMP280::BMP280(I2C *i2c) :
brdarji 8:0aae5bf93aaa 23 i2c_(i2c)
MACRUM 0:ade9be832910 24 {
brdarji 8:0aae5bf93aaa 25 i2c_owner = false;
MACRUM 0:ade9be832910 26 }
MACRUM 0:ade9be832910 27
brdarji 8:0aae5bf93aaa 28 //******************************************************************************
12104404 7:c72b726c7dc9 29 BMP280::~BMP280()
MACRUM 0:ade9be832910 30 {
brdarji 8:0aae5bf93aaa 31 if(i2c_owner) {
brdarji 8:0aae5bf93aaa 32 delete i2c_;
brdarji 8:0aae5bf93aaa 33 }
MACRUM 0:ade9be832910 34 }
brdarji 8:0aae5bf93aaa 35
brdarji 8:0aae5bf93aaa 36 //******************************************************************************
brdarji 8:0aae5bf93aaa 37
brdarji 8:0aae5bf93aaa 38 void BMP280::writeByte(uint8_t Address, uint8_t data)
brdarji 8:0aae5bf93aaa 39 {
brdarji 8:0aae5bf93aaa 40 char data_write[2];
brdarji 8:0aae5bf93aaa 41 data_write[0] = Address;
brdarji 8:0aae5bf93aaa 42 data_write[1] = data;
brdarji 8:0aae5bf93aaa 43 i2c_->write(BMP280_I2C_ADDRESS2, data_write, 2, 0);
brdarji 8:0aae5bf93aaa 44 }
brdarji 8:0aae5bf93aaa 45
brdarji 8:0aae5bf93aaa 46 //******************************************************************************
brdarji 8:0aae5bf93aaa 47
brdarji 8:0aae5bf93aaa 48 char BMP280::readByte(uint8_t Address)
MACRUM 0:ade9be832910 49 {
brdarji 8:0aae5bf93aaa 50 char data[1]; // `data` will store the register data
brdarji 8:0aae5bf93aaa 51 char data_write[1];
brdarji 8:0aae5bf93aaa 52 data_write[0] = Address;
brdarji 8:0aae5bf93aaa 53 i2c_->write(BMP280_I2C_ADDRESS2, data_write, 1, 1); // no stop
brdarji 8:0aae5bf93aaa 54 i2c_->read(BMP280_I2C_ADDRESS2, data, 1, 0);
brdarji 8:0aae5bf93aaa 55 return data[0];
brdarji 8:0aae5bf93aaa 56 }
brdarji 8:0aae5bf93aaa 57
brdarji 8:0aae5bf93aaa 58 //******************************************************************************
brdarji 8:0aae5bf93aaa 59
brdarji 8:0aae5bf93aaa 60 void BMP280::readBytes(uint8_t Address, uint8_t count, uint8_t * dest)
brdarji 8:0aae5bf93aaa 61 {
brdarji 8:0aae5bf93aaa 62 char data[14];
brdarji 8:0aae5bf93aaa 63 char data_write[1];
brdarji 8:0aae5bf93aaa 64 data_write[0] = Address;
brdarji 8:0aae5bf93aaa 65 i2c_->write(BMP280_I2C_ADDRESS2, data_write, 1, 1); // no stop
brdarji 8:0aae5bf93aaa 66 i2c_->read(BMP280_I2C_ADDRESS2, data, count, 0);
brdarji 8:0aae5bf93aaa 67 for(int ii = 0; ii < count; ii++) {
brdarji 8:0aae5bf93aaa 68 dest[ii] = data[ii];
brdarji 8:0aae5bf93aaa 69 }
brdarji 8:0aae5bf93aaa 70 }
MACRUM 2:c35f637c28ef 71
brdarji 8:0aae5bf93aaa 72 //******************************************************************************
brdarji 8:0aae5bf93aaa 73 uint8_t BMP280::BMP280_GetID(void)
brdarji 8:0aae5bf93aaa 74 {
brdarji 8:0aae5bf93aaa 75 return readByte(BMP280_CHIP_ID_REG);
brdarji 8:0aae5bf93aaa 76 }
brdarji 8:0aae5bf93aaa 77 //******************************************************************************
brdarji 8:0aae5bf93aaa 78 void BMP280::BMP280_SoftReset(void)
brdarji 8:0aae5bf93aaa 79 {
brdarji 8:0aae5bf93aaa 80 writeByte(BMP280_RST_REG, BMP280_SOFT_RESET_CODE);
brdarji 8:0aae5bf93aaa 81 }
brdarji 8:0aae5bf93aaa 82 //******************************************************************************
brdarji 8:0aae5bf93aaa 83 uint8_t BMP280::BMP280_GetStatus(void)
brdarji 8:0aae5bf93aaa 84 {
brdarji 8:0aae5bf93aaa 85 return readByte(BMP280_STAT_REG);
brdarji 8:0aae5bf93aaa 86 }
brdarji 8:0aae5bf93aaa 87 //******************************************************************************
brdarji 8:0aae5bf93aaa 88 uint8_t BMP280::BMP280_GetCtrlMeasurement(void)
brdarji 8:0aae5bf93aaa 89 {
brdarji 8:0aae5bf93aaa 90 return readByte(BMP280_CTRL_MEAS_REG);
brdarji 8:0aae5bf93aaa 91 }
brdarji 8:0aae5bf93aaa 92 //******************************************************************************
brdarji 8:0aae5bf93aaa 93 uint8_t BMP280::BMP280_GetConfig(void)
brdarji 8:0aae5bf93aaa 94 {
brdarji 8:0aae5bf93aaa 95 return readByte(BMP280_CONFIG_REG);
brdarji 8:0aae5bf93aaa 96 }
brdarji 8:0aae5bf93aaa 97 //******************************************************************************
brdarji 8:0aae5bf93aaa 98 void BMP280::BMP280_ReadMeasurements(void)
brdarji 8:0aae5bf93aaa 99 {
brdarji 8:0aae5bf93aaa 100 uint8_t rx_Buf[6]= {0};
brdarji 8:0aae5bf93aaa 101
brdarji 8:0aae5bf93aaa 102 readBytes(BMP280_PRESSURE_MSB_REG, 6, &rx_Buf[0]);
brdarji 8:0aae5bf93aaa 103
brdarji 8:0aae5bf93aaa 104 adc_t = (uint32_t)rx_Buf[BMP280_DATA_FRAME_TEMPERATURE_XLSB_BYTE] >> 4;
brdarji 8:0aae5bf93aaa 105 adc_t |= (uint32_t)rx_Buf[BMP280_DATA_FRAME_TEMPERATURE_LSB_BYTE] << 4;
brdarji 8:0aae5bf93aaa 106 adc_t |= (uint32_t)rx_Buf[BMP280_DATA_FRAME_TEMPERATURE_MSB_BYTE] << 12;
brdarji 8:0aae5bf93aaa 107
brdarji 8:0aae5bf93aaa 108 adc_p = (uint32_t)rx_Buf[BMP280_DATA_FRAME_PRESSURE_XLSB_BYTE] >> 4;
brdarji 8:0aae5bf93aaa 109 adc_p |= (uint32_t)rx_Buf[BMP280_DATA_FRAME_PRESSURE_LSB_BYTE] << 4;
brdarji 8:0aae5bf93aaa 110 adc_p |= (uint32_t)rx_Buf[BMP280_DATA_FRAME_PRESSURE_MSB_BYTE] << 12;
MACRUM 0:ade9be832910 111 }
brdarji 8:0aae5bf93aaa 112
brdarji 8:0aae5bf93aaa 113 //******************************************************************************
brdarji 8:0aae5bf93aaa 114
brdarji 8:0aae5bf93aaa 115 void BMP280::BMP280_ReadCalibrationParams(void)
MACRUM 0:ade9be832910 116 {
brdarji 8:0aae5bf93aaa 117 uint8_t lsb, msb;
brdarji 8:0aae5bf93aaa 118
brdarji 8:0aae5bf93aaa 119 msb = readByte(BMP280_TEMPERATURE_CALIB_DIG_T1_MSB_REG);
brdarji 8:0aae5bf93aaa 120 cal_param.dig_T1 = (uint16_t) msb;
brdarji 8:0aae5bf93aaa 121 lsb = readByte(BMP280_TEMPERATURE_CALIB_DIG_T1_LSB_REG);
brdarji 8:0aae5bf93aaa 122 cal_param.dig_T1 = (cal_param.dig_T1 << 8) + lsb;
brdarji 8:0aae5bf93aaa 123
brdarji 8:0aae5bf93aaa 124
brdarji 8:0aae5bf93aaa 125 msb = readByte(BMP280_TEMPERATURE_CALIB_DIG_T2_MSB_REG);
brdarji 8:0aae5bf93aaa 126 cal_param.dig_T2 = (int16_t) msb;
brdarji 8:0aae5bf93aaa 127 lsb = readByte(BMP280_TEMPERATURE_CALIB_DIG_T2_LSB_REG);
brdarji 8:0aae5bf93aaa 128 cal_param.dig_T2 = (cal_param.dig_T2 << 8) + lsb;
brdarji 8:0aae5bf93aaa 129
brdarji 8:0aae5bf93aaa 130
brdarji 8:0aae5bf93aaa 131 msb = readByte(BMP280_TEMPERATURE_CALIB_DIG_T3_MSB_REG);
brdarji 8:0aae5bf93aaa 132 cal_param.dig_T3 = (int16_t) msb;
brdarji 8:0aae5bf93aaa 133 lsb = readByte(BMP280_TEMPERATURE_CALIB_DIG_T3_LSB_REG);
brdarji 8:0aae5bf93aaa 134 cal_param.dig_T3 = (cal_param.dig_T3 << 8) + lsb;
brdarji 8:0aae5bf93aaa 135
brdarji 8:0aae5bf93aaa 136
brdarji 8:0aae5bf93aaa 137 msb = readByte(BMP280_PRESSURE_CALIB_DIG_P1_MSB_REG);
brdarji 8:0aae5bf93aaa 138 cal_param.dig_P1 = (uint16_t) msb;
brdarji 8:0aae5bf93aaa 139 lsb = readByte(BMP280_PRESSURE_CALIB_DIG_P1_LSB_REG);
brdarji 8:0aae5bf93aaa 140 cal_param.dig_P1 = (cal_param.dig_P1 << 8) + lsb;
brdarji 8:0aae5bf93aaa 141
brdarji 8:0aae5bf93aaa 142
brdarji 8:0aae5bf93aaa 143 msb = readByte(BMP280_PRESSURE_CALIB_DIG_P2_MSB_REG);
brdarji 8:0aae5bf93aaa 144 cal_param.dig_P2 = (int16_t) msb;
brdarji 8:0aae5bf93aaa 145 lsb = readByte(BMP280_PRESSURE_CALIB_DIG_P2_LSB_REG);
brdarji 8:0aae5bf93aaa 146 cal_param.dig_P2 = (cal_param.dig_P2 << 8) + lsb;
brdarji 8:0aae5bf93aaa 147
brdarji 8:0aae5bf93aaa 148
brdarji 8:0aae5bf93aaa 149 msb = readByte(BMP280_PRESSURE_CALIB_DIG_P3_MSB_REG);
brdarji 8:0aae5bf93aaa 150 cal_param.dig_P3 = (int16_t) msb;
brdarji 8:0aae5bf93aaa 151 lsb = readByte(BMP280_PRESSURE_CALIB_DIG_P3_LSB_REG);
brdarji 8:0aae5bf93aaa 152 cal_param.dig_P3 = (cal_param.dig_P3 << 8) + lsb;
brdarji 8:0aae5bf93aaa 153
brdarji 8:0aae5bf93aaa 154
brdarji 8:0aae5bf93aaa 155 msb = readByte(BMP280_PRESSURE_CALIB_DIG_P4_MSB_REG);
brdarji 8:0aae5bf93aaa 156 cal_param.dig_P4 = (int16_t) msb;
brdarji 8:0aae5bf93aaa 157 lsb = readByte(BMP280_PRESSURE_CALIB_DIG_P4_LSB_REG);
brdarji 8:0aae5bf93aaa 158 cal_param.dig_P4 = (cal_param.dig_P4 << 8) + lsb;
brdarji 8:0aae5bf93aaa 159
brdarji 8:0aae5bf93aaa 160
brdarji 8:0aae5bf93aaa 161 msb = readByte(BMP280_PRESSURE_CALIB_DIG_P5_MSB_REG);
brdarji 8:0aae5bf93aaa 162 cal_param.dig_P5 = (int16_t) msb;
brdarji 8:0aae5bf93aaa 163 lsb = readByte(BMP280_PRESSURE_CALIB_DIG_P5_LSB_REG);
brdarji 8:0aae5bf93aaa 164 cal_param.dig_P5 = (cal_param.dig_P5 << 8) + lsb;
brdarji 8:0aae5bf93aaa 165
brdarji 8:0aae5bf93aaa 166
brdarji 8:0aae5bf93aaa 167 msb = readByte(BMP280_PRESSURE_CALIB_DIG_P6_MSB_REG);
brdarji 8:0aae5bf93aaa 168 cal_param.dig_P6 = (int16_t) msb;
brdarji 8:0aae5bf93aaa 169 lsb = readByte(BMP280_PRESSURE_CALIB_DIG_P6_LSB_REG);
brdarji 8:0aae5bf93aaa 170 cal_param.dig_P6 = (cal_param.dig_P6 << 8) + lsb;
brdarji 8:0aae5bf93aaa 171
brdarji 8:0aae5bf93aaa 172
brdarji 8:0aae5bf93aaa 173 msb = readByte(BMP280_PRESSURE_CALIB_DIG_P7_MSB_REG);
brdarji 8:0aae5bf93aaa 174 cal_param.dig_P7 = (int16_t) msb;
brdarji 8:0aae5bf93aaa 175 lsb = readByte(BMP280_PRESSURE_CALIB_DIG_P7_LSB_REG);
brdarji 8:0aae5bf93aaa 176 cal_param.dig_P7 = (cal_param.dig_P7 << 8) + lsb;
brdarji 8:0aae5bf93aaa 177
brdarji 8:0aae5bf93aaa 178
brdarji 8:0aae5bf93aaa 179 msb = readByte(BMP280_PRESSURE_CALIB_DIG_P8_MSB_REG);
brdarji 8:0aae5bf93aaa 180 cal_param.dig_P8 = (int16_t) msb;
brdarji 8:0aae5bf93aaa 181 lsb = readByte(BMP280_PRESSURE_CALIB_DIG_P8_LSB_REG);
brdarji 8:0aae5bf93aaa 182 cal_param.dig_P8 = (cal_param.dig_P8 << 8) + lsb;
brdarji 8:0aae5bf93aaa 183
brdarji 8:0aae5bf93aaa 184
brdarji 8:0aae5bf93aaa 185 msb = readByte(BMP280_PRESSURE_CALIB_DIG_P9_MSB_REG);
brdarji 8:0aae5bf93aaa 186 cal_param.dig_P9 = (int16_t) msb;
brdarji 8:0aae5bf93aaa 187 lsb = readByte(BMP280_PRESSURE_CALIB_DIG_P9_LSB_REG);
brdarji 8:0aae5bf93aaa 188 cal_param.dig_P9 = (cal_param.dig_P9 << 8) + lsb;
MACRUM 0:ade9be832910 189 }
brdarji 8:0aae5bf93aaa 190
brdarji 8:0aae5bf93aaa 191 //******************************************************************************
brdarji 8:0aae5bf93aaa 192
brdarji 8:0aae5bf93aaa 193 void BMP280::BMP280_SetOversamplingPressure(uint8_t Value)
brdarji 8:0aae5bf93aaa 194 {
brdarji 8:0aae5bf93aaa 195 uint8_t ctrlm;
brdarji 8:0aae5bf93aaa 196
brdarji 8:0aae5bf93aaa 197 ctrlm = BMP280_GetCtrlMeasurement();
brdarji 8:0aae5bf93aaa 198 ctrlm &= ~BMP280_CTRL_MEAS_REG_OVERSAMP_PRESSURE__MSK;
brdarji 8:0aae5bf93aaa 199 ctrlm |= Value << BMP280_CTRL_MEAS_REG_OVERSAMP_PRESSURE__POS;
brdarji 8:0aae5bf93aaa 200
brdarji 8:0aae5bf93aaa 201 writeByte(BMP280_CTRL_MEAS_REG, ctrlm);
brdarji 8:0aae5bf93aaa 202 ctrlm = BMP280_GetCtrlMeasurement();
brdarji 8:0aae5bf93aaa 203 }
brdarji 8:0aae5bf93aaa 204
brdarji 8:0aae5bf93aaa 205 //******************************************************************************
brdarji 8:0aae5bf93aaa 206
brdarji 8:0aae5bf93aaa 207 void BMP280::BMP280_SetOversamplingTemperature(uint8_t Value)
brdarji 8:0aae5bf93aaa 208 {
brdarji 8:0aae5bf93aaa 209 int8_t ctrlm;
brdarji 8:0aae5bf93aaa 210
brdarji 8:0aae5bf93aaa 211 ctrlm = BMP280_GetCtrlMeasurement();
brdarji 8:0aae5bf93aaa 212 ctrlm &= ~BMP280_CTRL_MEAS_REG_OVERSAMP_TEMPERATURE__MSK;
brdarji 8:0aae5bf93aaa 213 ctrlm |= Value << BMP280_CTRL_MEAS_REG_OVERSAMP_TEMPERATURE__POS;
brdarji 8:0aae5bf93aaa 214
brdarji 8:0aae5bf93aaa 215 writeByte(BMP280_CTRL_MEAS_REG, ctrlm);
brdarji 8:0aae5bf93aaa 216 }
brdarji 8:0aae5bf93aaa 217
brdarji 8:0aae5bf93aaa 218 //******************************************************************************
brdarji 8:0aae5bf93aaa 219
brdarji 8:0aae5bf93aaa 220 void BMP280::BMP280_SetPowerMode(BMP280_Mode_Type Value)
MACRUM 0:ade9be832910 221 {
brdarji 8:0aae5bf93aaa 222 uint8_t ctrlm;
brdarji 8:0aae5bf93aaa 223
brdarji 8:0aae5bf93aaa 224 ctrlm = BMP280_GetCtrlMeasurement();
brdarji 8:0aae5bf93aaa 225 ctrlm |= Value;
brdarji 8:0aae5bf93aaa 226
brdarji 8:0aae5bf93aaa 227 writeByte(BMP280_CTRL_MEAS_REG, ctrlm);
brdarji 8:0aae5bf93aaa 228 }
brdarji 8:0aae5bf93aaa 229
brdarji 8:0aae5bf93aaa 230 //******************************************************************************
brdarji 8:0aae5bf93aaa 231
brdarji 8:0aae5bf93aaa 232 void BMP280::BMP280_SetFilterCoefficient(BMP280_Filter_Coeff_Type Value)
brdarji 8:0aae5bf93aaa 233 {
brdarji 8:0aae5bf93aaa 234 uint8_t cfgv;
brdarji 8:0aae5bf93aaa 235
brdarji 8:0aae5bf93aaa 236 cfgv = BMP280_GetConfig();
brdarji 8:0aae5bf93aaa 237 cfgv &= ~BMP280_CONFIG_REG_FILTER__MSK;
brdarji 8:0aae5bf93aaa 238 cfgv |= Value << BMP280_CONFIG_REG_FILTER__POS;
brdarji 8:0aae5bf93aaa 239 }
brdarji 8:0aae5bf93aaa 240
brdarji 8:0aae5bf93aaa 241 //******************************************************************************
brdarji 8:0aae5bf93aaa 242
brdarji 8:0aae5bf93aaa 243 void BMP280::BMP280_SetStandbyTime(BMP280_Standby_Type Value)
brdarji 8:0aae5bf93aaa 244 {
brdarji 8:0aae5bf93aaa 245 uint8_t cfgv;
brdarji 8:0aae5bf93aaa 246
brdarji 8:0aae5bf93aaa 247 cfgv = BMP280_GetConfig();
brdarji 8:0aae5bf93aaa 248 cfgv &= ~BMP280_CONFIG_REG_STANDBY_DURN__MSK;
brdarji 8:0aae5bf93aaa 249 cfgv |= Value << BMP280_CONFIG_REG_STANDBY_DURN__POS;
brdarji 8:0aae5bf93aaa 250 }
brdarji 8:0aae5bf93aaa 251
brdarji 8:0aae5bf93aaa 252 //******************************************************************************
brdarji 8:0aae5bf93aaa 253
brdarji 8:0aae5bf93aaa 254 uint8_t BMP280::BMP280_IsMeasuring(void)
brdarji 8:0aae5bf93aaa 255 {
brdarji 8:0aae5bf93aaa 256 uint8_t output;
brdarji 8:0aae5bf93aaa 257
brdarji 8:0aae5bf93aaa 258 output = BMP280_GetStatus();
brdarji 8:0aae5bf93aaa 259 return (output & BMP280_STATUS_REG_MEASURING__MSK);
brdarji 8:0aae5bf93aaa 260 }
brdarji 8:0aae5bf93aaa 261
brdarji 8:0aae5bf93aaa 262 //******************************************************************************
brdarji 8:0aae5bf93aaa 263
brdarji 8:0aae5bf93aaa 264 int32_t BMP280::BMP280_Compensate_T(void)
brdarji 8:0aae5bf93aaa 265 {
brdarji 8:0aae5bf93aaa 266 int32_t temp1, temp2, T;
brdarji 8:0aae5bf93aaa 267
brdarji 8:0aae5bf93aaa 268 temp1 = ((((adc_t>>3) -((int32_t)cal_param.dig_T1<<1))) * ((int32_t)cal_param.dig_T2)) >> 11;
brdarji 8:0aae5bf93aaa 269 temp2 = (((((adc_t>>4) - ((int32_t)cal_param.dig_T1)) * ((adc_t>>4) - ((int32_t)cal_param.dig_T1))) >> 12) * ((int32_t)cal_param.dig_T3)) >> 14;
brdarji 8:0aae5bf93aaa 270 t_fine = temp1 + temp2;
brdarji 8:0aae5bf93aaa 271 T = (t_fine * 5 + 128) >> 8;
brdarji 8:0aae5bf93aaa 272 return T;
brdarji 8:0aae5bf93aaa 273 }
brdarji 8:0aae5bf93aaa 274
brdarji 8:0aae5bf93aaa 275 //******************************************************************************
brdarji 8:0aae5bf93aaa 276
brdarji 8:0aae5bf93aaa 277 uint32_t BMP280::BMP280_Compensate_P()
brdarji 8:0aae5bf93aaa 278 {
brdarji 8:0aae5bf93aaa 279 int32_t press1, press2;
brdarji 8:0aae5bf93aaa 280 uint32_t P;
brdarji 8:0aae5bf93aaa 281
brdarji 8:0aae5bf93aaa 282 press1 = (((int32_t)t_fine)>>1) - (int32_t)64000;
brdarji 8:0aae5bf93aaa 283 press2 = (((press1>>2) * (press1>>2)) >> 11 ) * ((int32_t)cal_param.dig_P6);
brdarji 8:0aae5bf93aaa 284 press2 = press2 + ((press1*((int32_t)cal_param.dig_P5))<<1);
brdarji 8:0aae5bf93aaa 285 press2 = (press2>>2)+(((int32_t)cal_param.dig_P4)<<16);
brdarji 8:0aae5bf93aaa 286 press1 = (((cal_param.dig_P3 * (((press1>>2) * (press1>>2)) >> 13 )) >> 3) + ((((int32_t)cal_param.dig_P2) * press1)>>1))>>18;
brdarji 8:0aae5bf93aaa 287 press1 =((((32768+press1))*((int32_t)cal_param.dig_P1))>>15);
brdarji 8:0aae5bf93aaa 288 if (press1 == 0)
brdarji 8:0aae5bf93aaa 289 {
brdarji 8:0aae5bf93aaa 290 return 0; // avoid exception caused by division by zero
brdarji 8:0aae5bf93aaa 291 }
brdarji 8:0aae5bf93aaa 292 P = (((uint32_t)(((int32_t)1048576)-adc_p)-(press2>>12)))*3125;
brdarji 8:0aae5bf93aaa 293 if (P < 0x80000000)
brdarji 8:0aae5bf93aaa 294 {
brdarji 8:0aae5bf93aaa 295 P = (P << 1) / ((uint32_t)press1);
brdarji 8:0aae5bf93aaa 296 }
brdarji 8:0aae5bf93aaa 297 else
brdarji 8:0aae5bf93aaa 298 {
brdarji 8:0aae5bf93aaa 299 P = (P / (uint32_t)press1) * 2;
brdarji 8:0aae5bf93aaa 300 }
brdarji 8:0aae5bf93aaa 301 press1 = (((int32_t)cal_param.dig_P9) * ((int32_t)(((P>>3) * (P>>3))>>13)))>>12;
brdarji 8:0aae5bf93aaa 302 press2 = (((int32_t)(P>>2)) * ((int32_t)cal_param.dig_P8))>>13;
brdarji 8:0aae5bf93aaa 303 P = (uint32_t)((int32_t)P + ((press1 + press2 + cal_param.dig_P7) >> 4));
brdarji 8:0aae5bf93aaa 304 return P;
brdarji 8:0aae5bf93aaa 305 }
brdarji 8:0aae5bf93aaa 306
brdarji 8:0aae5bf93aaa 307 //******************************************************************************
brdarji 8:0aae5bf93aaa 308
brdarji 8:0aae5bf93aaa 309 void BMP280::BMP280_INIT(void)
brdarji 8:0aae5bf93aaa 310 {
brdarji 8:0aae5bf93aaa 311 BMP280_SetStandbyTime(BMP280_STANDBY_TIME_1_MS); // Standby time 1ms
brdarji 8:0aae5bf93aaa 312 BMP280_SetFilterCoefficient(BMP280_FILTER_COEFF_16); // IIR Filter coefficient 16
brdarji 8:0aae5bf93aaa 313 BMP280_SetOversamplingPressure(BMP280_OVERSAMP_16X); // Pressure x16 oversampling
brdarji 8:0aae5bf93aaa 314 BMP280_SetOversamplingTemperature(BMP280_OVERSAMP_2X); // Temperature x2 oversampling
brdarji 8:0aae5bf93aaa 315 BMP280_SetPowerMode(BMP280_NORMAL_MODE);
brdarji 8:0aae5bf93aaa 316 }
brdarji 8:0aae5bf93aaa 317
brdarji 8:0aae5bf93aaa 318 //******************************************************************************
brdarji 8:0aae5bf93aaa 319
brdarji 8:0aae5bf93aaa 320 float BMP280::BMP280_GetTemperature(void)
brdarji 8:0aae5bf93aaa 321 {
brdarji 8:0aae5bf93aaa 322 return BMP280_Compensate_T();
brdarji 8:0aae5bf93aaa 323 }
brdarji 8:0aae5bf93aaa 324
brdarji 8:0aae5bf93aaa 325 //******************************************************************************
brdarji 8:0aae5bf93aaa 326
brdarji 8:0aae5bf93aaa 327 float BMP280::BMP280_GetPressure(void)
brdarji 8:0aae5bf93aaa 328 {
brdarji 8:0aae5bf93aaa 329 return BMP280_Compensate_P();
brdarji 8:0aae5bf93aaa 330 }