demo program of BMP085 pressure sensor

Dependencies:   mbed

Committer:
newk8600
Date:
Mon Nov 05 19:31:55 2012 +0000
Revision:
1:2935199329b2
Parent:
0:9c929de0a051
Child:
2:8c00953d4755
Child:
4:227f0a670091
initial commit (not working);

Who changed what in which revision?

UserRevisionLine numberNew contents of line
newk8600 0:9c929de0a051 1 /*
newk8600 0:9c929de0a051 2 *
newk8600 0:9c929de0a051 3 *
newk8600 0:9c929de0a051 4 *
newk8600 0:9c929de0a051 5 * 1.8 - 3.6V (Vdd)
newk8600 0:9c929de0a051 6 * 1.62 - 3.6 (Vddio)
newk8600 0:9c929de0a051 7 *
newk8600 0:9c929de0a051 8 *
newk8600 0:9c929de0a051 9 *Altitude = 44330*(1-(p/p0)^(1/5.255))
newk8600 0:9c929de0a051 10 * set p0 to sealevel pressure
newk8600 0:9c929de0a051 11 * delta p = 1hPa = 8.43m at sea level
newk8600 0:9c929de0a051 12 *
newk8600 0:9c929de0a051 13 */
newk8600 0:9c929de0a051 14
newk8600 0:9c929de0a051 15 /*
newk8600 0:9c929de0a051 16 *Pinout:
newk8600 0:9c929de0a051 17 *pin9 = SDA
newk8600 0:9c929de0a051 18 *pin10 = SCL
newk8600 0:9c929de0a051 19 *pin11 = XCLR (digital out; active low; Resets sensor)
newk8600 0:9c929de0a051 20 *pin12 = EOC ("end of conversation"; signal when conversion finished)
newk8600 0:9c929de0a051 21 *
newk8600 0:9c929de0a051 22 *
newk8600 0:9c929de0a051 23 *
newk8600 0:9c929de0a051 24 */
newk8600 1:2935199329b2 25
newk8600 1:2935199329b2 26 class BMP085
newk8600 1:2935199329b2 27 {
newk8600 1:2935199329b2 28
newk8600 1:2935199329b2 29 public:
newk8600 1:2935199329b2 30 BMP085();
newk8600 1:2935199329b2 31 //BMP085();
newk8600 1:2935199329b2 32
newk8600 1:2935199329b2 33 float get_temperature();
newk8600 1:2935199329b2 34 long get_pressure();
newk8600 1:2935199329b2 35 void calculations(long);
newk8600 1:2935199329b2 36
newk8600 1:2935199329b2 37 protected:
newk8600 1:2935199329b2 38 void init(BMP085_OSS);
newk8600 1:2935199329b2 39 unsigned short read_short (int, int);
newk8600 1:2935199329b2 40 void write_char (int, int, int);
newk8600 1:2935199329b2 41
newk8600 1:2935199329b2 42 I2C i2c;
newk8600 1:2935199329b2 43 float temperature;
newk8600 1:2935199329b2 44 long pressure;
newk8600 1:2935199329b2 45
newk8600 1:2935199329b2 46 private:
newk8600 1:2935199329b2 47 short AC1, AC2, AC3, B1, B2, MB, MC, MD, OSS;
newk8600 1:2935199329b2 48 unsigned short AC4, AC5, AC6;
newk8600 1:2935199329b2 49 };
newk8600 1:2935199329b2 50
newk8600 1:2935199329b2 51 #include "mbed.h"
newk8600 0:9c929de0a051 52
newk8600 0:9c929de0a051 53 enum bmp085_oss {ULTRALOW, //samples 1 time
newk8600 0:9c929de0a051 54 STANDARD, //samples twice
newk8600 0:9c929de0a051 55 HIGH, //samples 4 times
newk8600 0:9c929de0a051 56 ULTRAHIGH};//samples 8 times
newk8600 0:9c929de0a051 57
newk8600 1:2935199329b2 58
newk8600 1:2935199329b2 59 I2C i2c(p9, p10); // sda, scl
newk8600 0:9c929de0a051 60 Serial pc(USBTX, USBRX); // tx, rx
newk8600 0:9c929de0a051 61
newk8600 0:9c929de0a051 62 const int bmp085_address = 0xEE; //address of bmp085
newk8600 1:2935199329b2 63 const int P0 = 101325; //pressure at sea level
newk8600 0:9c929de0a051 64
newk8600 0:9c929de0a051 65
newk8600 0:9c929de0a051 66 void bmp085_calibration(void);
newk8600 1:2935199329b2 67 void display_calibration(void);
newk8600 0:9c929de0a051 68 unsigned short read_short(int,int);
newk8600 0:9c929de0a051 69 void write_char(int,int,int);
newk8600 0:9c929de0a051 70
newk8600 0:9c929de0a051 71 long get_raw_temp(void);
newk8600 0:9c929de0a051 72 void calculations(long);
newk8600 1:2935199329b2 73
newk8600 1:2935199329b2 74 float get_temperature(void);
newk8600 1:2935199329b2 75 long get_pressure(void);
newk8600 0:9c929de0a051 76 float get_altitude(long);
newk8600 1:2935199329b2 77
newk8600 1:2935199329b2 78 //short AC1, AC2, AC3, B1, B2, MB, MC, MD, OSS;
newk8600 1:2935199329b2 79 //unsigned short AC4, AC5, AC6;
newk8600 1:2935199329b2 80
newk8600 0:9c929de0a051 81
newk8600 0:9c929de0a051 82
newk8600 0:9c929de0a051 83
newk8600 0:9c929de0a051 84
newk8600 0:9c929de0a051 85
newk8600 1:2935199329b2 86 int main()
newk8600 1:2935199329b2 87 {
newk8600 1:2935199329b2 88
newk8600 0:9c929de0a051 89 //Initialize
newk8600 0:9c929de0a051 90 OSS = STANDARD; //change between enums under bmp085_oss for desired Sampling resolution
newk8600 1:2935199329b2 91
newk8600 1:2935199329b2 92 //calibrate
newk8600 0:9c929de0a051 93 bmp085_calibration();
newk8600 1:2935199329b2 94 display_calibration();
newk8600 1:2935199329b2 95
newk8600 0:9c929de0a051 96 long raw_temp = get_raw_temp();
newk8600 1:2935199329b2 97
newk8600 0:9c929de0a051 98 calculations(raw_temp);
newk8600 1:2935199329b2 99
newk8600 0:9c929de0a051 100 //float altitude = get_altitude(pressure);
newk8600 1:2935199329b2 101
newk8600 0:9c929de0a051 102 //pc.printf("Temperature: %f\n",temperature);
newk8600 0:9c929de0a051 103 //pc.printf("Pressure: %l\n", pressure);
newk8600 0:9c929de0a051 104 //pc.printf("Altitude: %f\n", altitude);
newk8600 1:2935199329b2 105
newk8600 1:2935199329b2 106
newk8600 0:9c929de0a051 107 }
newk8600 0:9c929de0a051 108
newk8600 0:9c929de0a051 109 long get_raw_temp(void)
newk8600 1:2935199329b2 110 {
newk8600 1:2935199329b2 111 long raw_temp;
newk8600 1:2935199329b2 112
newk8600 1:2935199329b2 113 //Read raw temperature value
newk8600 0:9c929de0a051 114 write_char(bmp085_address, 0xF4, 0x2E);
newk8600 0:9c929de0a051 115 wait_ms(4.5);
newk8600 0:9c929de0a051 116 raw_temp = read_short(bmp085_address, 0xF6);
newk8600 1:2935199329b2 117
newk8600 0:9c929de0a051 118 return raw_temp;
newk8600 0:9c929de0a051 119 }
newk8600 0:9c929de0a051 120
newk8600 0:9c929de0a051 121 void calculations(long raw_temp)
newk8600 1:2935199329b2 122 {
newk8600 1:2935199329b2 123 long X1, X2, B5; //temperature;
newk8600 1:2935199329b2 124
newk8600 0:9c929de0a051 125 //Start temperature calculation
newk8600 0:9c929de0a051 126 X1 = (((long)raw_temp - (long)AC6) * (long)AC5) >> 15;
newk8600 0:9c929de0a051 127 X2 = ((long)MC << 11) / (X1 + MD);
newk8600 0:9c929de0a051 128 B5 = X1 + X2;
newk8600 0:9c929de0a051 129 temperature = ((B5 + 8) >> 4);
newk8600 1:2935199329b2 130
newk8600 0:9c929de0a051 131 temperature = ((float)temperature / 10.0);
newk8600 1:2935199329b2 132
newk8600 0:9c929de0a051 133 pc.printf("Temperature: %f\n",temperature);
newk8600 1:2935199329b2 134
newk8600 1:2935199329b2 135
newk8600 1:2935199329b2 136 long raw_pressure, B6, B3, X3;
newk8600 0:9c929de0a051 137 unsigned long B4, B7;
newk8600 1:2935199329b2 138
newk8600 0:9c929de0a051 139 //Read raw pressure value
newk8600 0:9c929de0a051 140 write_char(bmp085_address, 0xf4, 0x34 | (OSS << 6));
newk8600 0:9c929de0a051 141 wait_ms(5);
newk8600 0:9c929de0a051 142 raw_pressure = read_short(bmp085_address, 0xF6) >> (8 - OSS);
newk8600 1:2935199329b2 143
newk8600 0:9c929de0a051 144 //Start Pressure calculation
newk8600 0:9c929de0a051 145 B6 = B5 - 4000;
newk8600 0:9c929de0a051 146 X1 = (B2 * (B6 * B6) >> 12) >> 11;
newk8600 0:9c929de0a051 147 X2 = (AC2 * B6) >> 11;
newk8600 0:9c929de0a051 148 X3 = X1 + X2;
newk8600 0:9c929de0a051 149 B3 = (((AC1 * 4 + X3) << OSS + 2) / 4);
newk8600 0:9c929de0a051 150 X1 = (AC3 * B6) >> 13;
newk8600 0:9c929de0a051 151 X2 = (B1 * ((B6 * B6) >> 12)) >> 16;
newk8600 0:9c929de0a051 152 X3 = ((X1 + X2) + 2) >> 2;
newk8600 0:9c929de0a051 153 B4 = (AC4 * (unsigned long)(X3 + 32768)) >> 15;
newk8600 0:9c929de0a051 154 B7 = ((unsigned long)(raw_pressure - B3) * (50000 >> OSS));
newk8600 0:9c929de0a051 155 if (B7 < 0x80000000)
newk8600 0:9c929de0a051 156 pressure = (B7 *2) / B4;
newk8600 0:9c929de0a051 157 else
newk8600 0:9c929de0a051 158 pressure = (B7 / B4) * 2;
newk8600 1:2935199329b2 159
newk8600 0:9c929de0a051 160 X1 = (pressure >> 8) * (pressure >>8);
newk8600 0:9c929de0a051 161 X1 = (X1 * 3038) >>16;
newk8600 0:9c929de0a051 162 X2 = (-7357 * pressure) >>16;
newk8600 0:9c929de0a051 163 pressure += (X1 + X2 + 3791)>>4;
newk8600 1:2935199329b2 164
newk8600 0:9c929de0a051 165 pc.printf("Pressure: %f\n", pressure);
newk8600 1:2935199329b2 166
newk8600 1:2935199329b2 167 }
newk8600 1:2935199329b2 168
newk8600 1:2935199329b2 169 float get_temperature(void)
newk8600 1:2935199329b2 170 {
newk8600 1:2935199329b2 171 return temperature;
newk8600 0:9c929de0a051 172 }
newk8600 1:2935199329b2 173
newk8600 1:2935199329b2 174 long get_pressure(void)
newk8600 1:2935199329b2 175 {
newk8600 1:2935199329b2 176 return pressure;
newk8600 1:2935199329b2 177 }
newk8600 1:2935199329b2 178
newk8600 0:9c929de0a051 179 float get_altitude(long pressure)
newk8600 0:9c929de0a051 180 {
newk8600 0:9c929de0a051 181 float altitude;
newk8600 1:2935199329b2 182
newk8600 1:2935199329b2 183 altitude = (float)44330 * (1 - pow(( pressure/P0), 0.190295));
newk8600 1:2935199329b2 184
newk8600 0:9c929de0a051 185 pc.printf("Altitude: %f\n", altitude);
newk8600 1:2935199329b2 186 return altitude;
newk8600 1:2935199329b2 187
newk8600 0:9c929de0a051 188 }
newk8600 0:9c929de0a051 189
newk8600 0:9c929de0a051 190 void bmp085_calibration(void)
newk8600 1:2935199329b2 191 {
newk8600 0:9c929de0a051 192 AC1 = read_short(bmp085_address, 0xAA);
newk8600 0:9c929de0a051 193 AC2 = read_short(bmp085_address, 0xAC);
newk8600 0:9c929de0a051 194 AC3 = read_short(bmp085_address, 0xAE);
newk8600 1:2935199329b2 195 AC4 = read_short(bmp085_address, 0xB0);
newk8600 0:9c929de0a051 196 AC5 = read_short(bmp085_address, 0xB2);
newk8600 0:9c929de0a051 197 AC6 = read_short(bmp085_address, 0xB4);
newk8600 0:9c929de0a051 198 B1 = read_short(bmp085_address, 0xB6);
newk8600 0:9c929de0a051 199 B2 = read_short(bmp085_address, 0xB8);
newk8600 0:9c929de0a051 200 MB = read_short(bmp085_address, 0xBA);
newk8600 0:9c929de0a051 201 MC = read_short(bmp085_address, 0xBC);
newk8600 1:2935199329b2 202 MD = read_short(bmp085_address, 0xBE);
newk8600 1:2935199329b2 203
newk8600 0:9c929de0a051 204 }
newk8600 0:9c929de0a051 205
newk8600 0:9c929de0a051 206 void display_calibration(void)
newk8600 1:2935199329b2 207 {
newk8600 0:9c929de0a051 208 pc.printf("Calibration Values:\n");
newk8600 0:9c929de0a051 209 pc.printf("AC1 = %d\n",AC1);
newk8600 0:9c929de0a051 210 pc.printf("AC2 = %d\n",AC2);
newk8600 0:9c929de0a051 211 pc.printf("AC3 = %d\n",AC3);
newk8600 0:9c929de0a051 212 pc.printf("AC4 = %d\n",AC4);
newk8600 0:9c929de0a051 213 pc.printf("AC5 = %d\n",AC5);
newk8600 0:9c929de0a051 214 pc.printf("AC6 = %d\n",AC6);
newk8600 0:9c929de0a051 215 pc.printf("B1 = %d\n",B1);
newk8600 0:9c929de0a051 216 pc.printf("B2 = %d\n",B2);
newk8600 0:9c929de0a051 217 pc.printf("MB = %d\n",MB);
newk8600 0:9c929de0a051 218 pc.printf("MC = %d\n",MC);
newk8600 1:2935199329b2 219 pc.printf("MD = %d\n",MD);
newk8600 0:9c929de0a051 220 }
newk8600 1:2935199329b2 221
newk8600 1:2935199329b2 222 unsigned short read_short(int device_address,int address)
newk8600 1:2935199329b2 223 {
newk8600 0:9c929de0a051 224 unsigned short value;
newk8600 1:2935199329b2 225
newk8600 0:9c929de0a051 226 i2c.start();
newk8600 0:9c929de0a051 227 i2c.write(device_address);
newk8600 0:9c929de0a051 228 i2c.write(address);
newk8600 1:2935199329b2 229
newk8600 0:9c929de0a051 230 i2c.start();
newk8600 0:9c929de0a051 231 i2c.write(device_address | 1);
newk8600 0:9c929de0a051 232 value = i2c.read(1) << 8;
newk8600 0:9c929de0a051 233 value |= i2c.read(0);
newk8600 0:9c929de0a051 234 i2c.stop();
newk8600 1:2935199329b2 235
newk8600 0:9c929de0a051 236 return value;
newk8600 1:2935199329b2 237
newk8600 0:9c929de0a051 238 }
newk8600 0:9c929de0a051 239
newk8600 0:9c929de0a051 240 void write_char(int device_address, int address, int data)
newk8600 0:9c929de0a051 241 {
newk8600 0:9c929de0a051 242 i2c.start();
newk8600 0:9c929de0a051 243 i2c.write(device_address);
newk8600 0:9c929de0a051 244 i2c.write(address);
newk8600 0:9c929de0a051 245 i2c.write(data);
newk8600 0:9c929de0a051 246 i2c.stop();
newk8600 1:2935199329b2 247 }
newk8600 1:2935199329b2 248