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

Committer:
star297
Date:
Sat Jan 02 10:32:48 2021 +0000
Revision:
0:19fab6c64964
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
star297 0:19fab6c64964 1 #include "BME280.h"
star297 0:19fab6c64964 2
star297 0:19fab6c64964 3 BME::BME(PinName sda, PinName scl, char slave_adr) : bme(sda, scl)
star297 0:19fab6c64964 4 {
star297 0:19fab6c64964 5 address=slave_adr;
star297 0:19fab6c64964 6 bme.frequency(100000);
star297 0:19fab6c64964 7 }
star297 0:19fab6c64964 8
star297 0:19fab6c64964 9 void BME::initialize()
star297 0:19fab6c64964 10 {
star297 0:19fab6c64964 11 char cmd[18];
star297 0:19fab6c64964 12 wait_us(5000);
star297 0:19fab6c64964 13
star297 0:19fab6c64964 14 if(_debug)printf("\033[0m\033[2J\033[H ++++ BME-P register's ++++\r\n\n");
star297 0:19fab6c64964 15
star297 0:19fab6c64964 16 cmd[0] = 0xF2; // ctrl_hum
star297 0:19fab6c64964 17 cmd[1] = 0x01; // Humidity oversampling x1
star297 0:19fab6c64964 18 bme.write(address, cmd, 2);
star297 0:19fab6c64964 19
star297 0:19fab6c64964 20 cmd[0] = 0xF4; // ctrl_meas
star297 0:19fab6c64964 21 cmd[1] = 0x27; // Temparature oversampling x1, Pressure oversampling x1, Normal mode
star297 0:19fab6c64964 22 bme.write(address, cmd, 2);
star297 0:19fab6c64964 23
star297 0:19fab6c64964 24 cmd[0] = 0xF5; // config
star297 0:19fab6c64964 25 cmd[1] = 0xa0; // Standby 1000ms, Filter off
star297 0:19fab6c64964 26 bme.write(address, cmd, 2);
star297 0:19fab6c64964 27
star297 0:19fab6c64964 28 // sensor registers
star297 0:19fab6c64964 29 if(_debug)printf("chip_id = 0x%x\n\n", chip_id);
star297 0:19fab6c64964 30
star297 0:19fab6c64964 31 cmd[0] = 0x88; // read dig_T calibration regs
star297 0:19fab6c64964 32 bme.write(address, cmd, 1);
star297 0:19fab6c64964 33 bme.read(address, cmd, 6);
star297 0:19fab6c64964 34 dig_T1 = (cmd[1] << 8) | cmd[0];
star297 0:19fab6c64964 35 dig_T2 = (cmd[3] << 8) | cmd[2];
star297 0:19fab6c64964 36 dig_T3 = (cmd[5] << 8) | cmd[4];
star297 0:19fab6c64964 37 if(_debug)printf("Temp Cal reg's:\nT1 = 0x%x\nT2 = 0x%x\nT3 = 0x%x\n\n", dig_T1, dig_T2, dig_T3);
star297 0:19fab6c64964 38
star297 0:19fab6c64964 39 cmd[0] = 0x8E; // read dig_P calibration regs
star297 0:19fab6c64964 40 bme.write(address, cmd, 1);
star297 0:19fab6c64964 41 bme.read(address, cmd, 18);
star297 0:19fab6c64964 42 dig_P1 = (cmd[ 1] << 8) | cmd[ 0];
star297 0:19fab6c64964 43 dig_P2 = (cmd[ 3] << 8) | cmd[ 2];
star297 0:19fab6c64964 44 dig_P3 = (cmd[ 5] << 8) | cmd[ 4];
star297 0:19fab6c64964 45 dig_P4 = (cmd[ 7] << 8) | cmd[ 6];
star297 0:19fab6c64964 46 dig_P5 = (cmd[ 9] << 8) | cmd[ 8];
star297 0:19fab6c64964 47 dig_P6 = (cmd[11] << 8) | cmd[10];
star297 0:19fab6c64964 48 dig_P7 = (cmd[13] << 8) | cmd[12];
star297 0:19fab6c64964 49 dig_P8 = (cmd[15] << 8) | cmd[14];
star297 0:19fab6c64964 50 dig_P9 = (cmd[17] << 8) | cmd[16];
star297 0:19fab6c64964 51 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);
star297 0:19fab6c64964 52 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);
star297 0:19fab6c64964 53
star297 0:19fab6c64964 54 if(chip_id == 0x60){ // Only BME280 has Humidity
star297 0:19fab6c64964 55 cmd[0] = 0xA1; // read dig_H calibration LSB regs
star297 0:19fab6c64964 56 bme.write(address, cmd, 1);
star297 0:19fab6c64964 57 bme.read(address, cmd, 1);
star297 0:19fab6c64964 58 cmd[1] = 0xE1; // read dig_H calibration MSB regs
star297 0:19fab6c64964 59 bme.write(address, &cmd[1], 1);
star297 0:19fab6c64964 60 bme.read(address, &cmd[1], 7);
star297 0:19fab6c64964 61 dig_H1 = cmd[0];
star297 0:19fab6c64964 62 dig_H2 = (cmd[2] << 8) | cmd[1];
star297 0:19fab6c64964 63 dig_H3 = cmd[3];
star297 0:19fab6c64964 64 dig_H4 = (cmd[4] << 4) | (cmd[5] & 0x0f);
star297 0:19fab6c64964 65 dig_H5 = (cmd[6] << 4) | ((cmd[5]>>4) & 0x0f);
star297 0:19fab6c64964 66 dig_H6 = cmd[7];
star297 0:19fab6c64964 67 if(_debug)printf("Humidity Cal reg's:\nH1 = 0x%x\nH2 = 0x%x\nH3 = 0x%x\n", dig_H1, dig_H2, dig_H3);
star297 0:19fab6c64964 68 if(_debug)printf("H4 = 0x%x\nH5 = 0x%x\nH6 = 0x%x\n", dig_H4, dig_H5, dig_H6);
star297 0:19fab6c64964 69 }
star297 0:19fab6c64964 70 }
star297 0:19fab6c64964 71
star297 0:19fab6c64964 72 int BME::init()
star297 0:19fab6c64964 73 {
star297 0:19fab6c64964 74 char cmd[2];
star297 0:19fab6c64964 75 cmd[0] = 0xE0; // reset reg
star297 0:19fab6c64964 76 cmd[1] = 0xB6;
star297 0:19fab6c64964 77 bme.write(address, cmd, 2);
star297 0:19fab6c64964 78 if(chipID()){
star297 0:19fab6c64964 79 initialize();
star297 0:19fab6c64964 80 return chip_id;
star297 0:19fab6c64964 81 }
star297 0:19fab6c64964 82 else return 0;
star297 0:19fab6c64964 83 }
star297 0:19fab6c64964 84
star297 0:19fab6c64964 85 int BME::chipID()
star297 0:19fab6c64964 86 {
star297 0:19fab6c64964 87 char cmd[1];
star297 0:19fab6c64964 88 cmd[0] = 0xD0; // chip_id
star297 0:19fab6c64964 89 bme.write(address, cmd, 1);
star297 0:19fab6c64964 90 cmd[0] = 0x00;
star297 0:19fab6c64964 91 bme.read(address, cmd, 1);
star297 0:19fab6c64964 92 chip_id = cmd[0];
star297 0:19fab6c64964 93 return chip_id;
star297 0:19fab6c64964 94 }
star297 0:19fab6c64964 95
star297 0:19fab6c64964 96 float BME::getTemperature()
star297 0:19fab6c64964 97 {
star297 0:19fab6c64964 98 if(!chipID()){init();} // check if live sensor
star297 0:19fab6c64964 99
star297 0:19fab6c64964 100 int32_t var1, var2, T, adc_T;
star297 0:19fab6c64964 101 float temp;
star297 0:19fab6c64964 102 char cmd[4];
star297 0:19fab6c64964 103 cmd[0] = 0xFA; // temp_msb
star297 0:19fab6c64964 104 bme.write(address, cmd, 1);
star297 0:19fab6c64964 105 bme.read(address, &cmd[1], 3);
star297 0:19fab6c64964 106
star297 0:19fab6c64964 107 adc_T = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4);
star297 0:19fab6c64964 108
star297 0:19fab6c64964 109 var1 = ((((adc_T>>3) - ((int32_t)dig_T1 <<1))) *
star297 0:19fab6c64964 110 ((int32_t)dig_T2)) >> 11;
star297 0:19fab6c64964 111 var2 = (((((adc_T>>4) - ((int32_t)dig_T1)) *
star297 0:19fab6c64964 112 ((adc_T>>4) - ((int32_t)dig_T1))) >> 12) *
star297 0:19fab6c64964 113 ((int32_t)dig_T3)) >> 14;
star297 0:19fab6c64964 114 t_fine = var1 + var2;
star297 0:19fab6c64964 115 T = (t_fine * 5 + 128) >> 8;
star297 0:19fab6c64964 116 temp = T/100.0;
star297 0:19fab6c64964 117 if(temp>-41 && temp<86){ // return temperature if within device limits.
star297 0:19fab6c64964 118 return temp;
star297 0:19fab6c64964 119 }
star297 0:19fab6c64964 120 else return 99.99; // error value
star297 0:19fab6c64964 121 }
star297 0:19fab6c64964 122
star297 0:19fab6c64964 123 float BME::getPressure()
star297 0:19fab6c64964 124 {
star297 0:19fab6c64964 125 if(!chipID()){init();} // check if live sensor
star297 0:19fab6c64964 126
star297 0:19fab6c64964 127 uint32_t adc_P;
star297 0:19fab6c64964 128 int64_t var1, var2, p;
star297 0:19fab6c64964 129 float press;
star297 0:19fab6c64964 130 char cmd[4];
star297 0:19fab6c64964 131 cmd[0] = 0xF7; // press_msb
star297 0:19fab6c64964 132 bme.write(address, cmd, 1);
star297 0:19fab6c64964 133 bme.read(address, &cmd[1], 3);
star297 0:19fab6c64964 134
star297 0:19fab6c64964 135 adc_P = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4);
star297 0:19fab6c64964 136
star297 0:19fab6c64964 137 var1 = ((int64_t)t_fine) - 128000;
star297 0:19fab6c64964 138 var2 = var1 * var1 * (int64_t)dig_P6;
star297 0:19fab6c64964 139 var2 = var2 + ((var1 * (int64_t)dig_P5) << 17);
star297 0:19fab6c64964 140 var2 = var2 + (((int64_t)dig_P4) << 35);
star297 0:19fab6c64964 141 var1 = ((var1 * var1 * (int64_t)dig_P3)>>8)+((var1 * (int64_t)dig_P2)<<12);
star297 0:19fab6c64964 142 var1 = (((((int64_t)1)<<47)+var1)) * ((int64_t)dig_P1)>>33;
star297 0:19fab6c64964 143 if (var1 == 0) {return 0;}
star297 0:19fab6c64964 144 p = 1048576-adc_P;
star297 0:19fab6c64964 145 p = (((p<<31)-var2)*3125)/var1;
star297 0:19fab6c64964 146 var1 = (((int64_t)dig_P9) * (p>>13) * (p>>13))>>25;
star297 0:19fab6c64964 147 var2 = (((int64_t)dig_P8) * p)>>19;
star297 0:19fab6c64964 148 p = ((p + var1 + var2)>>8) + (((int64_t)dig_P7)<<4);
star297 0:19fab6c64964 149 press = ((float)p/256)/100.0f;
star297 0:19fab6c64964 150 if(press>300 && press<1100){ // return temperature if within device limits.
star297 0:19fab6c64964 151 return press;
star297 0:19fab6c64964 152 }
star297 0:19fab6c64964 153 else return 9999; // error value
star297 0:19fab6c64964 154 }
star297 0:19fab6c64964 155
star297 0:19fab6c64964 156 float BME::getHumidity()
star297 0:19fab6c64964 157 {
star297 0:19fab6c64964 158 if(!chipID()){init();} // check if live sensor
star297 0:19fab6c64964 159
star297 0:19fab6c64964 160 uint32_t humid_raw;
star297 0:19fab6c64964 161 int32_t v_x1r;
star297 0:19fab6c64964 162 float humid;
star297 0:19fab6c64964 163 char cmd[4];
star297 0:19fab6c64964 164 cmd[0] = 0xfd; // hum_msb
star297 0:19fab6c64964 165 bme.write(address, cmd, 1);
star297 0:19fab6c64964 166 bme.read(address, &cmd[1], 2);
star297 0:19fab6c64964 167
star297 0:19fab6c64964 168 humid_raw = (cmd[1] << 8) | cmd[2];
star297 0:19fab6c64964 169
star297 0:19fab6c64964 170 v_x1r = (t_fine - 76800);
star297 0:19fab6c64964 171 v_x1r = (((((humid_raw << 14) -(((int32_t)dig_H4) << 20) - (((int32_t)dig_H5) *
star297 0:19fab6c64964 172 v_x1r)) + ((int32_t)16384)) >> 15) * (((((((v_x1r *
star297 0:19fab6c64964 173 (int32_t)dig_H6) >> 10) * (((v_x1r * ((int32_t)dig_H3)) >> 11) +
star297 0:19fab6c64964 174 32768)) >> 10) + 2097152) * (int32_t)dig_H2 + 8192) >> 14));
star297 0:19fab6c64964 175 v_x1r = (v_x1r - (((((v_x1r >> 15) * (v_x1r >> 15)) >> 7) *
star297 0:19fab6c64964 176 (int32_t)dig_H1) >> 4));
star297 0:19fab6c64964 177 v_x1r = (v_x1r < 0 ? 0 : v_x1r);
star297 0:19fab6c64964 178 v_x1r = (v_x1r > 419430400 ? 419430400 : v_x1r);
star297 0:19fab6c64964 179
star297 0:19fab6c64964 180 humid = ((float)(v_x1r >> 12))/1024.0f;
star297 0:19fab6c64964 181
star297 0:19fab6c64964 182 return humid;
star297 0:19fab6c64964 183 }