Lucas Lim / Mbed 2 deprecated HSP_Temperature_Barometer_CS3237

Dependencies:   mbed

Committer:
lucaslwl
Date:
Mon Aug 26 08:11:41 2019 +0000
Revision:
22:5c07298d3383
add library folder

Who changed what in which revision?

UserRevisionLine numberNew 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