/* SFE_BMP180.cpp Bosch BMP180 pressure sensor library for the Arduino microcontroller Mike Grusin, SparkFun Electronics Uses floating-point equations from the Weather Station Data Logger project http://wmrx00.sourceforge.net/ http://wmrx00.sourceforge.net/Arduino/BMP085-Calcs.pdf Forked from BMP085 library by M.Grusin version 1.0 2013/09/20 initial version Verison 1.1.2 - Updated for Arduino 1.6.4 5/2015 Our example code uses the "beerware" license. You can do anything you like with this code. No really, anything. If you find it useful, buy me a (root) beer someday. */ #include #include #include #include SFE_BMP180::SFE_BMP180() // Base library type { } char SFE_BMP180::begin() // Initialize library for subsequent pressure measurements { double c3,c4,b1; // Start up the Arduino's "wire" (I2C) library: Wire.begin(); // The BMP180 includes factory calibration data stored on the device. // Each device has different numbers, these must be retrieved and // used in the calculations when taking pressure measurements. // Retrieve calibration data from device: if (readInt(0xAA,AC1) && readInt(0xAC,AC2) && readInt(0xAE,AC3) && readUInt(0xB0,AC4) && readUInt(0xB2,AC5) && readUInt(0xB4,AC6) && readInt(0xB6,VB1) && readInt(0xB8,VB2) && readInt(0xBA,MB) && readInt(0xBC,MC) && readInt(0xBE,MD)) { // All reads completed successfully! // If you need to check your math using known numbers, // you can uncomment one of these examples. // (The correct results are commented in the below functions.) // Example from Bosch datasheet // AC1 = 408; AC2 = -72; AC3 = -14383; AC4 = 32741; AC5 = 32757; AC6 = 23153; // B1 = 6190; B2 = 4; MB = -32768; MC = -8711; MD = 2868; // Example from http://wmrx00.sourceforge.net/Arduino/BMP180-Calcs.pdf // AC1 = 7911; AC2 = -934; AC3 = -14306; AC4 = 31567; AC5 = 25671; AC6 = 18974; // VB1 = 5498; VB2 = 46; MB = -32768; MC = -11075; MD = 2432; /* Serial.print("AC1: "); Serial.println(AC1); Serial.print("AC2: "); Serial.println(AC2); Serial.print("AC3: "); Serial.println(AC3); Serial.print("AC4: "); Serial.println(AC4); Serial.print("AC5: "); Serial.println(AC5); Serial.print("AC6: "); Serial.println(AC6); Serial.print("VB1: "); Serial.println(VB1); Serial.print("VB2: "); Serial.println(VB2); Serial.print("MB: "); Serial.println(MB); Serial.print("MC: "); Serial.println(MC); Serial.print("MD: "); Serial.println(MD); */ // Compute floating-point polynominals: c3 = 160.0 * pow(2,-15) * AC3; c4 = pow(10,-3) * pow(2,-15) * AC4; b1 = pow(160,2) * pow(2,-30) * VB1; c5 = (pow(2,-15) / 160) * AC5; c6 = AC6; mc = (pow(2,11) / pow(160,2)) * MC; md = MD / 160.0; x0 = AC1; x1 = 160.0 * pow(2,-13) * AC2; x2 = pow(160,2) * pow(2,-25) * VB2; y0 = c4 * pow(2,15); y1 = c4 * c3; y2 = c4 * b1; p0 = (3791.0 - 8.0) / 1600.0; p1 = 1.0 - 7357.0 * pow(2,-20); p2 = 3038.0 * 100.0 * pow(2,-36); /* Serial.println(); Serial.print("c3: "); Serial.println(c3); Serial.print("c4: "); Serial.println(c4); Serial.print("c5: "); Serial.println(c5); Serial.print("c6: "); Serial.println(c6); Serial.print("b1: "); Serial.println(b1); Serial.print("mc: "); Serial.println(mc); Serial.print("md: "); Serial.println(md); Serial.print("x0: "); Serial.println(x0); Serial.print("x1: "); Serial.println(x1); Serial.print("x2: "); Serial.println(x2); Serial.print("y0: "); Serial.println(y0); Serial.print("y1: "); Serial.println(y1); Serial.print("y2: "); Serial.println(y2); Serial.print("p0: "); Serial.println(p0); Serial.print("p1: "); Serial.println(p1); Serial.print("p2: "); Serial.println(p2); */ // Success! return(1); } else { // Error reading calibration data; bad component or connection? return(1); } } char SFE_BMP180::readInt(char address, int16_t &value) // Read a signed integer (two bytes) from device // address: register to start reading (plus subsequent register) // value: external variable to store data (function modifies value) { unsigned char data[2]; data[0] = address; if (readBytes(data,2)) { value = (int16_t)((data[0]<<8)|data[1]); //if (*value & 0x8000) *value |= 0xFFFF0000; // sign extend if negative return(1); } value = 0; return(0); } char SFE_BMP180::readUInt(char address, uint16_t &value) // Read an unsigned integer (two bytes) from device // address: register to start reading (plus subsequent register) // value: external variable to store data (function modifies value) { unsigned char data[2]; data[0] = address; if (readBytes(data,2)) { value = (((uint16_t)data[0]<<8)|(uint16_t)data[1]); return(1); } value = 0; return(0); } char SFE_BMP180::readBytes(unsigned char *values, char length) // Read an array of bytes from device // values: external array to hold data. Put starting register in values[0]. // length: number of bytes to read { char x; Wire.beginTransmission(BMP180_ADDR); Wire.write(values[0]); _error = Wire.endTransmission(); if (_error == 0) { Wire.requestFrom(BMP180_ADDR,length); while(Wire.available() != length) ; // wait until bytes are ready for(x=0;x