Class for using BMP180 Bosch Pressure sensor

Dependents:   ILI9341_Clock_Nucleo IoT-Polytech-Upmc

Revision:
1:4c6b41f1203d
Parent:
0:b899fe37ce17
Child:
2:4749ef781396
--- a/BMP180.cpp	Tue Nov 26 05:40:44 2013 +0000
+++ b/BMP180.cpp	Tue Nov 26 08:29:44 2013 +0000
@@ -11,7 +11,7 @@
     wReg[1] = 0;
     w[0] = 0xF4;
     w[1] = 0xF4;
-    
+
     cmd = CMD_READ_CALIBRATION; // EEPROM calibration command
     for (int i = 0; i < EEprom; i++) { // read the 22 registers of the EEPROM
         bmp180i2c.write(BMP180ADDR, &cmd, 1);
@@ -55,17 +55,26 @@
 int BMP180::readTemperature(long *t)        // Get the temperature reading that was taken in startTemperature() but ensure 4.5 ms time has elapsed
 {
     int errors = 0;
+    rReg[0] = 0;
+    rReg[1] = 0;
+    rReg[2] = 0;
     cmd = CMD_READ_VALUE;                           // 0xF6
     errors += bmp180i2c.write(BMP180ADDR, &cmd, 1); // set pointer on 0xF6 before reading it?
     errors += bmp180i2c.read(BMP180ADDR, rReg, 2);  // read 0xF6 (MSB) and 0xF7 (LSB)// rReg is 3 long though
     *t = (rReg[0] << 8) | rReg[1];                  // UT = MSB << 8 + LSB
+    
+    x1 = (((long) *t - (long) ac6) * (long) ac5) >> 15; // aka (ut-ac6) * ac5/pow(2,15)
+    x2 = ((long) mc << 11) / (x1 + md);                 // aka mc * pow(2, 11) / (x1 + md)
+    b5 = x1 + x2;
+    *t = ((b5 + 8) >> 4);                               // (b5+8)/pow(2, 4)
     return(errors);
 }
 
 int BMP180::startPressure(int oversample)  // Start pressure measurement!  Note oversample will vary the time to complete this measurement. See defines above for oversampling constants to use!
 {
     int errors = 0;
-    int uncomp_pressure_cmd = 0x34 + (oversample<<6);
+    oversampling_setting = BMP180::oversampleCheck(oversample);
+    int uncomp_pressure_cmd = 0x34 + (oversampling_setting<<6);
     errors = bmp180i2c.write(BMP180ADDR, w, 2);
     wReg[0] = 0xF4;
     wReg[1] = uncomp_pressure_cmd;
@@ -73,41 +82,57 @@
     return(errors);
 }
 
-int BMP180::readPressure(long *p)          // Get the pressure reading that was taken in startPressure() but ensure time for the measurement to complete
+int BMP180::readPressure(long *p)   // Get the pressure reading that was taken in startPressure() but ensure time for the measurement to complete
 {
     int errors = 0;
+    rReg[0] = 0;
+    rReg[1] = 0;
+    rReg[2] = 0;
     cmd = CMD_READ_VALUE;                           // 0xF6
     errors += bmp180i2c.write(BMP180ADDR, &cmd, 1);
     errors += bmp180i2c.read(BMP180ADDR, rReg, 3);  // read 0xF6 (MSB), 0xF7 (LSB), 0xF8 (XLSB)
     *p = ((rReg[0] << 16) | (rReg[1] << 8) | rReg[2]) >> (8 - oversampling_setting);
+    
+    b6 = b5 - 4000;             // realize b5 is set in readTemperature() function so that needs to be done first before this function! 
+    x1 = (b6*b6) >> 12;         // full formula(b2*(b6*b6)/pow(2,12))/pow(2,11)
+    x1 *= b2;
+    x1 >>= 11;
+
+    x2 = (ac2*b6);
+    x2 >>= 11;
+
+    x3 = x1 + x2;
+
+    b3 = (((((long)ac1 )*4 + x3) <<oversampling_setting) + 2) >> 2; 
+
+    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) *p - b3) * (50000>>oversampling_setting);
+    if (b7 < 0x80000000) {
+        *p = (b7 << 1) / b4;
+    } else {
+        *p = (b7 / b4) << 1;
+    }
+
+    x1 = *p >> 8;
+    x1 *= x1;                               // pressure/pow(2,8) * pressure/pow(2, 8)
+    x1 = (x1 * 3038) >> 16;
+    x2 = ( *p * -7357) >> 16;
+    *p += (x1 + x2 + 3791) >> 4;            // pressure in Pa
     return(errors);
 }
 
