BMP280 I2C Library
Fork of BMP280 by
BMP280.cpp@8:0aae5bf93aaa, 2017-11-23 (annotated)
- 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?
User | Revision | Line number | New 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 | } |