Raspberry Pi reading BMP085 Temperature & Pressure

Another fun little i2c device acquired cheaply via eBay.  It reads barometric pressure and temperature.  There’s some relatively simple maths to convert the outputs to something readable.

Once again, ADAFruit provide a fantastic guide and library for using the device in their Using the BMP085 with Raspberry Pi.  As in previous posts, I could have just used the ADAFruit library out of the box.  Whilst I do not feel the need to re-invent the wheel and re-code from scratch, I do like to have an understanding how it works.

Raspberry Pi reading BMP085 Temperature & PressureI drew the information from a couple of other sources:

Below is the very simple schematic for connecting the device to the Pi.

importsmbus
importtime
classBMP085():
    OSS =3
    def__init__(self, i2c, address):
        self.i2c =i2c
        self.address =address
        self.ac1 =self.readSignedWord(0xaa)
        self.ac2 =self.readSignedWord(0xac)
        self.ac3 =self.readSignedWord(0xae)
        self.ac4 =self.readWord(0xb0)
        self.ac5 =self.readWord(0xb2)
        self.ac6 =self.readWord(0xb4)
        self.b1 =self.readSignedWord(0xb6)
        self.b2 =self.readSignedWord(0xb8)
        self.mb =self.readSignedWord(0xba)
        self.mc =self.readSignedWord(0xbc)
        self.md =self.readSignedWord(0xbe)
    defreadWord(self, reg):
        msb =self.i2c.read_byte_data(self.address, reg)
        lsb =self.i2c.read_byte_data(self.address, reg+1)
        value =(msb << 8) +lsb         returnvalue     defreadSignedWord(self, reg):         msb =self.i2c.read_byte_data(self.address, reg)         lsb =self.i2c.read_byte_data(self.address, reg+1)         if(msb > 127):
          msb =msb -256
        value =(msb << 8) +lsb         returnvalue     defreadUT(self):         self.i2c.write_byte_data(self.address, 0xf4, 0x2e)         time.sleep(0.0045)         ut =self.readWord(0xf6)         returnut     defreadTemperature(self):         ut =self.readUT()         x1 =((ut -self.ac6) *self.ac5) >> 15
        x2 =(self.mc << 11) /(x1 +self.md)         self.b5 =x1 +x2         return((self.b5 +8) >> 4) /10.0
    defreadUP(self):
        self.i2c.write_byte_data(self.address, 0xf4, 0x34+(self.OSS << 6))
        delay =(2+(3<< self.OSS)) /1000.0
        time.sleep(delay)
        msb =self.i2c.read_byte_data(self.address, 0xf6)
        lsb =self.i2c.read_byte_data(self.address, 0xf7)
        xlsb =self.i2c.read_byte_data(self.address, 0xf8)
        up =(msb << 16) +(lsb << 8) +xlsb         up =up >> (8-self.OSS)
Raspberry Pi reading BMP085 Temperature & Pressure schematic        returnup
    defreadPressure(self):
        up =self.readUP()
        b6 =self.b5 -4000
        x1 =(self.b2 *(b6 *b6)>>12)>>11
        x2 =(self.ac2 *b6)>>11
        x3 =x1 +x2
        b3 =(((self.ac1 *4+x3)<>2
        x1 =(self.ac3 *b6)>>13
        x2 =(self.b1 *((b6 *b6)>>12))>>16
        x3 =((x1 +x2) +2)>>2
        b4 =(self.ac4 *(x3 +32768))>>15
        b7 =(up -b3) *(50000>>self.OSS)
        if(b7 < 0x80000000):
            p =(b7<<1)/b4
        else:
            p =(b7/b4)<>8) *(p>>8)
        x1 =(x1 *3038)>>16
        x2 =(-7357*p)>>16
        p +=(x1 +x2 +3791)>>4
        returnp
i2c =smbus.SMBus(0)
bmp085 =BMP085(i2c, 0x77)
t =bmp085.readTemperature()
p =bmp085.readPressure()
print"Temperature: %.2f C"%t
print"Pressure:    %.2f hPa"%(p /100)

About The Author

Ibrar Ayyub

I am an experienced technical writer holding a Master's degree in computer science from BZU Multan, Pakistan University. With a background spanning various industries, particularly in home automation and engineering, I have honed my skills in crafting clear and concise content. Proficient in leveraging infographics and diagrams, I strive to simplify complex concepts for readers. My strength lies in thorough research and presenting information in a structured and logical format.

Follow Us:
LinkedinTwitter

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top