Kenji Arai / BME280
Committer:
kenjiArai
Date:
Sat Dec 29 05:49:55 2018 +0000
Revision:
6:f94ffb546799
Parent:
5:c1f1647004c4
Child:
7:d94871acb463
added few functions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MACRUM 1:763a4018aaec 1 /**
MACRUM 5:c1f1647004c4 2 ******************************************************************************
MACRUM 5:c1f1647004c4 3 * @file BME280.cpp
MACRUM 5:c1f1647004c4 4 * @author Toyomasa Watarai
MACRUM 5:c1f1647004c4 5 * @version V1.0.0
MACRUM 5:c1f1647004c4 6 * @date 11 March 2017
MACRUM 5:c1f1647004c4 7 * @brief BME280 class implementation
MACRUM 5:c1f1647004c4 8 ******************************************************************************
MACRUM 5:c1f1647004c4 9 * @attention
MACRUM 1:763a4018aaec 10 *
MACRUM 5:c1f1647004c4 11 * Permission is hereby granted, free of charge, to any person obtaining a copy
MACRUM 5:c1f1647004c4 12 * of this software and associated documentation files (the "Software"), to deal
MACRUM 5:c1f1647004c4 13 * in the Software without restriction, including without limitation the rights
MACRUM 5:c1f1647004c4 14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
MACRUM 5:c1f1647004c4 15 * copies of the Software, and to permit persons to whom the Software is
MACRUM 5:c1f1647004c4 16 * furnished to do so, subject to the following conditions:
MACRUM 1:763a4018aaec 17 *
MACRUM 5:c1f1647004c4 18 * The above copyright notice and this permission notice shall be included in
MACRUM 5:c1f1647004c4 19 * all copies or substantial portions of the Software.
MACRUM 1:763a4018aaec 20 *
MACRUM 5:c1f1647004c4 21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
MACRUM 5:c1f1647004c4 22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
MACRUM 5:c1f1647004c4 23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
MACRUM 5:c1f1647004c4 24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
MACRUM 5:c1f1647004c4 25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
MACRUM 5:c1f1647004c4 26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
MACRUM 5:c1f1647004c4 27 * THE SOFTWARE.
MACRUM 1:763a4018aaec 28 */
MACRUM 1:763a4018aaec 29
kenjiArai 6:f94ffb546799 30 /*
kenjiArai 6:f94ffb546799 31 * Modified by Kenji Arai / JH1PJL
kenjiArai 6:f94ffb546799 32 *
kenjiArai 6:f94ffb546799 33 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 6:f94ffb546799 34 * http://mbed.org/users/kenjiArai/
kenjiArai 6:f94ffb546799 35 * Created: November 21st, 2018
kenjiArai 6:f94ffb546799 36 * Revised: December 29th, 2018
kenjiArai 6:f94ffb546799 37 */
kenjiArai 6:f94ffb546799 38
MACRUM 0:ade9be832910 39 #include "mbed.h"
MACRUM 0:ade9be832910 40 #include "BME280.h"
MACRUM 0:ade9be832910 41
MACRUM 0:ade9be832910 42 BME280::BME280(PinName sda, PinName scl, char slave_adr)
MACRUM 0:ade9be832910 43 :
MACRUM 0:ade9be832910 44 i2c_p(new I2C(sda, scl)),
MACRUM 0:ade9be832910 45 i2c(*i2c_p),
MACRUM 0:ade9be832910 46 address(slave_adr),
MACRUM 0:ade9be832910 47 t_fine(0)
MACRUM 0:ade9be832910 48 {
MACRUM 0:ade9be832910 49 initialize();
MACRUM 0:ade9be832910 50 }
MACRUM 0:ade9be832910 51
MACRUM 0:ade9be832910 52 BME280::BME280(I2C &i2c_obj, char slave_adr)
MACRUM 0:ade9be832910 53 :
MACRUM 0:ade9be832910 54 i2c_p(NULL),
MACRUM 0:ade9be832910 55 i2c(i2c_obj),
MACRUM 0:ade9be832910 56 address(slave_adr),
MACRUM 0:ade9be832910 57 t_fine(0)
MACRUM 0:ade9be832910 58 {
MACRUM 0:ade9be832910 59 initialize();
MACRUM 0:ade9be832910 60 }
MACRUM 0:ade9be832910 61
MACRUM 0:ade9be832910 62 BME280::~BME280()
MACRUM 0:ade9be832910 63 {
MACRUM 0:ade9be832910 64 if (NULL != i2c_p)
MACRUM 0:ade9be832910 65 delete i2c_p;
MACRUM 0:ade9be832910 66 }
MACRUM 0:ade9be832910 67
MACRUM 0:ade9be832910 68 void BME280::initialize()
MACRUM 0:ade9be832910 69 {
MACRUM 0:ade9be832910 70 char cmd[18];
kenjiArai 6:f94ffb546799 71 uint8_t id;
kenjiArai 6:f94ffb546799 72
kenjiArai 6:f94ffb546799 73 wait_ms(2);
kenjiArai 6:f94ffb546799 74 id = getID();
kenjiArai 6:f94ffb546799 75 if (id != 0x60){
kenjiArai 6:f94ffb546799 76 if (address == DEFAULT_SLAVE_ADDRESS){
kenjiArai 6:f94ffb546799 77 address = DEFAULT_SLAVE_ADDRESS;
kenjiArai 6:f94ffb546799 78 } else if (address == ANOTHER_SLAVE_ADDRESS){
kenjiArai 6:f94ffb546799 79 address = DEFAULT_SLAVE_ADDRESS;
kenjiArai 6:f94ffb546799 80 }
kenjiArai 6:f94ffb546799 81 id = getID();
kenjiArai 6:f94ffb546799 82 if (id != 0x60){
kenjiArai 6:f94ffb546799 83 cmd[0] = 0xe0; // reset addr
kenjiArai 6:f94ffb546799 84 cmd[1] = 0xb6; // reset command
kenjiArai 6:f94ffb546799 85 i2c.write(address, cmd, 2);
kenjiArai 6:f94ffb546799 86 wait_ms(2);
kenjiArai 6:f94ffb546799 87 }
kenjiArai 6:f94ffb546799 88 }
kenjiArai 6:f94ffb546799 89
MACRUM 0:ade9be832910 90 cmd[0] = 0xf2; // ctrl_hum
MACRUM 0:ade9be832910 91 cmd[1] = 0x01; // Humidity oversampling x1
MACRUM 0:ade9be832910 92 i2c.write(address, cmd, 2);
MACRUM 0:ade9be832910 93
MACRUM 0:ade9be832910 94 cmd[0] = 0xf4; // ctrl_meas
kenjiArai 6:f94ffb546799 95 // Temparature oversampling x1, Pressure oversampling x1, Normal mode
kenjiArai 6:f94ffb546799 96 cmd[1] = 0x27;
MACRUM 0:ade9be832910 97 i2c.write(address, cmd, 2);
MACRUM 0:ade9be832910 98
MACRUM 0:ade9be832910 99 cmd[0] = 0xf5; // config
MACRUM 0:ade9be832910 100 cmd[1] = 0xa0; // Standby 1000ms, Filter off
MACRUM 0:ade9be832910 101 i2c.write(address, cmd, 2);
MACRUM 0:ade9be832910 102
MACRUM 0:ade9be832910 103 cmd[0] = 0x88; // read dig_T regs
MACRUM 0:ade9be832910 104 i2c.write(address, cmd, 1);
MACRUM 0:ade9be832910 105 i2c.read(address, cmd, 6);
MACRUM 0:ade9be832910 106
MACRUM 0:ade9be832910 107 dig_T1 = (cmd[1] << 8) | cmd[0];
MACRUM 0:ade9be832910 108 dig_T2 = (cmd[3] << 8) | cmd[2];
MACRUM 0:ade9be832910 109 dig_T3 = (cmd[5] << 8) | cmd[4];
MACRUM 0:ade9be832910 110
MACRUM 0:ade9be832910 111 DEBUG_PRINT("dig_T = 0x%x, 0x%x, 0x%x\n", dig_T1, dig_T2, dig_T3);
MACRUM 0:ade9be832910 112
MACRUM 0:ade9be832910 113 cmd[0] = 0x8E; // read dig_P regs
MACRUM 0:ade9be832910 114 i2c.write(address, cmd, 1);
MACRUM 0:ade9be832910 115 i2c.read(address, cmd, 18);
MACRUM 0:ade9be832910 116
MACRUM 0:ade9be832910 117 dig_P1 = (cmd[ 1] << 8) | cmd[ 0];
MACRUM 0:ade9be832910 118 dig_P2 = (cmd[ 3] << 8) | cmd[ 2];
MACRUM 0:ade9be832910 119 dig_P3 = (cmd[ 5] << 8) | cmd[ 4];
MACRUM 0:ade9be832910 120 dig_P4 = (cmd[ 7] << 8) | cmd[ 6];
MACRUM 0:ade9be832910 121 dig_P5 = (cmd[ 9] << 8) | cmd[ 8];
MACRUM 0:ade9be832910 122 dig_P6 = (cmd[11] << 8) | cmd[10];
MACRUM 0:ade9be832910 123 dig_P7 = (cmd[13] << 8) | cmd[12];
MACRUM 0:ade9be832910 124 dig_P8 = (cmd[15] << 8) | cmd[14];
MACRUM 0:ade9be832910 125 dig_P9 = (cmd[17] << 8) | cmd[16];
MACRUM 0:ade9be832910 126
kenjiArai 6:f94ffb546799 127 DEBUG_PRINT(
kenjiArai 6:f94ffb546799 128 "dig_P = 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n",
kenjiArai 6:f94ffb546799 129 dig_P1, dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9
kenjiArai 6:f94ffb546799 130 );
MACRUM 0:ade9be832910 131
MACRUM 0:ade9be832910 132 cmd[0] = 0xA1; // read dig_H regs
MACRUM 0:ade9be832910 133 i2c.write(address, cmd, 1);
MACRUM 2:c35f637c28ef 134 i2c.read(address, cmd, 1);
MACRUM 2:c35f637c28ef 135 cmd[1] = 0xE1; // read dig_H regs
MACRUM 2:c35f637c28ef 136 i2c.write(address, &cmd[1], 1);
MACRUM 2:c35f637c28ef 137 i2c.read(address, &cmd[1], 7);
MACRUM 2:c35f637c28ef 138
MACRUM 0:ade9be832910 139 dig_H1 = cmd[0];
MACRUM 0:ade9be832910 140 dig_H2 = (cmd[2] << 8) | cmd[1];
MACRUM 0:ade9be832910 141 dig_H3 = cmd[3];
MACRUM 0:ade9be832910 142 dig_H4 = (cmd[4] << 4) | (cmd[5] & 0x0f);
MACRUM 2:c35f637c28ef 143 dig_H5 = (cmd[6] << 4) | ((cmd[5]>>4) & 0x0f);
MACRUM 2:c35f637c28ef 144 dig_H6 = cmd[7];
MACRUM 0:ade9be832910 145
kenjiArai 6:f94ffb546799 146 DEBUG_PRINT("dig_H = 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n",
kenjiArai 6:f94ffb546799 147 dig_H1, dig_H2, dig_H3, dig_H4, dig_H5, dig_H6
kenjiArai 6:f94ffb546799 148 );
MACRUM 0:ade9be832910 149 }
MACRUM 0:ade9be832910 150
MACRUM 0:ade9be832910 151 float BME280::getTemperature()
MACRUM 0:ade9be832910 152 {
MACRUM 0:ade9be832910 153 uint32_t temp_raw;
MACRUM 0:ade9be832910 154 float tempf;
MACRUM 0:ade9be832910 155 char cmd[4];
kenjiArai 6:f94ffb546799 156
kenjiArai 6:f94ffb546799 157 if(check_chip() == false){
kenjiArai 6:f94ffb546799 158 return 100.0f;
kenjiArai 6:f94ffb546799 159 }
MACRUM 0:ade9be832910 160 cmd[0] = 0xfa; // temp_msb
MACRUM 0:ade9be832910 161 i2c.write(address, cmd, 1);
takafuminaka 3:d4eb81284ea0 162 i2c.read(address, &cmd[1], 3);
MACRUM 0:ade9be832910 163
MACRUM 0:ade9be832910 164 temp_raw = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4);
MACRUM 0:ade9be832910 165
MACRUM 0:ade9be832910 166 int32_t temp;
MACRUM 0:ade9be832910 167
MACRUM 0:ade9be832910 168 temp =
MACRUM 0:ade9be832910 169 (((((temp_raw >> 3) - (dig_T1 << 1))) * dig_T2) >> 11) +
kenjiArai 6:f94ffb546799 170 ((((((temp_raw >> 4) - dig_T1) * ((temp_raw >> 4) - dig_T1)) >> 12)
kenjiArai 6:f94ffb546799 171 * dig_T3) >> 14);
MACRUM 0:ade9be832910 172
MACRUM 0:ade9be832910 173 t_fine = temp;
MACRUM 0:ade9be832910 174 temp = (temp * 5 + 128) >> 8;
MACRUM 0:ade9be832910 175 tempf = (float)temp;
MACRUM 0:ade9be832910 176
MACRUM 0:ade9be832910 177 return (tempf/100.0f);
MACRUM 0:ade9be832910 178 }
MACRUM 0:ade9be832910 179
MACRUM 0:ade9be832910 180 float BME280::getPressure()
MACRUM 0:ade9be832910 181 {
MACRUM 0:ade9be832910 182 uint32_t press_raw;
MACRUM 0:ade9be832910 183 float pressf;
MACRUM 0:ade9be832910 184 char cmd[4];
kenjiArai 6:f94ffb546799 185
kenjiArai 6:f94ffb546799 186 if(check_chip() == false){
kenjiArai 6:f94ffb546799 187 return 2000.0f;
kenjiArai 6:f94ffb546799 188 }
kenjiArai 6:f94ffb546799 189
MACRUM 0:ade9be832910 190 cmd[0] = 0xf7; // press_msb
MACRUM 0:ade9be832910 191 i2c.write(address, cmd, 1);
takafuminaka 3:d4eb81284ea0 192 i2c.read(address, &cmd[1], 3);
MACRUM 0:ade9be832910 193
MACRUM 0:ade9be832910 194 press_raw = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4);
MACRUM 0:ade9be832910 195
MACRUM 0:ade9be832910 196 int32_t var1, var2;
MACRUM 0:ade9be832910 197 uint32_t press;
MACRUM 0:ade9be832910 198
MACRUM 0:ade9be832910 199 var1 = (t_fine >> 1) - 64000;
MACRUM 0:ade9be832910 200 var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * dig_P6;
MACRUM 0:ade9be832910 201 var2 = var2 + ((var1 * dig_P5) << 1);
MACRUM 0:ade9be832910 202 var2 = (var2 >> 2) + (dig_P4 << 16);
kenjiArai 6:f94ffb546799 203 var1 = (((dig_P3 * (((var1 >> 2)*(var1 >> 2)) >> 13)) >> 3)
kenjiArai 6:f94ffb546799 204 + ((dig_P2 * var1) >> 1)) >> 18;
MACRUM 0:ade9be832910 205 var1 = ((32768 + var1) * dig_P1) >> 15;
MACRUM 0:ade9be832910 206 if (var1 == 0) {
MACRUM 0:ade9be832910 207 return 0;
MACRUM 0:ade9be832910 208 }
MACRUM 0:ade9be832910 209 press = (((1048576 - press_raw) - (var2 >> 12))) * 3125;
MACRUM 0:ade9be832910 210 if(press < 0x80000000) {
MACRUM 0:ade9be832910 211 press = (press << 1) / var1;
MACRUM 0:ade9be832910 212 } else {
MACRUM 0:ade9be832910 213 press = (press / var1) * 2;
MACRUM 0:ade9be832910 214 }
kenjiArai 6:f94ffb546799 215 var1 = ((int32_t)dig_P9 * ((int32_t)(((press >> 3)
kenjiArai 6:f94ffb546799 216 * (press >> 3)) >> 13))) >> 12;
MACRUM 0:ade9be832910 217 var2 = (((int32_t)(press >> 2)) * (int32_t)dig_P8) >> 13;
MACRUM 0:ade9be832910 218 press = (press + ((var1 + var2 + dig_P7) >> 4));
MACRUM 0:ade9be832910 219
MACRUM 0:ade9be832910 220 pressf = (float)press;
MACRUM 0:ade9be832910 221 return (pressf/100.0f);
MACRUM 0:ade9be832910 222 }
MACRUM 0:ade9be832910 223
MACRUM 0:ade9be832910 224 float BME280::getHumidity()
MACRUM 0:ade9be832910 225 {
MACRUM 0:ade9be832910 226 uint32_t hum_raw;
MACRUM 0:ade9be832910 227 float humf;
MACRUM 0:ade9be832910 228 char cmd[4];
MACRUM 0:ade9be832910 229
kenjiArai 6:f94ffb546799 230 if(check_chip() == false){
kenjiArai 6:f94ffb546799 231 return 0.0f;
kenjiArai 6:f94ffb546799 232 }
kenjiArai 6:f94ffb546799 233
MACRUM 0:ade9be832910 234 cmd[0] = 0xfd; // hum_msb
MACRUM 0:ade9be832910 235 i2c.write(address, cmd, 1);
takafuminaka 3:d4eb81284ea0 236 i2c.read(address, &cmd[1], 2);
MACRUM 0:ade9be832910 237
MACRUM 0:ade9be832910 238 hum_raw = (cmd[1] << 8) | cmd[2];
MACRUM 0:ade9be832910 239
MACRUM 0:ade9be832910 240 int32_t v_x1;
MACRUM 0:ade9be832910 241
MACRUM 0:ade9be832910 242 v_x1 = t_fine - 76800;
kenjiArai 6:f94ffb546799 243 v_x1 = (((((hum_raw << 14) -(((int32_t)dig_H4) << 20)
kenjiArai 6:f94ffb546799 244 - (((int32_t)dig_H5) * v_x1)) + ((int32_t)16384)) >> 15)
kenjiArai 6:f94ffb546799 245 * (((((((v_x1 * (int32_t)dig_H6) >> 10)
kenjiArai 6:f94ffb546799 246 * (((v_x1 * ((int32_t)dig_H3)) >> 11) + 32768)) >> 10) + 2097152)
kenjiArai 6:f94ffb546799 247 * (int32_t)dig_H2 + 8192) >> 14));
kenjiArai 6:f94ffb546799 248 v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7)
kenjiArai 6:f94ffb546799 249 * (int32_t)dig_H1) >> 4));
MACRUM 0:ade9be832910 250 v_x1 = (v_x1 < 0 ? 0 : v_x1);
MACRUM 0:ade9be832910 251 v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1);
MACRUM 0:ade9be832910 252
MACRUM 0:ade9be832910 253 humf = (float)(v_x1 >> 12);
MACRUM 0:ade9be832910 254
MACRUM 0:ade9be832910 255 return (humf/1024.0f);
MACRUM 0:ade9be832910 256 }
kenjiArai 6:f94ffb546799 257
kenjiArai 6:f94ffb546799 258 //------------------------------------------------------------------------------
kenjiArai 6:f94ffb546799 259 // Added functions by JH1PJL
kenjiArai 6:f94ffb546799 260 //------------------------------------------------------------------------------
kenjiArai 6:f94ffb546799 261 // Read chip ID
kenjiArai 6:f94ffb546799 262 uint8_t BME280::getID(void)
kenjiArai 6:f94ffb546799 263 {
kenjiArai 6:f94ffb546799 264 char cmd[4];
kenjiArai 6:f94ffb546799 265
kenjiArai 6:f94ffb546799 266 cmd[0] = 0xd0; // ID addr
kenjiArai 6:f94ffb546799 267 i2c.write(address, cmd, 1, true);
kenjiArai 6:f94ffb546799 268 i2c.read(address, cmd, 2, false);
kenjiArai 6:f94ffb546799 269 return cmd[0];
kenjiArai 6:f94ffb546799 270 }
kenjiArai 6:f94ffb546799 271
kenjiArai 6:f94ffb546799 272 bool BME280::check_chip(void)
kenjiArai 6:f94ffb546799 273 {
kenjiArai 6:f94ffb546799 274 uint8_t id;
kenjiArai 6:f94ffb546799 275
kenjiArai 6:f94ffb546799 276 id = getID();
kenjiArai 6:f94ffb546799 277 if (id != 0x60){
kenjiArai 6:f94ffb546799 278 if (address == DEFAULT_SLAVE_ADDRESS){
kenjiArai 6:f94ffb546799 279 address = DEFAULT_SLAVE_ADDRESS;
kenjiArai 6:f94ffb546799 280 } else if (address == ANOTHER_SLAVE_ADDRESS){
kenjiArai 6:f94ffb546799 281 address = DEFAULT_SLAVE_ADDRESS;
kenjiArai 6:f94ffb546799 282 }
kenjiArai 6:f94ffb546799 283 id = getID();
kenjiArai 6:f94ffb546799 284 if (id != 0x60){
kenjiArai 6:f94ffb546799 285 return resetChip_by_sw();
kenjiArai 6:f94ffb546799 286 }
kenjiArai 6:f94ffb546799 287 }
kenjiArai 6:f94ffb546799 288 return true;
kenjiArai 6:f94ffb546799 289 }
kenjiArai 6:f94ffb546799 290
kenjiArai 6:f94ffb546799 291 // Reset the chip by software
kenjiArai 6:f94ffb546799 292 bool BME280::resetChip_by_sw(void)
kenjiArai 6:f94ffb546799 293 {
kenjiArai 6:f94ffb546799 294 uint8_t id;
kenjiArai 6:f94ffb546799 295 char cmd[4];
kenjiArai 6:f94ffb546799 296
kenjiArai 6:f94ffb546799 297 if (address == DEFAULT_SLAVE_ADDRESS){
kenjiArai 6:f94ffb546799 298 ;
kenjiArai 6:f94ffb546799 299 } else if (address == ANOTHER_SLAVE_ADDRESS){
kenjiArai 6:f94ffb546799 300 ;
kenjiArai 6:f94ffb546799 301 } else {
kenjiArai 6:f94ffb546799 302 address = DEFAULT_SLAVE_ADDRESS;
kenjiArai 6:f94ffb546799 303 }
kenjiArai 6:f94ffb546799 304 // 1st try
kenjiArai 6:f94ffb546799 305 cmd[0] = 0xe0; // reset addr
kenjiArai 6:f94ffb546799 306 cmd[1] = 0xb6; // reset command
kenjiArai 6:f94ffb546799 307 i2c.write(address, cmd, 2);
kenjiArai 6:f94ffb546799 308 wait_ms(2);
kenjiArai 6:f94ffb546799 309 id = getID();
kenjiArai 6:f94ffb546799 310 if (id == 0x60){
kenjiArai 6:f94ffb546799 311 initialize();
kenjiArai 6:f94ffb546799 312 return true;
kenjiArai 6:f94ffb546799 313 }
kenjiArai 6:f94ffb546799 314 // 2nd retry (reset again and read again)
kenjiArai 6:f94ffb546799 315 cmd[0] = 0xe0; // reset addr
kenjiArai 6:f94ffb546799 316 cmd[1] = 0xb6; // reset command
kenjiArai 6:f94ffb546799 317 i2c.write(address, cmd, 2);
kenjiArai 6:f94ffb546799 318 wait_ms(2);
kenjiArai 6:f94ffb546799 319 id = getID();
kenjiArai 6:f94ffb546799 320 if (id == 0x60){
kenjiArai 6:f94ffb546799 321 initialize();
kenjiArai 6:f94ffb546799 322 return true;
kenjiArai 6:f94ffb546799 323 }
kenjiArai 6:f94ffb546799 324 // 3rd retry (reaset again and another chip addr)
kenjiArai 6:f94ffb546799 325 if (address == DEFAULT_SLAVE_ADDRESS){
kenjiArai 6:f94ffb546799 326 address = DEFAULT_SLAVE_ADDRESS;
kenjiArai 6:f94ffb546799 327 } else if (address == ANOTHER_SLAVE_ADDRESS){
kenjiArai 6:f94ffb546799 328 address = DEFAULT_SLAVE_ADDRESS;
kenjiArai 6:f94ffb546799 329 } else {
kenjiArai 6:f94ffb546799 330 return false;
kenjiArai 6:f94ffb546799 331 }
kenjiArai 6:f94ffb546799 332 cmd[0] = 0xe0; // reset addr
kenjiArai 6:f94ffb546799 333 cmd[1] = 0xb6; // reset command
kenjiArai 6:f94ffb546799 334 i2c.write(address, cmd, 2);
kenjiArai 6:f94ffb546799 335 wait_ms(2);
kenjiArai 6:f94ffb546799 336 id = getID();
kenjiArai 6:f94ffb546799 337 if (id == 0x60){
kenjiArai 6:f94ffb546799 338 initialize();
kenjiArai 6:f94ffb546799 339 return true;
kenjiArai 6:f94ffb546799 340 }
kenjiArai 6:f94ffb546799 341 return false;
kenjiArai 6:f94ffb546799 342 }
kenjiArai 6:f94ffb546799 343
kenjiArai 6:f94ffb546799 344 // Get compensated data
kenjiArai 6:f94ffb546799 345 void BME280::getAll_compensated_data(BME280_Data_TypeDef *dt) {
kenjiArai 6:f94ffb546799 346 uint32_t raw_data;
kenjiArai 6:f94ffb546799 347 char cmd[8];
kenjiArai 6:f94ffb546799 348
kenjiArai 6:f94ffb546799 349 // Temperatue
kenjiArai 6:f94ffb546799 350 cmd[0] = 0xfa; // temp_msb
kenjiArai 6:f94ffb546799 351 i2c.write(address, cmd, 1);
kenjiArai 6:f94ffb546799 352 i2c.read(address, &cmd[1], 3);
kenjiArai 6:f94ffb546799 353 raw_data = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4);
kenjiArai 6:f94ffb546799 354 double var1, var2;
kenjiArai 6:f94ffb546799 355 var1 = ((( double)raw_data) / 16384.0 - ((double)dig_T1) / 1024.0) *
kenjiArai 6:f94ffb546799 356 ((double)dig_T2);
kenjiArai 6:f94ffb546799 357 var2 = ((((double)raw_data) / 131072.0 - ((double)dig_T1) / 8192.0) *
kenjiArai 6:f94ffb546799 358 (((double)raw_data) / 131072.0 - ((double)dig_T1) / 8192.0))
kenjiArai 6:f94ffb546799 359 * ((double)dig_T3);
kenjiArai 6:f94ffb546799 360 int32_t t_fine = (int32_t)(var1 + var2);
kenjiArai 6:f94ffb546799 361 dt->temperatue = (var1 + var2) / 5120.0;
kenjiArai 6:f94ffb546799 362 // Pressue
kenjiArai 6:f94ffb546799 363 cmd[0] = 0xf7; // press_msb
kenjiArai 6:f94ffb546799 364 i2c.write(address, cmd, 1);
kenjiArai 6:f94ffb546799 365 i2c.read(address, &cmd[1], 3);
kenjiArai 6:f94ffb546799 366 raw_data = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4);
kenjiArai 6:f94ffb546799 367 double p;
kenjiArai 6:f94ffb546799 368 var1 = ((double)t_fine / 2.0) - 64000.0;
kenjiArai 6:f94ffb546799 369 var2 = var1 * var1 * ((double)dig_P6) / 32768.0;
kenjiArai 6:f94ffb546799 370 var2 = var2 + var1 * ((double)dig_P5) * 2.0;
kenjiArai 6:f94ffb546799 371 var2 = (var2 / 4.0)+(((double)dig_P4) * 65536.0);
kenjiArai 6:f94ffb546799 372 var1 = (((double)dig_P3) * var1 * var1 / 524288.0 +
kenjiArai 6:f94ffb546799 373 ((double)dig_P2) * var1) / 524288.0;
kenjiArai 6:f94ffb546799 374 var1 = (1.0 + var1 / 32768.0)*((double)dig_P1);
kenjiArai 6:f94ffb546799 375 if (var1 == 0.0) {
kenjiArai 6:f94ffb546799 376 dt->pressue = 0.0;
kenjiArai 6:f94ffb546799 377 return; //avoid exception caused by division by zero
kenjiArai 6:f94ffb546799 378 }
kenjiArai 6:f94ffb546799 379 p = 1048576.0 - (double)raw_data;
kenjiArai 6:f94ffb546799 380 p = (p - (var2 / 4096.0)) * 6250.0 / var1;
kenjiArai 6:f94ffb546799 381 var1 = ((double)dig_P9) * p * p / 2147483648.0;
kenjiArai 6:f94ffb546799 382 var2 = p * ((double)dig_P8) / 32768.0;
kenjiArai 6:f94ffb546799 383 p = p + (var1 + var2 + ((double)dig_P7)) / 16.0;
kenjiArai 6:f94ffb546799 384 dt->pressue = p / 100.0;
kenjiArai 6:f94ffb546799 385 // Humidity
kenjiArai 6:f94ffb546799 386 cmd[0] = 0xfd; // hum_msb
kenjiArai 6:f94ffb546799 387 i2c.write(address, cmd, 1);
kenjiArai 6:f94ffb546799 388 i2c.read(address, &cmd[1], 2);
kenjiArai 6:f94ffb546799 389 raw_data = (cmd[1] << 8) | cmd[2];
kenjiArai 6:f94ffb546799 390 double var_H;
kenjiArai 6:f94ffb546799 391 var_H = (((double)t_fine) - 76800.0);
kenjiArai 6:f94ffb546799 392 var_H = (raw_data - (((double)dig_H4) * 64.0 +
kenjiArai 6:f94ffb546799 393 ((double)dig_H5) / 16384.0 * var_H)) *
kenjiArai 6:f94ffb546799 394 (((double)dig_H2) / 65536.0 * (1.0 +
kenjiArai 6:f94ffb546799 395 ((double)dig_H6) / 67108864.0 * var_H *
kenjiArai 6:f94ffb546799 396 (1.0 + ((double)dig_H3) / 67108864.0 * var_H)));
kenjiArai 6:f94ffb546799 397 var_H = var_H * (1.0 - ((double)dig_H1) * var_H / 524288.0);
kenjiArai 6:f94ffb546799 398 if (var_H > 100.0) {
kenjiArai 6:f94ffb546799 399 var_H = 100.0;
kenjiArai 6:f94ffb546799 400 } else if (var_H < 0.0) {
kenjiArai 6:f94ffb546799 401 var_H = 0.0;
kenjiArai 6:f94ffb546799 402 }
kenjiArai 6:f94ffb546799 403 dt->humidity = var_H;
kenjiArai 6:f94ffb546799 404 }
kenjiArai 6:f94ffb546799 405
kenjiArai 6:f94ffb546799 406 #if 0
kenjiArai 6:f94ffb546799 407 double calcAltitude(float pressure,float temperature)
kenjiArai 6:f94ffb546799 408 {
kenjiArai 6:f94ffb546799 409 // Equation taken from BMP180 datasheet (page 16):
kenjiArai 6:f94ffb546799 410 // http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf
kenjiArai 6:f94ffb546799 411
kenjiArai 6:f94ffb546799 412
kenjiArai 6:f94ffb546799 413 // Note that using the equation from wikipedia can give bad results
kenjiArai 6:f94ffb546799 414 // at high altitude. See this thread for more information:
kenjiArai 6:f94ffb546799 415 // http://forums.adafruit.com/viewtopic.php?f=22&t=58064
kenjiArai 6:f94ffb546799 416 /*
kenjiArai 6:f94ffb546799 417 double altitude = (temperature + 273.15)
kenjiArai 6:f94ffb546799 418 * (pow(MEAN_SEA_LEVEL_PRESSURE/pressure, 0.190294957)-1.0) / 0.0065;
kenjiArai 6:f94ffb546799 419 */
kenjiArai 6:f94ffb546799 420 double altitude =
kenjiArai 6:f94ffb546799 421 44330.0 * (1.0 - pow(pressure / MEAN_SEA_LEVEL_PRESSURE, 0.190294957));
kenjiArai 6:f94ffb546799 422 return altitude;
kenjiArai 6:f94ffb546799 423 }
kenjiArai 6:f94ffb546799 424 #endif