OS6. i2s BME280 library, also works with BMP280 without Humidity. See BME280.h for example code.
Embed:
(wiki syntax)
Show/hide line numbers
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