-/*
-int BMP180::rTemp(long *ut)
+int BMP180::readTP(long *t, long *p, int oversample)  // get both temperature and pressure calculations that are compensated
 {
     int errors = 0;
-    errors = bmp180i2c.write(BMP180ADDR, w, 2);
-    wReg[0] = 0xF4;
-    wReg[1] = 0x2E;
-    errors += bmp180i2c.write(BMP180ADDR, wReg, 2); // write 0x2E in reg 0XF4
+    errors += BMP180::startTemperature();
     wait_ms(4.5);
-    cmd = CMD_READ_VALUE;                           // 0xF6
-    errors += bmp180i2c.write(BMP180ADDR, &cmd, 1); // set pointer on 0xF6 before reading it?
-    errors += bmp180i2c.read(BMP180ADDR, rReg, 2);  // read 0xF6 (MSB) and 0xF7 (LSB)// rReg is 3 long though
-    *ut = (rReg[0] << 8) | rReg[1];                 // UT = MSB << 8 + LSB
-    return(errors);
-}
-
-int BMP180::rPressure(long *up)
-{
-    int errors = 0;
-    errors = bmp180i2c.write(BMP180ADDR, w, 2);
-    int uncomp_pressure_cmd = 0x34 + (oversampling_setting<<6);
-    wReg[0] = 0xF4;
-    wReg[1] = uncomp_pressure_cmd;
-    errors += bmp180i2c.write(BMP180ADDR, wReg, 2);
-    switch (oversampling_setting) {
+    errors += BMP180::readTemperature(t);
+    errors += BMP180::startPressure(oversample);
+    switch (oversample) {
         case OVERSAMPLING_ULTRA_LOW_POWER:
             wait_ms(4.5);
             break;
@@ -121,34 +146,23 @@
             wait_ms(25.5);
             break;
     }
-    cmd = CMD_READ_VALUE; // 0xF6
-    errors += bmp180i2c.write(BMP180ADDR, &cmd, 1);
-    errors += bmp180i2c.read(BMP180ADDR, rReg, 3); // read 0xF6 (MSB), 0xF7 (LSB), 0xF8 (XLSB)
-    *up = ((rReg[0] << 16) | (rReg[1] << 8) | rReg[2]) >> (8 - oversampling_setting);
+    errors += BMP180::readPressure(p);
     return(errors);
-}  */
-
-int BMP180::readTP(long *t, long *p, int oversample)  // get both temperature and pressure calculations that are compensated
+}
+int BMP180::oversampleCheck(int oversample)
 {
-    int errors = 0;
-    errors += BMP180::startTemperature();
-    wait_ms(4.5);
-    errors += BMP180::readTemperature(t);
-    errors += BMP180::startPressure(oversample);
-     switch (oversampling_setting) {
+    switch(oversample) {
         case OVERSAMPLING_ULTRA_LOW_POWER:
-            wait_ms(4.5);
             break;
         case OVERSAMPLING_STANDARD:
-            wait_ms(7.5);
             break;
         case OVERSAMPLING_HIGH_RESOLUTION:
-            wait_ms(13.5);
             break;
         case OVERSAMPLING_ULTRA_HIGH_RESOLUTION:
-            wait_ms(25.5);
+            break;
+        default:
+            oversample = OVERSAMPLING_ULTRA_HIGH_RESOLUTION;
             break;
     }
-    errors += BMP180::readPressure(p);    
-    return(errors);
+    return(oversample);
 }
\ No newline at end of file