BMP180 is a nice tiny sensor which can give the values of
- Atmospheric Pressure
- Temperature
- Altitude
In this video, we’ll see how we can interface Raspberry pi with BMP180 and how to write python code for the same.
In order to follow this video you’ll need
- Raspberry Pi 2/3/4 with Raspbian OS Installed on it
- BMP180 Sensor
- Female to Female Wire connectors
For setting up the raspberry pi and start using it, you can follow this post.
How to interface I2C Sensor with Raspberry Pi
Python Program to interface raspberry pi with BMP180.
The video shows about 2 different programs one is the library package and other is testing code. Make sure while testing out, both the programs stay in the same folder.
Here are the 2 programs
Python Program for BMP180 Sensor Part 1
# make sure to install python-smbus using below command # sudo apt-get install python-smbus import smbus import time from ctypes import c_short DEVICE = 0x77 # Default device I2C address #bus = smbus.SMBus(0) # Rev 1 Pi uses 0 bus = smbus.SMBus(1) # Rev 2 Pi uses 1 def convertToString(data): # Simple function to convert binary data into # a string return str((data[1] + (256 * data[0])) / 1.2) def getShort(data, index): # return two bytes from data as a signed 16-bit value return c_short((data[index] << 8) + data[index + 1]).value def getUshort(data, index): # return two bytes from data as an unsigned 16-bit value return (data[index] << 8) + data[index + 1] def readBmp180Id(addr=DEVICE): # Chip ID Register Address REG_ID = 0xD0 (chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2) return (chip_id, chip_version) def readBmp180(addr=0x77): # Register Addresses REG_CALIB = 0xAA REG_MEAS = 0xF4 REG_MSB = 0xF6 REG_LSB = 0xF7 # Control Register Address CRV_TEMP = 0x2E CRV_PRES = 0x34 # Oversample setting OVERSAMPLE = 3 # 0 - 3 # Read calibration data # Read calibration data from EEPROM cal = bus.read_i2c_block_data(addr, REG_CALIB, 22) # Convert byte data to word values AC1 = getShort(cal, 0) AC2 = getShort(cal, 2) AC3 = getShort(cal, 4) AC4 = getUshort(cal, 6) AC5 = getUshort(cal, 8) AC6 = getUshort(cal, 10) B1 = getShort(cal, 12) B2 = getShort(cal, 14) MB = getShort(cal, 16) MC = getShort(cal, 18) MD = getShort(cal, 20) # Read temperature bus.write_byte_data(addr, REG_MEAS, CRV_TEMP) time.sleep(0.005) (msb, lsb) = bus.read_i2c_block_data(addr, REG_MSB, 2) UT = (msb << 8) + lsb # Read pressure bus.write_byte_data(addr, REG_MEAS, CRV_PRES + (OVERSAMPLE << 6)) time.sleep(0.04) (msb, lsb, xsb) = bus.read_i2c_block_data(addr, REG_MSB, 3) UP = ((msb << 16) + (lsb << 8) + xsb) >> (8 - OVERSAMPLE) # Refine temperature X1 = ((UT - AC6) * AC5) >> 15 X2 = (MC << 11) / (X1 + MD) B5 = X1 + X2 temperature = int(B5 + 8) >> 4 temperature = temperature / 10.0 # Refine pressure B6 = B5 - 4000 B62 = int(B6 * B6) >> 12 X1 = (B2 * B62) >> 11 X2 = int(AC2 * B6) >> 11 X3 = X1 + X2 B3 = (((AC1 * 4 + X3) << OVERSAMPLE) + 2) >> 2 X1 = int(AC3 * B6) >> 13 X2 = (B1 * B62) >> 16 X3 = ((X1 + X2) + 2) >> 2 B4 = (AC4 * (X3 + 32768)) >> 15 B7 = (UP - B3) * (50000 >> OVERSAMPLE) P = (B7 * 2) / B4 X1 = (int(P) >> 8) * (int(P) >> 8) X1 = (X1 * 3038) >> 16 X2 = int(-7357 * P) >> 16 pressure = int(P + ((X1 + X2 + 3791) >> 4)) #pressure = float(pressure / 100.0) altitude = 44330.0 * (1.0 - pow(pressure / 101325.0, (1.0/5.255))) altitude = round(altitude,2) return (temperature,pressure,altitude)
Python Program for BMP180 Sensor Part 2
import bmpsensor import time while True: temp, pressure, altitude = bmpsensor.readBmp180() print("Temperature is ",temp) # degC print("Pressure is ",pressure) # Pressure in Pa print("Altitude is ",altitude) # Altitude in meters print("\n") time.sleep(2)
If you face any issues with the code or working or explanation, feel free to comment about it!!