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.
BMP280.cpp
00001 #include "BMP280.h" 00002 00003 void BMP280::write(char reg, char ctrl) { 00004 char data[2] = {reg, ctrl}; 00005 m_i2c.write(BMP280_ADDR, data, 2, false); 00006 } 00007 00008 void BMP280::read(char reg, char *data, int length) { 00009 m_i2c.write(BMP280_ADDR, ®, 1, false); 00010 m_i2c.read(BMP280_ADDR+1, data, length, false); 00011 } 00012 00013 BMP280::BMP280(I2C& i2c) : m_i2c(i2c), pc(p5,p4) { 00014 char begin = BMP280_REG_CALIBRATION; 00015 char bf[24]; 00016 00017 read(begin, bf, 24); 00018 dig_T1 = (bf[1]<<8) | bf[0]; 00019 dig_T2 = (bf[3]<<8) | bf[2]; 00020 dig_T3 = (bf[5]<<8) | bf[4]; 00021 dig_P1 = (bf[7]<<8) | bf[6]; 00022 dig_P2 = (bf[9]<<8) | bf[8]; 00023 dig_P3 = (bf[11]<<8) | bf[10]; 00024 dig_P4 = (bf[13]<<8) | bf[12]; 00025 dig_P5 = (bf[15]<<8) | bf[14]; 00026 dig_P6 = (bf[17]<<8) | bf[16]; 00027 dig_P7 = (bf[19]<<8) | bf[18]; 00028 dig_P8 = (bf[21]<<8) | bf[20]; 00029 dig_P9 = (bf[23]<<8) | bf[22]; 00030 00031 00032 } 00033 00034 int BMP280::init(char ctrl_meas , char config) { 00035 00036 char reg_ctrl, reg_config; 00037 reg_ctrl = BMP280_REG_CTRL_MEAS; 00038 reg_config = BMP280_REG_CONFIG; 00039 00040 write(reg_ctrl, ctrl_meas); 00041 write(reg_config, config); 00042 00043 // pc.printf("t1:%d, t2:%d, t3:%d\r\n", dig_T1, dig_T2, dig_T3); 00044 // pc.printf("p1:%d, p2:%d, p3:%d, p4:%d, p5:%d, p6:%d, p7:%d, p8:%d, p9:%d\r\n", dig_P1, dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9); 00045 00046 return 0; 00047 } 00048 00049 int BMP280::readData(float *tempC, int *pressPa) { 00050 00051 int var1,var2,T; 00052 int t_fine; 00053 unsigned int press=0; 00054 char read_reg = BMP280_REG_PRESS; 00055 char rx[6]; 00056 int adc_T,adc_P; 00057 00058 read(read_reg, rx, 6); 00059 00060 adc_T = ((rx[3]<<12)|(rx[4]<<4)|rx[5]>>4); 00061 adc_P = ((rx[0]<<12)|(rx[1]<<4)|rx[2]>>4); 00062 // pc.printf("adc_T %d, adc_p %d\r\n", adc_T, adc_P); 00063 00064 var1=((((adc_T>>3)-((int)dig_T1<<1)))*((int)dig_T2))>>11; 00065 var2=(((((adc_T>>4)-((int)dig_T1))*((adc_T>>4)-((int)dig_T1)))>>12)*((int)dig_T3))>>14; 00066 t_fine=var1+var2; 00067 T=(t_fine*5+128)>>8; 00068 *tempC = T/100.0; 00069 // pc.printf("BMP280 T %d\r\n", T); 00070 00071 00072 var1 = (t_fine >> 1) - 64000; 00073 var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * dig_P6; 00074 var2 = var2 + ((var1 * dig_P5) << 1); 00075 var2 = (var2 >> 2) + (dig_P4 << 16); 00076 var1 = (((dig_P3 * (((var1 >> 2)*(var1 >> 2)) >> 13)) >> 3) + ((dig_P2 * var1) >> 1)) >> 18; 00077 var1 = ((32768 + var1) * dig_P1) >> 15; 00078 if (var1 == 0) { 00079 // pc.printf("var1 is zero!\r\n"); 00080 } 00081 press = (((1048576 - adc_P) - (var2 >> 12))) * 3125; 00082 if(press < 0x80000000) { 00083 press = (press << 1) / var1; 00084 } else { 00085 press = (press / var1) * 2; 00086 } 00087 var1 = ((int32_t)dig_P9 * ((int32_t)(((press >> 3) * (press >> 3)) >> 13))) >> 12; 00088 var2 = (((int32_t)(press >> 2)) * (int32_t)dig_P8) >> 13; 00089 press = (press + ((var1 + var2 + dig_P7) >> 4)); 00090 *pressPa = press; 00091 // pc.printf("press is %d\r\n", press); 00092 00093 return 0; 00094 }
Generated on Mon Jul 25 2022 10:33:12 by
1.7.2