OS6. i2s BME280 library, also works with BMP280 without Humidity. See BME280.h for example code.

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BME280.cpp Source File

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 }