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.
Fork of BME280 by
BME280.cpp
00001 /** 00002 * BME280 Combined humidity and pressure sensor library 00003 * 00004 * @author Toyomasa Watarai 00005 * @version 1.0 00006 * @date 06-April-2015 00007 * 00008 * Library for "BME280 temperature, humidity and pressure sensor module" from Switch Science 00009 * https://www.switch-science.com/catalog/2236/ 00010 * 00011 * For more information about the BME280: 00012 * http://ae-bst.resource.bosch.com/media/products/dokumente/bme280/BST-BME280_DS001-10.pdf 00013 */ 00014 00015 #include "mbed.h" 00016 #include "BME280.h" 00017 00018 BME280::BME280(PinName sda, PinName scl, char slave_adr) 00019 : 00020 i2c_p(new I2C(sda, scl)), 00021 i2c(*i2c_p), 00022 address(slave_adr), 00023 t_fine(0) 00024 { 00025 initialize(); 00026 i2c.frequency(10000); 00027 } 00028 00029 BME280::BME280(I2C &i2c_obj, char slave_adr) 00030 : 00031 i2c_p(NULL), 00032 i2c(i2c_obj), 00033 address(slave_adr), 00034 t_fine(0) 00035 { 00036 initialize(); 00037 } 00038 00039 BME280::~BME280() 00040 { 00041 if (NULL != i2c_p) 00042 delete i2c_p; 00043 } 00044 00045 void BME280::initialize() 00046 { 00047 char cmd[18]; 00048 00049 cmd[0] = 0xf2; // ctrl_hum 00050 cmd[1] = 0x01; // Humidity oversampling x1 00051 i2c.write(address, cmd, 2); 00052 00053 cmd[0] = 0xf4; // ctrl_meas 00054 cmd[1] = 0x27; // Temparature oversampling x1, Pressure oversampling x1, Normal mode 00055 i2c.write(address, cmd, 2); 00056 00057 cmd[0] = 0xf5; // config 00058 cmd[1] = 0xa0; // Standby 1000ms, Filter off 00059 i2c.write(address, cmd, 2); 00060 00061 cmd[0] = 0x88; // read dig_T regs 00062 i2c.write(address, cmd, 1); 00063 i2c.read(address, cmd, 6); 00064 00065 dig_T1 = (cmd[1] << 8) | cmd[0]; 00066 dig_T2 = (cmd[3] << 8) | cmd[2]; 00067 dig_T3 = (cmd[5] << 8) | cmd[4]; 00068 00069 DEBUG_PRINT("dig_T = 0x%x, 0x%x, 0x%x\n", dig_T1, dig_T2, dig_T3); 00070 00071 cmd[0] = 0x8E; // read dig_P regs 00072 i2c.write(address, cmd, 1); 00073 i2c.read(address, cmd, 18); 00074 00075 dig_P1 = (cmd[ 1] << 8) | cmd[ 0]; 00076 dig_P2 = (cmd[ 3] << 8) | cmd[ 2]; 00077 dig_P3 = (cmd[ 5] << 8) | cmd[ 4]; 00078 dig_P4 = (cmd[ 7] << 8) | cmd[ 6]; 00079 dig_P5 = (cmd[ 9] << 8) | cmd[ 8]; 00080 dig_P6 = (cmd[11] << 8) | cmd[10]; 00081 dig_P7 = (cmd[13] << 8) | cmd[12]; 00082 dig_P8 = (cmd[15] << 8) | cmd[14]; 00083 dig_P9 = (cmd[17] << 8) | cmd[16]; 00084 00085 DEBUG_PRINT("dig_P = 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", dig_P1, dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9); 00086 00087 cmd[0] = 0xA1; // read dig_H regs 00088 i2c.write(address, cmd, 1); 00089 i2c.read(address, cmd, 1); 00090 cmd[1] = 0xE1; // read dig_H regs 00091 i2c.write(address, &cmd[1], 1); 00092 i2c.read(address, &cmd[1], 7); 00093 00094 dig_H1 = cmd[0]; 00095 dig_H2 = (cmd[2] << 8) | cmd[1]; 00096 dig_H3 = cmd[3]; 00097 dig_H4 = (cmd[4] << 4) | (cmd[5] & 0x0f); 00098 dig_H5 = (cmd[6] << 4) | ((cmd[5]>>4) & 0x0f); 00099 dig_H6 = cmd[7]; 00100 00101 DEBUG_PRINT("dig_H = 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", dig_H1, dig_H2, dig_H3, dig_H4, dig_H5, dig_H6); 00102 } 00103 00104 float BME280::getTemperature() 00105 { 00106 uint32_t temp_raw; 00107 float tempf; 00108 char cmd[4]; 00109 00110 cmd[0] = 0xfa; // temp_msb 00111 int writeResult = i2c.write(address, cmd, 1); 00112 int readResult = i2c.read(address, &cmd[1], 3); 00113 00114 if(writeResult != 0 || readResult != 0) 00115 return -10000000; 00116 00117 temp_raw = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4); 00118 00119 int32_t temp; 00120 00121 temp = 00122 (((((temp_raw >> 3) - (dig_T1 << 1))) * dig_T2) >> 11) + 00123 ((((((temp_raw >> 4) - dig_T1) * ((temp_raw >> 4) - dig_T1)) >> 12) * dig_T3) >> 14); 00124 00125 t_fine = temp; 00126 temp = (temp * 5 + 128) >> 8; 00127 tempf = (float)temp; 00128 00129 return (tempf/100.0f); 00130 } 00131 00132 float BME280::getPressure() 00133 { 00134 uint32_t press_raw; 00135 float pressf; 00136 char cmd[4]; 00137 00138 cmd[0] = 0xf7; // press_msb 00139 int writeResult = i2c.write(address, cmd, 1); 00140 int readResult = i2c.read(address, &cmd[1], 3); 00141 00142 if(writeResult != 0 || readResult != 0) 00143 return -10000000; 00144 00145 press_raw = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4); 00146 00147 int32_t var1, var2; 00148 uint32_t press; 00149 00150 var1 = (t_fine >> 1) - 64000; 00151 var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * dig_P6; 00152 var2 = var2 + ((var1 * dig_P5) << 1); 00153 var2 = (var2 >> 2) + (dig_P4 << 16); 00154 var1 = (((dig_P3 * (((var1 >> 2)*(var1 >> 2)) >> 13)) >> 3) + ((dig_P2 * var1) >> 1)) >> 18; 00155 var1 = ((32768 + var1) * dig_P1) >> 15; 00156 if (var1 == 0) { 00157 return 0; 00158 } 00159 press = (((1048576 - press_raw) - (var2 >> 12))) * 3125; 00160 if(press < 0x80000000) { 00161 press = (press << 1) / var1; 00162 } else { 00163 press = (press / var1) * 2; 00164 } 00165 var1 = ((int32_t)dig_P9 * ((int32_t)(((press >> 3) * (press >> 3)) >> 13))) >> 12; 00166 var2 = (((int32_t)(press >> 2)) * (int32_t)dig_P8) >> 13; 00167 press = (press + ((var1 + var2 + dig_P7) >> 4)); 00168 00169 pressf = (float)press; 00170 return (pressf/100.0f); 00171 } 00172 00173 float BME280::getHumidity() 00174 { 00175 uint32_t hum_raw; 00176 float humf; 00177 char cmd[4]; 00178 00179 cmd[0] = 0xfd; // hum_msb 00180 int writeResult = i2c.write(address, cmd, 1); 00181 int readResult = i2c.read(address, &cmd[1], 2); 00182 00183 if(writeResult != 0 || readResult != 0) 00184 return -10000000; 00185 00186 hum_raw = (cmd[1] << 8) | cmd[2]; 00187 00188 int32_t v_x1; 00189 00190 v_x1 = t_fine - 76800; 00191 v_x1 = (((((hum_raw << 14) -(((int32_t)dig_H4) << 20) - (((int32_t)dig_H5) * v_x1)) + 00192 ((int32_t)16384)) >> 15) * (((((((v_x1 * (int32_t)dig_H6) >> 10) * 00193 (((v_x1 * ((int32_t)dig_H3)) >> 11) + 32768)) >> 10) + 2097152) * 00194 (int32_t)dig_H2 + 8192) >> 14)); 00195 v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * (int32_t)dig_H1) >> 4)); 00196 v_x1 = (v_x1 < 0 ? 0 : v_x1); 00197 v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1); 00198 00199 humf = (float)(v_x1 >> 12); 00200 00201 return (humf/1024.0f); 00202 }
Generated on Mon Jul 18 2022 11:51:11 by
1.7.2
