demo program of BMP085 pressure sensor

Dependencies:   mbed

Committer:
newk8600
Date:
Fri Nov 09 20:05:44 2012 +0000
Revision:
6:2c0e7ee70b8b
fixed botched revisions

Who changed what in which revision?

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