Skip to content

Instantly share code, notes, and snippets.

@pvazteixeira
Created June 18, 2018 22:07
Show Gist options
  • Save pvazteixeira/744ed858b56115f3bff63da6dc5f0047 to your computer and use it in GitHub Desktop.
Save pvazteixeira/744ed858b56115f3bff63da6dc5f0047 to your computer and use it in GitHub Desktop.
bmp280.py
#coding: utf-8
import Adafruit_GPIO.I2C as I2C
import time
i2c = I2C
device=i2c.get_i2c_device(0x77) # address of BMP
# this value is necessary to calculate the correct height above sealevel
# its also included in airport wheather information ATIS named as QNH
# unit is hPa
QNH=1020
print("QNH:{:.0f}".format(QNH)+" hPA")
# power mode
# POWER_MODE=0 # sleep mode
# POWER_MODE=1 # forced mode
# POWER_MODE=2 # forced mode
POWER_MODE=3 # normal mode
# temperature resolution
# OSRS_T = 0 # skipped
# OSRS_T = 1 # 16 Bit
# OSRS_T = 2 # 17 Bit
# OSRS_T = 3 # 18 Bit
# OSRS_T = 4 # 19 Bit
OSRS_T = 5 # 20 Bit
# pressure resolution
# OSRS_P = 0 # pressure measurement skipped
# OSRS_P = 1 # 16 Bit ultra low power
# OSRS_P = 2 # 17 Bit low power
# OSRS_P = 3 # 18 Bit standard resolution
# OSRS_P = 4 # 19 Bit high resolution
OSRS_P = 5 # 20 Bit ultra high resolution
# filter settings
# FILTER = 0 #
# FILTER = 1 #
# FILTER = 2 #
# FILTER = 3 #
FILTER = 4 #
# FILTER = 5 #
# FILTER = 6 #
# FILTER = 7 #
# standby settings
# T_SB = 0 # 000 0,5ms
# T_SB = 1 # 001 62.5 ms
# T_SB = 2 # 010 125 ms
# T_SB = 3 # 011 250ms
T_SB = 4 # 100 500ms
# T_SB = 5 # 101 1000ms
# T_SB = 6 # 110 2000ms
# T_SB = 7 # 111 4000ms
CONFIG = (T_SB <<5) + (FILTER <<2) # combine bits for config
CTRL_MEAS = (OSRS_T <<5) + (OSRS_P <<2) + POWER_MODE # combine bits for ctrl_meas
# print ("CONFIG:",CONFIG)
# print ("CTRL_MEAS:",CTRL_MEAS)
BMP280_REGISTER_DIG_T1 = 0x88
BMP280_REGISTER_DIG_T2 = 0x8A
BMP280_REGISTER_DIG_T3 = 0x8C
BMP280_REGISTER_DIG_P1 = 0x8E
BMP280_REGISTER_DIG_P2 = 0x90
BMP280_REGISTER_DIG_P3 = 0x92
BMP280_REGISTER_DIG_P4 = 0x94
BMP280_REGISTER_DIG_P5 = 0x96
BMP280_REGISTER_DIG_P6 = 0x98
BMP280_REGISTER_DIG_P7 = 0x9A
BMP280_REGISTER_DIG_P8 = 0x9C
BMP280_REGISTER_DIG_P9 = 0x9E
BMP280_REGISTER_CHIPID = 0xD0
BMP280_REGISTER_VERSION = 0xD1
BMP280_REGISTER_SOFTRESET = 0xE0
BMP280_REGISTER_CONTROL = 0xF4
BMP280_REGISTER_CONFIG = 0xF5
BMP280_REGISTER_STATUS = 0xF3
BMP280_REGISTER_TEMPDATA_MSB = 0xFA
BMP280_REGISTER_TEMPDATA_LSB = 0xFB
BMP280_REGISTER_TEMPDATA_XLSB = 0xFC
BMP280_REGISTER_PRESSDATA_MSB = 0xF7
BMP280_REGISTER_PRESSDATA_LSB = 0xF8
BMP280_REGISTER_PRESSDATA_XLSB = 0xF9
if (device.readS8(BMP280_REGISTER_CHIPID) == 0x58): # check sensor id 0x58=BMP280
device.write8(BMP280_REGISTER_SOFTRESET,0xB6) # reset sensor
time.sleep(0.2) # little break
device.write8(BMP280_REGISTER_CONTROL,CTRL_MEAS) #
time.sleep(0.2) # little break
device.write8(BMP280_REGISTER_CONFIG,CONFIG) #
time.sleep(0.2)
# register_control = device.readU8(BMP280_REGISTER_CONTROL) # check the controll register again
# register_config = device.readU8(BMP280_REGISTER_CONFIG)# check the controll register again
# print("config:",register_config)
# print("control:",register_control)
dig_T1 = device.readU16LE(BMP280_REGISTER_DIG_T1) # read correction settings
dig_T2 = device.readS16LE(BMP280_REGISTER_DIG_T2)
dig_T3 = device.readS16LE(BMP280_REGISTER_DIG_T3)
dig_P1 = device.readU16LE(BMP280_REGISTER_DIG_P1)
dig_P2 = device.readS16LE(BMP280_REGISTER_DIG_P2)
dig_P3 = device.readS16LE(BMP280_REGISTER_DIG_P3)
dig_P4 = device.readS16LE(BMP280_REGISTER_DIG_P4)
dig_P5 = device.readS16LE(BMP280_REGISTER_DIG_P5)
dig_P6 = device.readS16LE(BMP280_REGISTER_DIG_P6)
dig_P7 = device.readS16LE(BMP280_REGISTER_DIG_P7)
dig_P8 = device.readS16LE(BMP280_REGISTER_DIG_P8)
dig_P9 = device.readS16LE(BMP280_REGISTER_DIG_P9)
#print("dig_T1:",dig_T1," dig_T2:",dig_T2," dig_T3:",dig_T3)
#print("dig_P1:",dig_P1," dig_P2:",dig_P2," dig_P3:",dig_P3)
#print(" dig_P4:",dig_P4," dig_P5:",dig_P5," dig_P6:",dig_P6)
#print(" dig_P7:",dig_P7," dig_P8:",dig_P8," dig_P9:",dig_P9)
while True: # loop
raw_temp_msb=device.readU8(BMP280_REGISTER_TEMPDATA_MSB) # read raw temperature msb
raw_temp_lsb=device.readU8(BMP280_REGISTER_TEMPDATA_LSB) # read raw temperature lsb
raw_temp_xlsb=device.readU8(BMP280_REGISTER_TEMPDATA_XLSB) # read raw temperature xlsb
raw_press_msb=device.readU8(BMP280_REGISTER_PRESSDATA_MSB) # read raw pressure msb
raw_press_lsb=device.readU8(BMP280_REGISTER_PRESSDATA_LSB) # read raw pressure lsb
raw_press_xlsb=device.readU8(BMP280_REGISTER_PRESSDATA_XLSB) # read raw pressure xlsb
raw_temp=(raw_temp_msb <<12)+(raw_temp_lsb<<4)+(raw_temp_xlsb>>4) # combine 3 bytes msb 12 bits left, lsb 4 bits left, xlsb 4 bits right
raw_press=(raw_press_msb <<12)+(raw_press_lsb <<4)+(raw_press_xlsb >>4) # combine 3 bytes msb 12 bits left, lsb 4 bits left, xlsb 4 bits right
# print("raw_press_msb:",raw_press_msb," raw_press_lsb:",raw_press_xlsb," raw_press_xlsb:",raw_press_xlsb)
# print("raw_temp_msb:",raw_temp_msb," raw_temp_lsb:",raw_temp_lsb," raw_temp_xlsb:",raw_temp_xlsb)
# print("raw_press",raw_press)
# the following values are from the calculation example in the datasheet
# this values can be used to check the calculation formulas
# dig_T1=27504
# dig_T2=26435
# dig_T3=-1000
# dig_P1=36477
# dig_P2=-10685
# dig_P3=3024
# dig_P4=2855
# dig_P5=140
# dig_P6=-7
# dig_P7=15500
# dig_P8=-14600
# dig_P9=6000
# t_fine=128422.2869948
# raw_temp=519888
# raw_press=415148
var1=(raw_temp/16384.0-dig_T1/1024.0)*dig_T2 # formula for temperature from datasheet
var2=(raw_temp/131072.0-dig_T1/8192.0)*(raw_temp/131072.0-dig_T1/8192.0)*dig_T3 # formula for temperature from datasheet
temp=(var1+var2)/5120.0 # formula for temperature from datasheet
t_fine=(var1+var2) # need for pressure calculation
var1=t_fine/2.0-64000.0 # formula for pressure from datasheet
var2=var1*var1*dig_P6/32768.0 # formula for pressure from datasheet
var2=var2+var1*dig_P5*2 # formula for pressure from datasheet
var2=var2/4.0+dig_P4*65536.0 # formula for pressure from datasheet
var1=(dig_P3*var1*var1/524288.0+dig_P2*var1)/524288.0 # formula for pressure from datasheet
var1=(1.0+var1/32768.0)*dig_P1 # formula for pressure from datasheet
press=1048576.0-raw_press # formula for pressure from datasheet
press=(press-var2/4096.0)*6250.0/var1 # formula for pressure from datasheet
var1=dig_P9*press*press/2147483648.0 # formula for pressure from datasheet
var2=press*dig_P8/32768.0 # formula for pressure from datasheet
press=press+(var1+var2+dig_P7)/16.0 # formula for pressure from datasheet
altitude= 44330.0 * (1.0 - pow(press / (QNH*100), (1.0/5.255))) # formula for altitude from airpressure
print("temperature:{:.2f}".format(temp)+" C pressure:{:.2f}".format(press/100)+" hPa altitude:{:.2f}".format(altitude)+" m")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment