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.
BME280.cpp
00001 #include "BME280.h" 00002 00003 BME280::BME280(I2C& bme280_i2c, uint8_t bme280_addr): 00004 _i2c(bme280_i2c), _addr(bme280_addr<<1) 00005 { 00006 _init=false; 00007 } 00008 00009 bool BME280::init(void) 00010 { 00011 char cmd[18]; 00012 00013 cmd[0] = BME280_CTRL_HUM; 00014 cmd[1] = BME280_SAMPLING_X1; 00015 if(_i2c.write(_addr, cmd, 2)!=0) 00016 return false; 00017 00018 cmd[0] = BME280_CTRL_MEAS; // ctrl_meas 00019 cmd[1] = 0x27; // Temparature oversampling x1, Pressure oversampling x1, Normal mode 00020 _i2c.write(_addr, cmd, 2); 00021 00022 cmd[0] = 0xf5; // config 00023 cmd[1] = 0xa0; // Standby 1000ms, Filter off 00024 _i2c.write(_addr, cmd, 2); 00025 00026 cmd[0] = 0x88; // read dig_T regs 00027 _i2c.write(_addr, cmd, 1); 00028 _i2c.read(_addr, cmd, 6); 00029 00030 dig_T1 = (cmd[1] << 8) | cmd[0]; 00031 dig_T2 = (cmd[3] << 8) | cmd[2]; 00032 dig_T3 = (cmd[5] << 8) | cmd[4]; 00033 00034 cmd[0] = 0x8E; // read dig_P regs 00035 _i2c.write(_addr, cmd, 1); 00036 _i2c.read(_addr, cmd, 18); 00037 00038 dig_P1 = (cmd[ 1] << 8) | cmd[ 0]; 00039 dig_P2 = (cmd[ 3] << 8) | cmd[ 2]; 00040 dig_P3 = (cmd[ 5] << 8) | cmd[ 4]; 00041 dig_P4 = (cmd[ 7] << 8) | cmd[ 6]; 00042 dig_P5 = (cmd[ 9] << 8) | cmd[ 8]; 00043 dig_P6 = (cmd[11] << 8) | cmd[10]; 00044 dig_P7 = (cmd[13] << 8) | cmd[12]; 00045 dig_P8 = (cmd[15] << 8) | cmd[14]; 00046 dig_P9 = (cmd[17] << 8) | cmd[16]; 00047 00048 cmd[0] = 0xA1; // read dig_H regs 00049 _i2c.write(_addr, cmd, 1); 00050 _i2c.read(_addr, cmd, 1); 00051 cmd[1] = 0xE1; // read dig_H regs 00052 _i2c.write(_addr, &cmd[1], 1); 00053 _i2c.read(_addr, &cmd[1], 7); 00054 00055 dig_H1 = cmd[0]; 00056 dig_H2 = (cmd[2] << 8) | cmd[1]; 00057 dig_H3 = cmd[3]; 00058 dig_H4 = (cmd[4] << 4) | (cmd[5] & 0x0f); 00059 dig_H5 = (cmd[6] << 4) | ((cmd[5]>>4) & 0x0f); 00060 dig_H6 = cmd[7]; 00061 return true; 00062 } 00063 00064 float BME280::getTemperature(void) 00065 { 00066 uint32_t temp_raw; 00067 float tempf; 00068 char cmd[4]; 00069 00070 cmd[0] = 0xfa; // temp_msb 00071 _i2c.write(_addr, cmd, 1); 00072 _i2c.read(_addr, &cmd[1], 3); 00073 00074 temp_raw = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4); 00075 00076 int32_t temp; 00077 00078 temp = 00079 (((((temp_raw >> 3) - (dig_T1 << 1))) * dig_T2) >> 11) + 00080 ((((((temp_raw >> 4) - dig_T1) * ((temp_raw >> 4) - dig_T1)) >> 12) * dig_T3) >> 14); 00081 00082 t_fine = temp; 00083 temp = (temp * 5 + 128) >> 8; 00084 tempf = (float)temp; 00085 00086 return (tempf/100.0f); 00087 } 00088 00089 float BME280::getPressure(void) 00090 { 00091 uint32_t press_raw; 00092 float pressf; 00093 char cmd[4]; 00094 00095 cmd[0] = 0xf7; // press_msb 00096 _i2c.write(_addr, cmd, 1); 00097 _i2c.read(_addr, &cmd[1], 3); 00098 00099 press_raw = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4); 00100 00101 int32_t var1, var2; 00102 uint32_t press; 00103 00104 var1 = (t_fine >> 1) - 64000; 00105 var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * dig_P6; 00106 var2 = var2 + ((var1 * dig_P5) << 1); 00107 var2 = (var2 >> 2) + (dig_P4 << 16); 00108 var1 = (((dig_P3 * (((var1 >> 2)*(var1 >> 2)) >> 13)) >> 3) + ((dig_P2 * var1) >> 1)) >> 18; 00109 var1 = ((32768 + var1) * dig_P1) >> 15; 00110 if (var1 == 0) { 00111 return 0; 00112 } 00113 press = (((1048576 - press_raw) - (var2 >> 12))) * 3125; 00114 if(press < 0x80000000) { 00115 press = (press << 1) / var1; 00116 } else { 00117 press = (press / var1) * 2; 00118 } 00119 var1 = ((int32_t)dig_P9 * ((int32_t)(((press >> 3) * (press >> 3)) >> 13))) >> 12; 00120 var2 = (((int32_t)(press >> 2)) * (int32_t)dig_P8) >> 13; 00121 press = (press + ((var1 + var2 + dig_P7) >> 4)); 00122 00123 pressf = (float)press; 00124 return (pressf/100.0f); 00125 } 00126 00127 float BME280::getHumidity(void) 00128 { 00129 uint32_t hum_raw; 00130 float humf; 00131 char cmd[4]; 00132 00133 cmd[0] = 0xfd; // hum_msb 00134 _i2c.write(_addr, cmd, 1); 00135 _i2c.read(_addr, &cmd[1], 2); 00136 00137 hum_raw = (cmd[1] << 8) | cmd[2]; 00138 00139 int32_t v_x1; 00140 00141 v_x1 = t_fine - 76800; 00142 v_x1 = (((((hum_raw << 14) -(((int32_t)dig_H4) << 20) - (((int32_t)dig_H5) * v_x1)) + 00143 ((int32_t)16384)) >> 15) * (((((((v_x1 * (int32_t)dig_H6) >> 10) * 00144 (((v_x1 * ((int32_t)dig_H3)) >> 11) + 32768)) >> 10) + 2097152) * 00145 (int32_t)dig_H2 + 8192) >> 14)); 00146 v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * (int32_t)dig_H1) >> 4)); 00147 v_x1 = (v_x1 < 0 ? 0 : v_x1); 00148 v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1); 00149 00150 humf = (float)(v_x1 >> 12); 00151 00152 return (humf/1024.0f); 00153 }
Generated on Sun Jul 17 2022 18:52:39 by
1.7.2