/* BMP280.cpp Bosch BMP280 pressure sensor library for the Arduino microcontroller. This library uses I2C connection. Uses floating-point equations from BMP280 datasheet. modified by mhafuzul islam version 1.01 16/9/2014 initial version Our example code uses the "pizza-eating" license. You can do anything you like with this code. No really, anything. If you find it useful, buy me italian pizza someday. */ #include "BMP280.h" #include #include #include BMP280::BMP280() { //do nothing } /* * Initialize library and coefficient for measurements */ char BMP280::begin(int sdaPin, int sclPin) { Wire.begin(sdaPin,sclPin); return (readCalibration()); } char BMP280::begin() { // Start up the Arduino's "wire" (I2C) library: Wire.begin(); return (readCalibration()); } // The BMP280 includes factory calibration data stored on the device. // Each device has different numbers, these must be retrieved and // used in the calculations when taking measurements. // Retrieve calibration data from device: char BMP280::readCalibration() { if ( readUInt(0x88, dig_T1) && readInt(0x8A, dig_T2) && readInt(0x8C, dig_T3) && readUInt(0x8E, dig_P1) && readInt(0x90, dig_P2) && readInt(0x92, dig_P3) && readInt(0x94, dig_P4) && readInt(0x96, dig_P5) && readInt(0x98, dig_P6) && readInt(0x9A, dig_P7) && readInt(0x9C, dig_P8) && readInt(0x9E, dig_P9)){ #ifdef _debugSerial Serial.print("dig_T1="); Serial.println(dig_T1,2); Serial.print("dig_T2="); Serial.println(dig_T2,2); Serial.print("dig_T3="); Serial.println(dig_T3,2); Serial.print("dig_P1="); Serial.println(dig_P1,2); Serial.print("dig_P2="); Serial.println(dig_P2,2); Serial.print("dig_P3="); Serial.println(dig_P3,2); Serial.print("dig_P4="); Serial.println(dig_P4,2); Serial.print("dig_P5="); Serial.println(dig_P5,2); Serial.print("dig_P6="); Serial.println(dig_P6,2); Serial.print("dig_P7="); Serial.println(dig_P7,2); Serial.print("dig_P8="); Serial.println(dig_P8,2); Serial.print("dig_P9="); Serial.println(dig_P9,2); #endif #ifdef _debugTestData dig_T1 = 27504.0; dig_T2 = 26435.0; dig_T3 = -1000.0; dig_P1 = 36477.0; dig_P2 = -10685.0; dig_P3 = 3024.0; dig_P4 = 2855.0; dig_P5 = 140.0; dig_P6 = -7.0; dig_P7 = 15500.0; dig_P8 = -14600.0; dig_P9 = 6000.0; Serial.print("dig_T1="); Serial.println(dig_T1,2); Serial.print("dig_T2="); Serial.println(dig_T2,2); Serial.print("dig_T3="); Serial.println(dig_T3,2); Serial.print("dig_P1="); Serial.println(dig_P1,2); Serial.print("dig_P2="); Serial.println(dig_P2,2); Serial.print("dig_P3="); Serial.println(dig_P3,2); Serial.print("dig_P4="); Serial.println(dig_P4,2); Serial.print("dig_P5="); Serial.println(dig_P5,2); Serial.print("dig_P6="); Serial.println(dig_P6,2); Serial.print("dig_P7="); Serial.println(dig_P7,2); Serial.print("dig_P8="); Serial.println(dig_P8,2); Serial.print("dig_P9="); Serial.println(dig_P9,2); #endif return (1); } else return (0); } /* ** Read a signed integer (two bytes) from device ** @param : address = register to start reading (plus subsequent register) ** @param : value = external variable to store data (function modifies value) */ char BMP280::readInt(char address, double &value) { unsigned char data[2]; //char is 4bit,1byte data[0] = address; if (readBytes(data,2)) { value = (double)(int16_t)(((unsigned int)data[1]<<8)|(unsigned int)data[0]); // return(1); } value = 0; return(0); } /* ** Read an unsigned integer (two bytes) from device ** @param : address = register to start reading (plus subsequent register) ** @param : value = external variable to store data (function modifies value) */ char BMP280::readUInt(char address, double &value) { unsigned char data[2]; //4bit data[0] = address; if (readBytes(data,2)) { value = (double)(unsigned int)(((unsigned int)data[1]<<8)|(unsigned int)data[0]); return(1); } value = 0; return(0); } /* ** Read an array of bytes from device ** @param : value = external array to hold data. Put starting register in values[0]. ** @param : length = number of bytes to read */ char BMP280::readBytes(unsigned char *values, char length) { char x; Wire.beginTransmission(BMP280_ADDR); Wire.write(values[0]); error = Wire.endTransmission(); if (error == 0) { Wire.requestFrom(BMP280_ADDR,length); while(Wire.available() != length) ; // wait until bytes are ready for(x=0;x100 || T <-100)return 0; return (1); } /* ** Pressure calculation from uncalibrated pressure value. ** @param : P = stores the pressure value. ** @param : uP = uncalibrated pressure value. */ char BMP280::calcPressure(double &P,double uP) { //char result; double var1 , var2 ; var1 = (t_fine/2.0) - 64000.0; #ifdef _debugSerial Serial.print("var1 = ");Serial.println(var1,2); #endif var2 = var1 * (var1 * dig_P6/32768.0); //not overflow #ifdef _debugSerial Serial.print("var2 = ");Serial.println(var2,2); #endif var2 = var2 + (var1 * dig_P5 * 2.0); //overflow #ifdef _debugSerial Serial.print("var2 = ");Serial.println(var2,2); #endif var2 = (var2/4.0)+((dig_P4)*65536.0); #ifdef _debugSerial Serial.print("var2 = ");Serial.println(var2,2); #endif var1 = (dig_P3 * var1 * var1/524288.0 + dig_P2 * var1) / 524288.0; #ifdef _debugSerial Serial.print("var1 = ");Serial.println(var1,2); #endif var1 = (1.0 + var1/32768.0) * dig_P1; #ifdef _debugSerial Serial.print("var1 = ");Serial.println(var1,2); #endif P = 1048576.0- uP; #ifdef _debugSerial Serial.print("p = ");Serial.println(p,2); #endif P = (P-(var2/4096.0))*6250.0/var1 ; //overflow #ifdef _debugSerial Serial.print("p = ");Serial.println(p,2); #endif var1 = dig_P9*P*P/2147483648.0; //overflow #ifdef _debugSerial Serial.print("var1 = ");Serial.println(var1,2); #endif var2 = P*dig_P8/32768.0; #ifdef _debugSerial Serial.print("var2 = ");Serial.println(var2,2); #endif P = P + (var1+var2+dig_P7)/16.0; #ifdef _debugSerial Serial.print("p = ");Serial.println(p,2); #endif P = P/100.0 ; if(P>1200.0 || P < 800.0)return (0); return (1); } double BMP280::sealevel(double P, double A) // Given a pressure P (mb) taken at a specific altitude (meters), // return the equivalent pressure (mb) at sea level. // This produces pressure readings that can be used for weather measurements. { return(P/pow(1-(A/44330.0),5.255)); } double BMP280::altitude(double P, double P0) // Given a pressure measurement P (mb) and the pressure at a baseline P0 (mb), // return altitude (meters) above baseline. { return(44330.0*(1-pow(P/P0,1/5.255))); } char BMP280::getError(void) // If any library command fails, you can retrieve an extended // error code using this command. Errors are from the wire library: // 0 = Success // 1 = Data too long to fit in transmit buffer // 2 = Received NACK on transmit of address // 3 = Received NACK on transmit of data // 4 = Other error { return(error); }