![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
demo program of BMP085 pressure sensor
Diff: main.cpp
- Revision:
- 1:2935199329b2
- Parent:
- 0:9c929de0a051
- Child:
- 2:8c00953d4755
- Child:
- 4:227f0a670091
diff -r 9c929de0a051 -r 2935199329b2 main.cpp --- a/main.cpp Fri Oct 05 08:03:52 2012 +0000 +++ b/main.cpp Mon Nov 05 19:31:55 2012 +0000 @@ -22,95 +22,125 @@ * * */ -#include "mbed.h" + +class BMP085 +{ + +public: + BMP085(); + //BMP085(); + + float get_temperature(); + long get_pressure(); + void calculations(long); + +protected: + void init(BMP085_OSS); + unsigned short read_short (int, int); + void write_char (int, int, int); + + I2C i2c; + float temperature; + long pressure; + +private: + short AC1, AC2, AC3, B1, B2, MB, MC, MD, OSS; + unsigned short AC4, AC5, AC6; +}; + +#include "mbed.h" enum bmp085_oss {ULTRALOW, //samples 1 time STANDARD, //samples twice HIGH, //samples 4 times ULTRAHIGH};//samples 8 times - -I2C i2c(p9, p10); // sda, scl + +I2C i2c(p9, p10); // sda, scl Serial pc(USBTX, USBRX); // tx, rx const int bmp085_address = 0xEE; //address of bmp085 -const int P0 = 101325; //pressure at sea level +const int P0 = 101325; //pressure at sea level void bmp085_calibration(void); -void display_calibration(void); +void display_calibration(void); unsigned short read_short(int,int); void write_char(int,int,int); long get_raw_temp(void); void calculations(long); + +float get_temperature(void); +long get_pressure(void); float get_altitude(long); - -short AC1, AC2, AC3, B1, B2, MB, MC, MD, OSS; -unsigned short AC4, AC5, AC6; - + +//short AC1, AC2, AC3, B1, B2, MB, MC, MD, OSS; +//unsigned short AC4, AC5, AC6; + -int main() { - +int main() +{ + //Initialize OSS = STANDARD; //change between enums under bmp085_oss for desired Sampling resolution - - //calibrate + + //calibrate bmp085_calibration(); - display_calibration(); - + display_calibration(); + long raw_temp = get_raw_temp(); - + calculations(raw_temp); - + //float altitude = get_altitude(pressure); - + //pc.printf("Temperature: %f\n",temperature); //pc.printf("Pressure: %l\n", pressure); //pc.printf("Altitude: %f\n", altitude); - - + + } long get_raw_temp(void) -{ - long raw_temp; - - //Read raw temperature value +{ + long raw_temp; + + //Read raw temperature value write_char(bmp085_address, 0xF4, 0x2E); wait_ms(4.5); raw_temp = read_short(bmp085_address, 0xF6); - + return raw_temp; } void calculations(long raw_temp) -{ - long X1, X2, B5, temperature; - +{ + long X1, X2, B5; //temperature; + //Start temperature calculation X1 = (((long)raw_temp - (long)AC6) * (long)AC5) >> 15; X2 = ((long)MC << 11) / (X1 + MD); B5 = X1 + X2; temperature = ((B5 + 8) >> 4); - + temperature = ((float)temperature / 10.0); - + pc.printf("Temperature: %f\n",temperature); - - - long raw_pressure, B6, B3, pressure, X3; + + + long raw_pressure, B6, B3, X3; unsigned long B4, B7; - + //Read raw pressure value write_char(bmp085_address, 0xf4, 0x34 | (OSS << 6)); wait_ms(5); raw_pressure = read_short(bmp085_address, 0xF6) >> (8 - OSS); - + //Start Pressure calculation B6 = B5 - 4000; X1 = (B2 * (B6 * B6) >> 12) >> 11; @@ -126,45 +156,55 @@ pressure = (B7 *2) / B4; else pressure = (B7 / B4) * 2; - + X1 = (pressure >> 8) * (pressure >>8); X1 = (X1 * 3038) >>16; X2 = (-7357 * pressure) >>16; pressure += (X1 + X2 + 3791)>>4; - + pc.printf("Pressure: %f\n", pressure); - + +} + +float get_temperature(void) +{ + return temperature; } - + +long get_pressure(void) +{ + return pressure; +} + float get_altitude(long pressure) { float altitude; - - altitude = (float)44330 * (1 - pow(( pressure/P0), 0.190295)); - + + altitude = (float)44330 * (1 - pow(( pressure/P0), 0.190295)); + pc.printf("Altitude: %f\n", altitude); - return altitude; - + return altitude; + } void bmp085_calibration(void) -{ +{ AC1 = read_short(bmp085_address, 0xAA); AC2 = read_short(bmp085_address, 0xAC); AC3 = read_short(bmp085_address, 0xAE); - AC4 = read_short(bmp085_address, 0xB0); + AC4 = read_short(bmp085_address, 0xB0); AC5 = read_short(bmp085_address, 0xB2); AC6 = read_short(bmp085_address, 0xB4); B1 = read_short(bmp085_address, 0xB6); B2 = read_short(bmp085_address, 0xB8); MB = read_short(bmp085_address, 0xBA); MC = read_short(bmp085_address, 0xBC); - MD = read_short(bmp085_address, 0xBE); - + MD = read_short(bmp085_address, 0xBE); + } void display_calibration(void) -{ +{ pc.printf("Calibration Values:\n"); pc.printf("AC1 = %d\n",AC1); pc.printf("AC2 = %d\n",AC2); @@ -176,24 +216,25 @@ pc.printf("B2 = %d\n",B2); pc.printf("MB = %d\n",MB); pc.printf("MC = %d\n",MC); - pc.printf("MD = %d\n",MD); + pc.printf("MD = %d\n",MD); } - -unsigned short read_short(int device_address,int address){ + +unsigned short read_short(int device_address,int address) +{ unsigned short value; - + i2c.start(); i2c.write(device_address); i2c.write(address); - + i2c.start(); i2c.write(device_address | 1); value = i2c.read(1) << 8; value |= i2c.read(0); i2c.stop(); - + return value; - + } void write_char(int device_address, int address, int data) @@ -203,6 +244,5 @@ i2c.write(address); i2c.write(data); i2c.stop(); -} - - \ No newline at end of file +} +