Search wiring.org.co:

This example is for Wiring version 1.0 build 0100+. If you have a previous version, use the examples included with your software. If you see any errors or have comments, please let us know.

I2C BOSCH BMP085 temperature and barometric pressure sensor based on code by Jean-Claude Wippler and Interactive Matter
Demonstrates use of the Wire library reading data from the BOSCH BMP085 temperature and barometric pressure sensor On Wiring v1 boards the SCL and SDA pins are: 0 and 1 On Wiring S board the SCL and SDA pins are: 8 and 9

    #include <Wire.h>

    // From the datasheet the BMP module address LSB distinguishes
    // between read (1) and write (0) operations, corresponding to
    // address 0xEF (read) and 0xEE (write).
    // shift the address 1 bit right (0xEF or 0xEE), the Wire library only needs the 7
    // most significant bits for the address 0xEF >> 1 = 0x77
    // 0xEE >> 1 = 0x77

    int I2C_ADDRESS = 0x77;  // sensor address

    // oversampling setting
    // 0 = ultra low power
    // 1 = standard
    // 2 = high
    // 3 = ultra high resolution
    const unsigned char oversampling_setting = 3; //oversampling for measurement
    const unsigned char pressure_conversiontime[4] = {
      5, 8, 14, 26 };  // delays for oversampling settings 0, 1, 2 and 3

    // sensor registers from the BOSCH BMP085 datasheet
    int ac1;
    int ac2;
    int ac3;
    unsigned int ac4;
    unsigned int ac5;
    unsigned int ac6;
    int b1;
    int b2;
    int mb;
    int mc;
    int md;

    // variables to keep the values
    int temperature = 0;
    long pressure = 0;

    void setup()
    {
      Serial.begin(9600);
      Wire.begin();
      getCalibrationData();
    }

    void loop()
    {
      readSensor();
      Serial.print("Temperature: ");
      Serial.print(temperature,DEC);
      Serial.print(" Pressure: ");
      Serial.println(pressure,DEC);
      delay(100);
    }

    // Below there are the utility functions to get data from the sensor.

    // read temperature and pressure from sensor
    void readSensor() {
      int  ut= readUT();
      long up = readUP();
      long x1, x2, x3, b3, b5, b6, p;
      unsigned long b4, b7;

      //calculate true temperature
      x1 = ((long)ut - ac6) * ac5 >> 15;
      x2 = ((long) mc << 11) / (x1 + md);
      b5 = x1 + x2;
      temperature = (b5 + 8) >> 4;

      //calculate true pressure
      b6 = b5 - 4000;
      x1 = (b2 * (b6 * b6 >> 12)) >> 11;
      x2 = ac2 * b6 >> 11;
      x3 = x1 + x2;
      b3 = (((int32_t) ac1 * 4 + x3)<<oversampling_setting + 2) >> 2;
      x1 = ac3 * b6 >> 13;
      x2 = (b1 * (b6 * b6 >> 12)) >> 16;
      x3 = ((x1 + x2) + 2) >> 2;
      b4 = (ac4 * (uint32_t) (x3 + 32768)) >> 15;
      b7 = ((uint32_t) up - b3) * (50000 >> oversampling_setting);
      p = b7 < 0x80000000 ? (b7 * 2) / b4 : (b7 / b4) * 2;

      x1 = (p >> 8) * (p >> 8);
      x1 = (x1 * 3038) >> 16;
      x2 = (-7357 * p) >> 16;
      pressure = p + ((x1 + x2 + 3791) >> 4);
    }

    // read uncompensated temperature value
    unsigned int readUT() {
      writeRegister(0xf4,0x2e);
      delay(5); // the datasheet suggests 4.5 ms
      return readIntRegister(0xf6);
    }

    // read uncompensated pressure value
    long readUP() {
      writeRegister(0xf4,0x34+(oversampling_setting<<6));
      delay(pressure_conversiontime[oversampling_setting]);

      unsigned char msb, lsb, xlsb;
      Wire.beginTransmission(I2C_ADDRESS);
      Wire.write(0xf6);  // register to read
      Wire.endTransmission();

      Wire.requestFrom(I2C_ADDRESS, 3); // request three bytes
      while(!Wire.available()); // wait until data available
      msb = Wire.read();
      while(!Wire.available()); // wait until data available
      lsb |= Wire.read();
      while(!Wire.available()); // wait until data available
      xlsb |= Wire.read();
      return (((long)msb<<16) | ((long)lsb<<8) | ((long)xlsb)) >>(8-oversampling_setting);
    }

    void  getCalibrationData() {
      Serial.println("Reading Calibration Data");
      ac1 = readIntRegister(0xAA);
      Serial.print("AC1: ");
      Serial.println(ac1,DEC);
      ac2 = readIntRegister(0xAC);
      Serial.print("AC2: ");
      Serial.println(ac2,DEC);
      ac3 = readIntRegister(0xAE);
      Serial.print("AC3: ");
      Serial.println(ac3,DEC);
      ac4 = readIntRegister(0xB0);
      Serial.print("AC4: ");
      Serial.println(ac4,DEC);
      ac5 = readIntRegister(0xB2);
      Serial.print("AC5: ");
      Serial.println(ac5,DEC);
      ac6 = readIntRegister(0xB4);
      Serial.print("AC6: ");
      Serial.println(ac6,DEC);
      b1 = readIntRegister(0xB6);
      Serial.print("B1: ");
      Serial.println(b1,DEC);
      b2 = readIntRegister(0xB8);
      Serial.print("B2: ");
      Serial.println(b1,DEC);
      mb = readIntRegister(0xBA);
      Serial.print("MB: ");
      Serial.println(mb,DEC);
      mc = readIntRegister(0xBC);
      Serial.print("MC: ");
      Serial.println(mc,DEC);
      md = readIntRegister(0xBE);
      Serial.print("MD: ");
      Serial.println(md,DEC);
    }

    void writeRegister(unsigned char r, unsigned char v)
    {
      Wire.beginTransmission(I2C_ADDRESS);
      Wire.write(r);
      Wire.write(v);
      Wire.endTransmission();
    }

    // read a 16 bit register
    int readIntRegister(unsigned char r)
    {
      unsigned char msb, lsb;
      Wire.beginTransmission(I2C_ADDRESS);
      Wire.write(r);  // register to read
      Wire.endTransmission();

      Wire.requestFrom(I2C_ADDRESS, 2); // request two bytes
      while(!Wire.available()); // wait until data available
      msb = Wire.read();
      while(!Wire.available()); // wait until data available
      lsb = Wire.read();
      return (((int)msb<<8) | ((int)lsb));
    }

    // read an 8 bit register
    /*
    unsigned char readRegister(unsigned char r)
    {
      unsigned char v;
      Wire.beginTransmission(I2C_ADDRESS);
      Wire.send(r);  // register to read
      Wire.endTransmission();

      Wire.requestFrom(I2C_ADDRESS, 1); // request a byte
      while(!Wire.available()); // wait until data available
      v = Wire.receive();
      return v;
    }
    */