Bosch BMP085 Barometric Pressure Sensor
bmp085.cpp
- Committer:
- timm
- Date:
- 2015-03-19
- Revision:
- 0:e8f53e502a4c
File content as of revision 0:e8f53e502a4c:
#include "mbed.h" #include "bmp085.h" BMP085::BMP085(PinName sclPin, PinName sdaPin) { i2c = new I2C(sdaPin, sclPin); i2c->frequency(1000); // run at 1KHz } long BMP085::getUT() { return UT; } long BMP085::getUP() { return UP; } void BMP085::init() { readCalData(); } void BMP085::readCalData() { char dataWrite[2]; char dataRead[2]; dataWrite[0] = CAL_DATA_AC1; i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); AC1 = ((dataRead[0] << 8) | (dataRead[1])); dataWrite[0] = CAL_DATA_AC2; i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); AC2 = ((dataRead[0] << 8) | (dataRead[1])); dataWrite[0] = CAL_DATA_AC3; i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); AC3 = ((dataRead[0] << 8) | (dataRead[1])); dataWrite[0] = CAL_DATA_AC4; i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); AC4 = ((dataRead[0] << 8) | (dataRead[1])); dataWrite[0] = CAL_DATA_AC5; i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); AC5 = ((dataRead[0] << 8) | (dataRead[1])); dataWrite[0] = CAL_DATA_AC6; i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); AC6 = ((dataRead[0] << 8) | (dataRead[1])); dataWrite[0] = CAL_DATA_B1; i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); B1 = ((dataRead[0] << 8) | (dataRead[1])); dataWrite[0] = CAL_DATA_B2; i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); B2 = ((dataRead[0] << 8) | (dataRead[1])); dataWrite[0] = CAL_DATA_MB; i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); MB = ((dataRead[0] << 8) | (dataRead[1])); dataWrite[0] = CAL_DATA_MC; i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); MC = ((dataRead[0] << 8) | (dataRead[1])); dataWrite[0] = CAL_DATA_MD; i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); MD = ((dataRead[0] << 8) | (dataRead[1])); } void BMP085::readUncompTemp() { char dataWrite[2]; char dataRead[2]; dataWrite[0] = CTRL_REG_ADDR; dataWrite[1] = MEASURE_TEMP_CMD; i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 2, 0); // stop wait_ms(5); dataWrite[0] = DATA_REG_ADDR; dataWrite[1] = 0; i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop i2c->read(BMP085_I2C_ADDR_READ, dataRead, 2, 0); UT = (long)((dataRead[0] << 8) | (dataRead[1])); } void BMP085::readUncompPressure(int mode) { char dataWrite[2]; char dataRead[4]; dataWrite[0] = CTRL_REG_ADDR; dataWrite[1] = (MEASURE_PRES_CMD | ((((char)mode) & 0x3) << 6)); i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 2, 0); // stop wait_ms(10 * (mode + 1)); // TODO: ensure this is accurate, based on oss dataWrite[0] = DATA_REG_ADDR; dataWrite[1] = 0; i2c->write(BMP085_I2C_ADDR_WRITE, dataWrite, 1, 1); // no stop i2c->read(BMP085_I2C_ADDR_READ, dataRead, 3, 0); UP = (long)( ((dataRead[0] << 16) | (dataRead[1] << 8) | dataRead[0]) >> ( 8 - mode)); //UP = (long)((dataRead[0] << 8) | (dataRead[1])); } float BMP085::getTemperature() { readUncompTemp(); X1 = (((long)UT - (long)AC6)*(long)AC5) >> 15; X2= ((long)MC << 11)/(X1+ MD); B5 = X1 + X2; T = ((B5 + 8) >> 4); return (float)(T / 10.0); } float BMP085::getPressure(int oss) { readUncompPressure(oss); // Calculate B3 B6 = B5 - 4000; X1 = (B2 * ((B6 * B6)>>12)) >>11; X2 = (AC2 * B6)>>11; X3 = X1 + X2; B3 = (((((long)AC1) * 4 + X3) << oss) + 2) >> 2; // Calculate B4, B7, p X1 = (AC3 + B6) >> 13; X2 = (B1 * ((B6 * B6) >> 12)) >> 16; X3 = ((X1 + X2) + 2 ) >> 2; B4 = (AC4 * (unsigned long)(X3 + 32768)) >> 15; B7 = ((unsigned long)(UP - B3) * (50000 >> oss)); if (B7 < 0x80000000) { p = (B7 << 1) / B4; } else { p = (B7/B4) << 1; } X1 = (p >> 8) * (p >> 8); X1 = (X1 * 3038) >> 16; X2 = (-7357 * p) >> 16; p += ((X1 + X2 + 3791) >> 4); return (float)p; }