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