Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
BMP280/BMP280.cpp@22:5c07298d3383, 2019-08-26 (annotated)
- Committer:
- lucaslwl
- Date:
- Mon Aug 26 08:11:41 2019 +0000
- Revision:
- 22:5c07298d3383
add library folder
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lucaslwl | 22:5c07298d3383 | 1 | /******************************************************************************* |
lucaslwl | 22:5c07298d3383 | 2 | * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved. |
lucaslwl | 22:5c07298d3383 | 3 | * |
lucaslwl | 22:5c07298d3383 | 4 | * Permission is hereby granted, free of charge, to any person obtaining a |
lucaslwl | 22:5c07298d3383 | 5 | * copy of this software and associated documentation files (the "Software"), |
lucaslwl | 22:5c07298d3383 | 6 | * to deal in the Software without restriction, including without limitation |
lucaslwl | 22:5c07298d3383 | 7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
lucaslwl | 22:5c07298d3383 | 8 | * and/or sell copies of the Software, and to permit persons to whom the |
lucaslwl | 22:5c07298d3383 | 9 | * Software is furnished to do so, subject to the following conditions: |
lucaslwl | 22:5c07298d3383 | 10 | * |
lucaslwl | 22:5c07298d3383 | 11 | * The above copyright notice and this permission notice shall be included |
lucaslwl | 22:5c07298d3383 | 12 | * in all copies or substantial portions of the Software. |
lucaslwl | 22:5c07298d3383 | 13 | * |
lucaslwl | 22:5c07298d3383 | 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
lucaslwl | 22:5c07298d3383 | 15 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
lucaslwl | 22:5c07298d3383 | 16 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
lucaslwl | 22:5c07298d3383 | 17 | * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES |
lucaslwl | 22:5c07298d3383 | 18 | * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
lucaslwl | 22:5c07298d3383 | 19 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
lucaslwl | 22:5c07298d3383 | 20 | * OTHER DEALINGS IN THE SOFTWARE. |
lucaslwl | 22:5c07298d3383 | 21 | * |
lucaslwl | 22:5c07298d3383 | 22 | * Except as contained in this notice, the name of Maxim Integrated |
lucaslwl | 22:5c07298d3383 | 23 | * Products, Inc. shall not be used except as stated in the Maxim Integrated |
lucaslwl | 22:5c07298d3383 | 24 | * Products, Inc. Branding Policy. |
lucaslwl | 22:5c07298d3383 | 25 | * |
lucaslwl | 22:5c07298d3383 | 26 | * The mere transfer of this software does not imply any licenses |
lucaslwl | 22:5c07298d3383 | 27 | * of trade secrets, proprietary technology, copyrights, patents, |
lucaslwl | 22:5c07298d3383 | 28 | * trademarks, maskwork rights, or any other form of intellectual |
lucaslwl | 22:5c07298d3383 | 29 | * property whatsoever. Maxim Integrated Products, Inc. retains all |
lucaslwl | 22:5c07298d3383 | 30 | * ownership rights. |
lucaslwl | 22:5c07298d3383 | 31 | ******************************************************************************* |
lucaslwl | 22:5c07298d3383 | 32 | */ |
lucaslwl | 22:5c07298d3383 | 33 | #include "mbed.h" |
lucaslwl | 22:5c07298d3383 | 34 | #include "BMP280.h" |
lucaslwl | 22:5c07298d3383 | 35 | |
lucaslwl | 22:5c07298d3383 | 36 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 37 | BMP280::BMP280(PinName sda, PinName scl, int slaveAddress) : |
lucaslwl | 22:5c07298d3383 | 38 | slaveAddress(slaveAddress) { |
lucaslwl | 22:5c07298d3383 | 39 | |
lucaslwl | 22:5c07298d3383 | 40 | i2c = new I2C(sda, scl); |
lucaslwl | 22:5c07298d3383 | 41 | isOwner = true; |
lucaslwl | 22:5c07298d3383 | 42 | } |
lucaslwl | 22:5c07298d3383 | 43 | |
lucaslwl | 22:5c07298d3383 | 44 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 45 | BMP280::BMP280(I2C *i2c, int slaveAddress) : |
lucaslwl | 22:5c07298d3383 | 46 | slaveAddress(slaveAddress) { |
lucaslwl | 22:5c07298d3383 | 47 | |
lucaslwl | 22:5c07298d3383 | 48 | this->i2c = i2c; |
lucaslwl | 22:5c07298d3383 | 49 | isOwner = false; |
lucaslwl | 22:5c07298d3383 | 50 | |
lucaslwl | 22:5c07298d3383 | 51 | i2c->frequency(100000); |
lucaslwl | 22:5c07298d3383 | 52 | loggingEnabled = 0; |
lucaslwl | 22:5c07298d3383 | 53 | loggingSampleRate = 5; |
lucaslwl | 22:5c07298d3383 | 54 | } |
lucaslwl | 22:5c07298d3383 | 55 | |
lucaslwl | 22:5c07298d3383 | 56 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 57 | BMP280::~BMP280(void) { |
lucaslwl | 22:5c07298d3383 | 58 | |
lucaslwl | 22:5c07298d3383 | 59 | if (isOwner == true) { |
lucaslwl | 22:5c07298d3383 | 60 | delete i2c; |
lucaslwl | 22:5c07298d3383 | 61 | } |
lucaslwl | 22:5c07298d3383 | 62 | } |
lucaslwl | 22:5c07298d3383 | 63 | |
lucaslwl | 22:5c07298d3383 | 64 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 65 | int BMP280::init(BMP280::bmp280_osrs_P_t Osrs_p, BMP280::bmp280_osrs_T_t Osrs_t, |
lucaslwl | 22:5c07298d3383 | 66 | BMP280::bmp280_FILT_t Filter, BMP280::bmp280_MODE_t Mode, |
lucaslwl | 22:5c07298d3383 | 67 | BMP280::bmp280_TSB_t T_sb) { |
lucaslwl | 22:5c07298d3383 | 68 | |
lucaslwl | 22:5c07298d3383 | 69 | char raw_Tn[6]; |
lucaslwl | 22:5c07298d3383 | 70 | char raw_Pn[20]; |
lucaslwl | 22:5c07298d3383 | 71 | |
lucaslwl | 22:5c07298d3383 | 72 | bmp280_ctrl_meas_t ctrl_meas; |
lucaslwl | 22:5c07298d3383 | 73 | bmp280_config_t config; |
lucaslwl | 22:5c07298d3383 | 74 | |
lucaslwl | 22:5c07298d3383 | 75 | /// |
lucaslwl | 22:5c07298d3383 | 76 | /// Read all the temp coeffecients from the BMP280 memory. It will be used in |
lucaslwl | 22:5c07298d3383 | 77 | /// calculation |
lucaslwl | 22:5c07298d3383 | 78 | /// |
lucaslwl | 22:5c07298d3383 | 79 | if (reg_read(BMP280_CALIB00, raw_Tn, 6) != 0) { |
lucaslwl | 22:5c07298d3383 | 80 | return -1; |
lucaslwl | 22:5c07298d3383 | 81 | } |
lucaslwl | 22:5c07298d3383 | 82 | |
lucaslwl | 22:5c07298d3383 | 83 | dig_T1 = (((uint16_t)raw_Tn[1]) << 8) | raw_Tn[0]; |
lucaslwl | 22:5c07298d3383 | 84 | dig_T2 = (((int16_t)raw_Tn[3]) << 8) | raw_Tn[2]; |
lucaslwl | 22:5c07298d3383 | 85 | dig_T3 = (((int16_t)raw_Tn[5]) << 8) | raw_Tn[4]; |
lucaslwl | 22:5c07298d3383 | 86 | |
lucaslwl | 22:5c07298d3383 | 87 | /// |
lucaslwl | 22:5c07298d3383 | 88 | /// Read all the press coeffecients from the BMP280 memory. It will be used in |
lucaslwl | 22:5c07298d3383 | 89 | /// calculation |
lucaslwl | 22:5c07298d3383 | 90 | /// |
lucaslwl | 22:5c07298d3383 | 91 | if (reg_read((BMP280_REG_map_t)(BMP280_CALIB00+6) /*reg*/, raw_Pn, 20) != 0) { |
lucaslwl | 22:5c07298d3383 | 92 | return -1; |
lucaslwl | 22:5c07298d3383 | 93 | } |
lucaslwl | 22:5c07298d3383 | 94 | |
lucaslwl | 22:5c07298d3383 | 95 | dig_P1 = (((uint16_t)raw_Pn[1]) << 8) | raw_Pn[0]; |
lucaslwl | 22:5c07298d3383 | 96 | dig_P2 = (((int16_t)raw_Pn[3]) << 8) | raw_Pn[2]; |
lucaslwl | 22:5c07298d3383 | 97 | dig_P3 = (((int16_t)raw_Pn[5]) << 8) | raw_Pn[4]; |
lucaslwl | 22:5c07298d3383 | 98 | dig_P4 = (((int16_t)raw_Pn[7]) << 8) | raw_Pn[6]; |
lucaslwl | 22:5c07298d3383 | 99 | dig_P5 = (((int16_t)raw_Pn[9]) << 8) | raw_Pn[8]; |
lucaslwl | 22:5c07298d3383 | 100 | dig_P6 = (((int16_t)raw_Pn[11]) << 8) | raw_Pn[10]; |
lucaslwl | 22:5c07298d3383 | 101 | dig_P7 = (((int16_t)raw_Pn[13]) << 8) | raw_Pn[12]; |
lucaslwl | 22:5c07298d3383 | 102 | dig_P8 = (((int16_t)raw_Pn[15]) << 8) | raw_Pn[14]; |
lucaslwl | 22:5c07298d3383 | 103 | dig_P9 = (((int16_t)raw_Pn[17]) << 8) | raw_Pn[16]; |
lucaslwl | 22:5c07298d3383 | 104 | |
lucaslwl | 22:5c07298d3383 | 105 | |
lucaslwl | 22:5c07298d3383 | 106 | wait(1.0 / 10.0); |
lucaslwl | 22:5c07298d3383 | 107 | |
lucaslwl | 22:5c07298d3383 | 108 | /****/ |
lucaslwl | 22:5c07298d3383 | 109 | if (reg_read(BMP280_CTRL_MEAS, &ctrl_meas.all, 1) != 0) { |
lucaslwl | 22:5c07298d3383 | 110 | return -1; |
lucaslwl | 22:5c07298d3383 | 111 | } |
lucaslwl | 22:5c07298d3383 | 112 | |
lucaslwl | 22:5c07298d3383 | 113 | ctrl_meas.bit.osrs_p = Osrs_p; |
lucaslwl | 22:5c07298d3383 | 114 | ctrl_meas.bit.osrs_t = Osrs_t; |
lucaslwl | 22:5c07298d3383 | 115 | |
lucaslwl | 22:5c07298d3383 | 116 | ctrl_meas.bit.mode = Mode; |
lucaslwl | 22:5c07298d3383 | 117 | |
lucaslwl | 22:5c07298d3383 | 118 | if (reg_write(BMP280_CTRL_MEAS, ctrl_meas.all) != 0) { |
lucaslwl | 22:5c07298d3383 | 119 | return -1; |
lucaslwl | 22:5c07298d3383 | 120 | } |
lucaslwl | 22:5c07298d3383 | 121 | |
lucaslwl | 22:5c07298d3383 | 122 | /****/ |
lucaslwl | 22:5c07298d3383 | 123 | |
lucaslwl | 22:5c07298d3383 | 124 | if (reg_read(BMP280_CONFIG, &config.all, 1) != 0) { |
lucaslwl | 22:5c07298d3383 | 125 | return -1; |
lucaslwl | 22:5c07298d3383 | 126 | } |
lucaslwl | 22:5c07298d3383 | 127 | |
lucaslwl | 22:5c07298d3383 | 128 | config.bit.filter = Filter; |
lucaslwl | 22:5c07298d3383 | 129 | |
lucaslwl | 22:5c07298d3383 | 130 | if (Mode == 0b11) { |
lucaslwl | 22:5c07298d3383 | 131 | config.bit.t_sb = T_sb; |
lucaslwl | 22:5c07298d3383 | 132 | } |
lucaslwl | 22:5c07298d3383 | 133 | |
lucaslwl | 22:5c07298d3383 | 134 | if (reg_write(BMP280_CONFIG, config.all) != 0) { |
lucaslwl | 22:5c07298d3383 | 135 | return -1; |
lucaslwl | 22:5c07298d3383 | 136 | } |
lucaslwl | 22:5c07298d3383 | 137 | |
lucaslwl | 22:5c07298d3383 | 138 | return 0; |
lucaslwl | 22:5c07298d3383 | 139 | } |
lucaslwl | 22:5c07298d3383 | 140 | |
lucaslwl | 22:5c07298d3383 | 141 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 142 | float BMP280::ToFahrenheit(float temperature) { |
lucaslwl | 22:5c07298d3383 | 143 | |
lucaslwl | 22:5c07298d3383 | 144 | return temperature * (9 / 5.0f) + 32; |
lucaslwl | 22:5c07298d3383 | 145 | } |
lucaslwl | 22:5c07298d3383 | 146 | |
lucaslwl | 22:5c07298d3383 | 147 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 148 | int BMP280::ReadCompDataRaw2(char *bmp280_rawData) { |
lucaslwl | 22:5c07298d3383 | 149 | |
lucaslwl | 22:5c07298d3383 | 150 | int i; |
lucaslwl | 22:5c07298d3383 | 151 | char data[6]; |
lucaslwl | 22:5c07298d3383 | 152 | float temp; |
lucaslwl | 22:5c07298d3383 | 153 | float pressure; |
lucaslwl | 22:5c07298d3383 | 154 | int iPressure; |
lucaslwl | 22:5c07298d3383 | 155 | char str[32]; |
lucaslwl | 22:5c07298d3383 | 156 | ReadCompDataRaw(data); |
lucaslwl | 22:5c07298d3383 | 157 | ToFloat(data, &temp, &pressure); |
lucaslwl | 22:5c07298d3383 | 158 | iPressure = (int)pressure; |
lucaslwl | 22:5c07298d3383 | 159 | sprintf(str, "%d ", iPressure); |
lucaslwl | 22:5c07298d3383 | 160 | for (i = 0; i < 6; i++) { |
lucaslwl | 22:5c07298d3383 | 161 | bmp280_rawData[i] = str[i]; |
lucaslwl | 22:5c07298d3383 | 162 | } |
lucaslwl | 22:5c07298d3383 | 163 | return 0; |
lucaslwl | 22:5c07298d3383 | 164 | } |
lucaslwl | 22:5c07298d3383 | 165 | |
lucaslwl | 22:5c07298d3383 | 166 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 167 | int BMP280::ReadCompDataRaw(char *bmp280_rawData) { |
lucaslwl | 22:5c07298d3383 | 168 | |
lucaslwl | 22:5c07298d3383 | 169 | if (reg_read(BMP280_PRESS_MSB, bmp280_rawData, 6) != 0) { |
lucaslwl | 22:5c07298d3383 | 170 | return -1; |
lucaslwl | 22:5c07298d3383 | 171 | } |
lucaslwl | 22:5c07298d3383 | 172 | return 0; |
lucaslwl | 22:5c07298d3383 | 173 | } |
lucaslwl | 22:5c07298d3383 | 174 | |
lucaslwl | 22:5c07298d3383 | 175 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 176 | void BMP280::ToFloat(char *bmp280_rawData, float *Temp_degC, float *Press_Pa) { |
lucaslwl | 22:5c07298d3383 | 177 | |
lucaslwl | 22:5c07298d3383 | 178 | bmp280_rawPress = (uint32_t)(bmp280_rawData[0] << 12) | |
lucaslwl | 22:5c07298d3383 | 179 | (bmp280_rawData[1] << 4) | (bmp280_rawData[2] >> 4); |
lucaslwl | 22:5c07298d3383 | 180 | |
lucaslwl | 22:5c07298d3383 | 181 | bmp280_rawTemp = (uint32_t)(bmp280_rawData[3] << 12) | |
lucaslwl | 22:5c07298d3383 | 182 | (bmp280_rawData[4] << 4) | (bmp280_rawData[5] >> 4); |
lucaslwl | 22:5c07298d3383 | 183 | |
lucaslwl | 22:5c07298d3383 | 184 | *Temp_degC = compensate_T_float(bmp280_rawTemp); |
lucaslwl | 22:5c07298d3383 | 185 | *Press_Pa = compensate_P_float(bmp280_rawPress); |
lucaslwl | 22:5c07298d3383 | 186 | } |
lucaslwl | 22:5c07298d3383 | 187 | |
lucaslwl | 22:5c07298d3383 | 188 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 189 | int BMP280::ReadCompData(float *Temp_degC, float *Press_Pa) { |
lucaslwl | 22:5c07298d3383 | 190 | |
lucaslwl | 22:5c07298d3383 | 191 | char bmp280_rawData[6]; |
lucaslwl | 22:5c07298d3383 | 192 | |
lucaslwl | 22:5c07298d3383 | 193 | if (ReadCompDataRaw(bmp280_rawData) != 0) { |
lucaslwl | 22:5c07298d3383 | 194 | return -1; |
lucaslwl | 22:5c07298d3383 | 195 | } |
lucaslwl | 22:5c07298d3383 | 196 | ToFloat(bmp280_rawData, Temp_degC, Press_Pa); |
lucaslwl | 22:5c07298d3383 | 197 | return 0; |
lucaslwl | 22:5c07298d3383 | 198 | } |
lucaslwl | 22:5c07298d3383 | 199 | |
lucaslwl | 22:5c07298d3383 | 200 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 201 | int BMP280::reg_write(BMP280_REG_map_t reg, char value) { |
lucaslwl | 22:5c07298d3383 | 202 | |
lucaslwl | 22:5c07298d3383 | 203 | int result; |
lucaslwl | 22:5c07298d3383 | 204 | char cmdData[2] = {(char)reg, value}; |
lucaslwl | 22:5c07298d3383 | 205 | result = i2c->write(slaveAddress, cmdData, 2); |
lucaslwl | 22:5c07298d3383 | 206 | if (result != 0) { |
lucaslwl | 22:5c07298d3383 | 207 | return -1; |
lucaslwl | 22:5c07298d3383 | 208 | } |
lucaslwl | 22:5c07298d3383 | 209 | return 0; |
lucaslwl | 22:5c07298d3383 | 210 | } |
lucaslwl | 22:5c07298d3383 | 211 | |
lucaslwl | 22:5c07298d3383 | 212 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 213 | int BMP280::reg_read(BMP280_REG_map_t reg, char *value, char number) { |
lucaslwl | 22:5c07298d3383 | 214 | |
lucaslwl | 22:5c07298d3383 | 215 | int result; |
lucaslwl | 22:5c07298d3383 | 216 | char cmdData[1] = {(char)reg}; |
lucaslwl | 22:5c07298d3383 | 217 | |
lucaslwl | 22:5c07298d3383 | 218 | result = i2c->write(slaveAddress, cmdData, 1); |
lucaslwl | 22:5c07298d3383 | 219 | if (result != 0) { |
lucaslwl | 22:5c07298d3383 | 220 | return -1; |
lucaslwl | 22:5c07298d3383 | 221 | } |
lucaslwl | 22:5c07298d3383 | 222 | result = i2c->read(slaveAddress, value, number); |
lucaslwl | 22:5c07298d3383 | 223 | if (result != 0) { |
lucaslwl | 22:5c07298d3383 | 224 | return -1; |
lucaslwl | 22:5c07298d3383 | 225 | } |
lucaslwl | 22:5c07298d3383 | 226 | return 0; |
lucaslwl | 22:5c07298d3383 | 227 | } |
lucaslwl | 22:5c07298d3383 | 228 | |
lucaslwl | 22:5c07298d3383 | 229 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 230 | int BMP280::Sleep(void) { |
lucaslwl | 22:5c07298d3383 | 231 | |
lucaslwl | 22:5c07298d3383 | 232 | bmp280_ctrl_meas_t ctrl_meas; |
lucaslwl | 22:5c07298d3383 | 233 | |
lucaslwl | 22:5c07298d3383 | 234 | if (reg_read(BMP280_CTRL_MEAS, &ctrl_meas.all, 1) != 0) { |
lucaslwl | 22:5c07298d3383 | 235 | return -1; |
lucaslwl | 22:5c07298d3383 | 236 | } |
lucaslwl | 22:5c07298d3383 | 237 | ctrl_meas.bit.mode = 0b00; // put everything to sleep mode... |
lucaslwl | 22:5c07298d3383 | 238 | |
lucaslwl | 22:5c07298d3383 | 239 | if (reg_write(BMP280_CTRL_MEAS, ctrl_meas.all) != 0) { |
lucaslwl | 22:5c07298d3383 | 240 | return -1; |
lucaslwl | 22:5c07298d3383 | 241 | } |
lucaslwl | 22:5c07298d3383 | 242 | return 0; |
lucaslwl | 22:5c07298d3383 | 243 | } |
lucaslwl | 22:5c07298d3383 | 244 | |
lucaslwl | 22:5c07298d3383 | 245 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 246 | void BMP280::Reset(void) { |
lucaslwl | 22:5c07298d3383 | 247 | |
lucaslwl | 22:5c07298d3383 | 248 | reg_write(BMP280_RESET, 0xB6); // Initiate a Soft Reset |
lucaslwl | 22:5c07298d3383 | 249 | } |
lucaslwl | 22:5c07298d3383 | 250 | |
lucaslwl | 22:5c07298d3383 | 251 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 252 | int BMP280::Detect(void) { |
lucaslwl | 22:5c07298d3383 | 253 | |
lucaslwl | 22:5c07298d3383 | 254 | if (reg_read(BMP280_ID, &bmp280_id, 1) != 0) { |
lucaslwl | 22:5c07298d3383 | 255 | return -1; |
lucaslwl | 22:5c07298d3383 | 256 | } |
lucaslwl | 22:5c07298d3383 | 257 | |
lucaslwl | 22:5c07298d3383 | 258 | if (bmp280_id == 0x58) { |
lucaslwl | 22:5c07298d3383 | 259 | return 1; |
lucaslwl | 22:5c07298d3383 | 260 | } |
lucaslwl | 22:5c07298d3383 | 261 | return 0; |
lucaslwl | 22:5c07298d3383 | 262 | } |
lucaslwl | 22:5c07298d3383 | 263 | |
lucaslwl | 22:5c07298d3383 | 264 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 265 | int BMP280::ReadId(void) { |
lucaslwl | 22:5c07298d3383 | 266 | |
lucaslwl | 22:5c07298d3383 | 267 | if (reg_read(BMP280_ID, &bmp280_id, 1) != 0) { |
lucaslwl | 22:5c07298d3383 | 268 | return -1; |
lucaslwl | 22:5c07298d3383 | 269 | } |
lucaslwl | 22:5c07298d3383 | 270 | return bmp280_id; |
lucaslwl | 22:5c07298d3383 | 271 | } |
lucaslwl | 22:5c07298d3383 | 272 | |
lucaslwl | 22:5c07298d3383 | 273 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 274 | float BMP280::compensate_T_float(int32_t adc_T) { |
lucaslwl | 22:5c07298d3383 | 275 | |
lucaslwl | 22:5c07298d3383 | 276 | float var1, var2, T; |
lucaslwl | 22:5c07298d3383 | 277 | var1 = |
lucaslwl | 22:5c07298d3383 | 278 | (((float)adc_T) / 16384.0f - ((float)dig_T1) / 1024.0f) * ((float)dig_T2); |
lucaslwl | 22:5c07298d3383 | 279 | |
lucaslwl | 22:5c07298d3383 | 280 | var2 = ((((float)adc_T) / 131072.0f - ((float)dig_T1) / 8192.0f) * |
lucaslwl | 22:5c07298d3383 | 281 | (((float)adc_T) / 131072.0f - ((float)dig_T1) / 8192.0f)) * |
lucaslwl | 22:5c07298d3383 | 282 | ((float)dig_T3); |
lucaslwl | 22:5c07298d3383 | 283 | |
lucaslwl | 22:5c07298d3383 | 284 | t_fine = (int32_t)(var1 + var2); |
lucaslwl | 22:5c07298d3383 | 285 | |
lucaslwl | 22:5c07298d3383 | 286 | T = (var1 + var2) / 5120.0f; |
lucaslwl | 22:5c07298d3383 | 287 | |
lucaslwl | 22:5c07298d3383 | 288 | return T; |
lucaslwl | 22:5c07298d3383 | 289 | } |
lucaslwl | 22:5c07298d3383 | 290 | |
lucaslwl | 22:5c07298d3383 | 291 | //****************************************************************************** |
lucaslwl | 22:5c07298d3383 | 292 | float BMP280::compensate_P_float(int32_t adc_P) { |
lucaslwl | 22:5c07298d3383 | 293 | |
lucaslwl | 22:5c07298d3383 | 294 | float var1, var2, p; |
lucaslwl | 22:5c07298d3383 | 295 | var1 = ((float)t_fine / 2.0f) - 64000.0f; |
lucaslwl | 22:5c07298d3383 | 296 | var2 = var1 * var1 * ((float)dig_P6) / 32768.0f; |
lucaslwl | 22:5c07298d3383 | 297 | var2 = var2 + var1 * ((float)dig_P5) * 2.0f; |
lucaslwl | 22:5c07298d3383 | 298 | var2 = (var2 / 4.0f) + (((float)dig_P4) * 65536.0f); |
lucaslwl | 22:5c07298d3383 | 299 | var1 = (((float)dig_P3) * var1 * var1 / 524288.0f + ((float)dig_P2) * var1) / 524288.0f; |
lucaslwl | 22:5c07298d3383 | 300 | var1 = (1.0f + var1 / 32768.0f) * ((float)dig_P1); |
lucaslwl | 22:5c07298d3383 | 301 | if (var1 == 0.0f) { |
lucaslwl | 22:5c07298d3383 | 302 | return 0; // avoid exception caused by division by zero |
lucaslwl | 22:5c07298d3383 | 303 | } |
lucaslwl | 22:5c07298d3383 | 304 | p = 1048576.0f - (float)adc_P; |
lucaslwl | 22:5c07298d3383 | 305 | p = (p - (var2 / 4096.0f)) * 6250.0f / var1; |
lucaslwl | 22:5c07298d3383 | 306 | var1 = ((float)dig_P9) * p * p / 2147483648.0f; |
lucaslwl | 22:5c07298d3383 | 307 | var2 = p * ((float)dig_P8) / 32768.0f; |
lucaslwl | 22:5c07298d3383 | 308 | p = p + (var1 + var2 + ((float)dig_P7)) / 16.0f; |
lucaslwl | 22:5c07298d3383 | 309 | return p; |
lucaslwl | 22:5c07298d3383 | 310 | } |
lucaslwl | 22:5c07298d3383 | 311 |