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 BME::BME(PinName sda, PinName scl, char slave_adr) : bme(sda, scl) 00004 { 00005 address=slave_adr; 00006 bme.frequency(100000); 00007 } 00008 00009 void BME::initialize() 00010 { 00011 char cmd[18]; 00012 wait_us(5000); 00013 00014 if(_debug)printf("\033[0m\033[2J\033[H ++++ BME-P register's ++++\r\n\n"); 00015 00016 cmd[0] = 0xF2; // ctrl_hum 00017 cmd[1] = 0x01; // Humidity oversampling x1 00018 bme.write(address, cmd, 2); 00019 00020 cmd[0] = 0xF4; // ctrl_meas 00021 cmd[1] = 0x27; // Temparature oversampling x1, Pressure oversampling x1, Normal mode 00022 bme.write(address, cmd, 2); 00023 00024 cmd[0] = 0xF5; // config 00025 cmd[1] = 0xa0; // Standby 1000ms, Filter off 00026 bme.write(address, cmd, 2); 00027 00028 // sensor registers 00029 if(_debug)printf("chip_id = 0x%x\n\n", chip_id); 00030 00031 cmd[0] = 0x88; // read dig_T calibration regs 00032 bme.write(address, cmd, 1); 00033 bme.read(address, cmd, 6); 00034 dig_T1 = (cmd[1] << 8) | cmd[0]; 00035 dig_T2 = (cmd[3] << 8) | cmd[2]; 00036 dig_T3 = (cmd[5] << 8) | cmd[4]; 00037 if(_debug)printf("Temp Cal reg's:\nT1 = 0x%x\nT2 = 0x%x\nT3 = 0x%x\n\n", dig_T1, dig_T2, dig_T3); 00038 00039 cmd[0] = 0x8E; // read dig_P calibration regs 00040 bme.write(address, cmd, 1); 00041 bme.read(address, cmd, 18); 00042 dig_P1 = (cmd[ 1] << 8) | cmd[ 0]; 00043 dig_P2 = (cmd[ 3] << 8) | cmd[ 2]; 00044 dig_P3 = (cmd[ 5] << 8) | cmd[ 4]; 00045 dig_P4 = (cmd[ 7] << 8) | cmd[ 6]; 00046 dig_P5 = (cmd[ 9] << 8) | cmd[ 8]; 00047 dig_P6 = (cmd[11] << 8) | cmd[10]; 00048 dig_P7 = (cmd[13] << 8) | cmd[12]; 00049 dig_P8 = (cmd[15] << 8) | cmd[14]; 00050 dig_P9 = (cmd[17] << 8) | cmd[16]; 00051 if(_debug)printf("Pressure Cal reg's:\nP1 = 0x%x\nP2 = 0x%x\nP3 = 0x%x\nP4 = 0x%x\n", dig_P1, dig_P2, dig_P3, dig_P4); 00052 if(_debug)printf("P5 = 0x%x\nP6 = 0x%x\nP7 = 0x%x\nP8 = 0x%x\nP9 = 0x%x\n\n", dig_P5, dig_P6, dig_P7, dig_P8, dig_P9); 00053 00054 if(chip_id == 0x60){ // Only BME280 has Humidity 00055 cmd[0] = 0xA1; // read dig_H calibration LSB regs 00056 bme.write(address, cmd, 1); 00057 bme.read(address, cmd, 1); 00058 cmd[1] = 0xE1; // read dig_H calibration MSB regs 00059 bme.write(address, &cmd[1], 1); 00060 bme.read(address, &cmd[1], 7); 00061 dig_H1 = cmd[0]; 00062 dig_H2 = (cmd[2] << 8) | cmd[1]; 00063 dig_H3 = cmd[3]; 00064 dig_H4 = (cmd[4] << 4) | (cmd[5] & 0x0f); 00065 dig_H5 = (cmd[6] << 4) | ((cmd[5]>>4) & 0x0f); 00066 dig_H6 = cmd[7]; 00067 if(_debug)printf("Humidity Cal reg's:\nH1 = 0x%x\nH2 = 0x%x\nH3 = 0x%x\n", dig_H1, dig_H2, dig_H3); 00068 if(_debug)printf("H4 = 0x%x\nH5 = 0x%x\nH6 = 0x%x\n", dig_H4, dig_H5, dig_H6); 00069 } 00070 } 00071 00072 int BME::init() 00073 { 00074 char cmd[2]; 00075 cmd[0] = 0xE0; // reset reg 00076 cmd[1] = 0xB6; 00077 bme.write(address, cmd, 2); 00078 if(chipID()){ 00079 initialize(); 00080 return chip_id; 00081 } 00082 else return 0; 00083 } 00084 00085 int BME::chipID() 00086 { 00087 char cmd[1]; 00088 cmd[0] = 0xD0; // chip_id 00089 bme.write(address, cmd, 1); 00090 cmd[0] = 0x00; 00091 bme.read(address, cmd, 1); 00092 chip_id = cmd[0]; 00093 return chip_id; 00094 } 00095 00096 float BME::getTemperature() 00097 { 00098 if(!chipID()){init();} // check if live sensor 00099 00100 int32_t var1, var2, T, adc_T; 00101 float temp; 00102 char cmd[4]; 00103 cmd[0] = 0xFA; // temp_msb 00104 bme.write(address, cmd, 1); 00105 bme.read(address, &cmd[1], 3); 00106 00107 adc_T = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4); 00108 00109 var1 = ((((adc_T>>3) - ((int32_t)dig_T1 <<1))) * 00110 ((int32_t)dig_T2)) >> 11; 00111 var2 = (((((adc_T>>4) - ((int32_t)dig_T1)) * 00112 ((adc_T>>4) - ((int32_t)dig_T1))) >> 12) * 00113 ((int32_t)dig_T3)) >> 14; 00114 t_fine = var1 + var2; 00115 T = (t_fine * 5 + 128) >> 8; 00116 temp = T/100.0; 00117 if(temp>-41 && temp<86){ // return temperature if within device limits. 00118 return temp; 00119 } 00120 else return 99.99; // error value 00121 } 00122 00123 float BME::getPressure() 00124 { 00125 if(!chipID()){init();} // check if live sensor 00126 00127 uint32_t adc_P; 00128 int64_t var1, var2, p; 00129 float press; 00130 char cmd[4]; 00131 cmd[0] = 0xF7; // press_msb 00132 bme.write(address, cmd, 1); 00133 bme.read(address, &cmd[1], 3); 00134 00135 adc_P = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4); 00136 00137 var1 = ((int64_t)t_fine) - 128000; 00138 var2 = var1 * var1 * (int64_t)dig_P6; 00139 var2 = var2 + ((var1 * (int64_t)dig_P5) << 17); 00140 var2 = var2 + (((int64_t)dig_P4) << 35); 00141 var1 = ((var1 * var1 * (int64_t)dig_P3)>>8)+((var1 * (int64_t)dig_P2)<<12); 00142 var1 = (((((int64_t)1)<<47)+var1)) * ((int64_t)dig_P1)>>33; 00143 if (var1 == 0) {return 0;} 00144 p = 1048576-adc_P; 00145 p = (((p<<31)-var2)*3125)/var1; 00146 var1 = (((int64_t)dig_P9) * (p>>13) * (p>>13))>>25; 00147 var2 = (((int64_t)dig_P8) * p)>>19; 00148 p = ((p + var1 + var2)>>8) + (((int64_t)dig_P7)<<4); 00149 press = ((float)p/256)/100.0f; 00150 if(press>300 && press<1100){ // return temperature if within device limits. 00151 return press; 00152 } 00153 else return 9999; // error value 00154 } 00155 00156 float BME::getHumidity() 00157 { 00158 if(!chipID()){init();} // check if live sensor 00159 00160 uint32_t humid_raw; 00161 int32_t v_x1r; 00162 float humid; 00163 char cmd[4]; 00164 cmd[0] = 0xfd; // hum_msb 00165 bme.write(address, cmd, 1); 00166 bme.read(address, &cmd[1], 2); 00167 00168 humid_raw = (cmd[1] << 8) | cmd[2]; 00169 00170 v_x1r = (t_fine - 76800); 00171 v_x1r = (((((humid_raw << 14) -(((int32_t)dig_H4) << 20) - (((int32_t)dig_H5) * 00172 v_x1r)) + ((int32_t)16384)) >> 15) * (((((((v_x1r * 00173 (int32_t)dig_H6) >> 10) * (((v_x1r * ((int32_t)dig_H3)) >> 11) + 00174 32768)) >> 10) + 2097152) * (int32_t)dig_H2 + 8192) >> 14)); 00175 v_x1r = (v_x1r - (((((v_x1r >> 15) * (v_x1r >> 15)) >> 7) * 00176 (int32_t)dig_H1) >> 4)); 00177 v_x1r = (v_x1r < 0 ? 0 : v_x1r); 00178 v_x1r = (v_x1r > 419430400 ? 419430400 : v_x1r); 00179 00180 humid = ((float)(v_x1r >> 12))/1024.0f; 00181 00182 return humid; 00183 }
Generated on Tue Jul 12 2022 17:41:07 by
1.7.2