Proton BASIC Compiler - Bosch BMP280 Pressure Sensor


  • PicŪ Basic


  • Bosch BMP280 Pressure Sensor

    The Bosch BMP280 pressure sensor is, at the time of writing , one of Bosch's newer pressure/temperature sensor offerings. When compared against the BMP180, it offers a higher resolution for both temperature (0.01 degree C) and pressure (0.16 Pa). It is also significantly smaller.

    Given the current pressure as measured by the sensor and a suitable value for the pressure at sea level, it is also possible to calculate altitude. However, please be aware that the calculation of altitude requires a relatively large amount of program memory - approximately 1.5k bytes.

    The code below uses the I2C protocol to communicate with the BMP280 and extract the values necessary to calculate both pressure in pascals and temperature in degrees centigrade.

    Code:
    '****************************************************************
    '*  Name    : BMP280.BAS                                        *
    '*  Author  : Bob Marshall                                      *
    '*  Date    : 08/07/2016                                        *
    '*  Version : 1.1                                               *
    '*  Notes   : This program uses a BMP280 pressure sensor        *
    '*          : to measure current pressure, temperature &        *
    '*          : altitude.                                         *
    '****************************************************************
    
    
      Include "Amicus18_mk2.inc"
    
      Declare Float_Display_Type = Fast
      Declare Hbus_Bitrate 400
    
      Symbol BMP280 = $EC  'BMP280 I2C address
      Symbol CalDatStAd = $88 'Start address for cal. data.
      Symbol BMP280ContReg = $F4 'BMP280 control Register
      Symbol BMP280ConfigReg = $F5 'BMP280 configuration register
      Symbol BMP280DataReg = $F7 'Uncompensated Data start register
    
    'Values of 0-3 acceptable but see data sheet. 3 = Normal Mode
      Symbol PowerMode = 3
    
    'Values of 0-5 acceptable but see data sheet. 5 = 20 bit res.
      Symbol TempRes =  5
    
    'Values of 0-5 acceptable but see data sheet. 5 = 20 bit res.
      Symbol PresRes = 5
    
    'Values of 0-7 acceptable. See data sheet before changing.
      Symbol Filter = 4
    
    'Values of 0-7 acceptable but see data sheet. 4 = 500ms.
      Symbol Standby =  4
    
    
    'Temperature related variables.
      Dim T1 As Word
      Dim T2 As SWord
      Dim T3 As SWord
    
      Dim UT As Word  'Uncompensated temperature
      Dim XLSB_t As Byte
      Dim UTLong As SDword
      Dim Temperature As Float
      Dim T_fine As Float
    
    'Pressure related variables
      Dim P1 As Word
      Dim P2 As SWord
      Dim P3 As SWord
      Dim P4 As SWord
      Dim P5 As SWord
      Dim P6 As SWord
      Dim P7 As SWord
      Dim P8 As SWord
      Dim P9 As SWord
    
      Dim UP As Word 'Uncompensated pressure.
      Dim UPLong As SDword
      Dim XLSB_p As Byte
      Dim P As Float
      
     
    'BMP280 related variables.
      Dim BMP280Config As Byte
      Dim BMP280Control As Byte
    
    'General variables
      Dim var1 As Float
      Dim var2 As Float
      Dim Altitude As Float
    
    
      Main:
    
      DelayMS 1000 'Let things settle down.
      Clear
    
      'Setup BMP280 Control and configuration registers.
      BMP280Config = (Standby <<5) + (Filter <<2) ' Combine configuration bits
      HBusOut BMP280,BMP280ConfigReg,[BMP280Config]
      
      BMP280Control = (TempRes <<5) + (PresRes <<2) + PowerMode ' Combine BMP280Control bits.
      HBusOut BMP280,BMP280ContReg,[BMP280Control]
    
    
    ' Read calibration data
      HBusIn BMP280,CalDatStAd,[T1,T2,T3,P1,P2,P3,P4,P5,P6,P7,P8,P9]
    
      Swap T1.Byte0,T1.Byte1 : Swap T2.Byte0,T2.Byte1 : Swap T3.Byte0,T3.Byte1
      Swap P1.Byte0,P1.Byte1 : Swap P2.Byte0,P2.Byte1 : Swap P3.Byte0,P3.Byte1
      Swap P4.Byte0,P4.Byte1 : Swap P5.Byte0,P5.Byte1 : Swap P6.Byte0,P6.Byte1
      Swap P7.Byte0,P7.Byte1 : Swap P8.Byte0,P8.Byte1 : Swap P9.Byte0,P9.Byte1
    
    
      While      
    'Read the uncompensated temperature and pressure values.      
          HBusIn BMP280,BMP280DataReg,[UP,XLSB_p,UT,XLSB_t]
          UTLong = UT * 16 + (XLSB_t >> 4)
          UPLong = UP * 16 + (XLSB_p >> 4)
          
    ' Test data from the Bosch datasheet. Used to check calculations.
    '         T1=27504  : T2=26435  : T3=-1000
    '         P1=36477  : P2=-10685 : P3=3024
    '         P4=2855   : P5=140    : P6=-7
    '         P7=15500  : P8=-14600 : P9=6000
    '         UTlong=519888 : UPlong=415148
    ' Expected results: Temperature = 25.08, Pressure =  100656.26
    
          var1=(UTLong/16384-T1/1024)*T2
          var2=(UTLong/131072-T1/8192)*(UTLong/131072-T1/8192)*T3
          Temperature=(var1+var2)/5120
          T_fine=(var1+var2)
    
    
    ' $B0 is the hex value for the degree symbol. Not correctly displayed on some terminals.
          HSerOut ["Current temperature is: ",Dec2 Temperature,$B0,"C",13]
    
    ' Pressure calculations start here.
    
            var1=T_fine/2-64000
            var2=var1*var1*P6/32768
            var2=var2+var1*P5 * 2
            var2=(var2/4)+ P4 * 65536
            var1=(P3*var1*var1/524288+P2*var1)/524288
            var1=(1+var1/32768)*P1
            P=1048576-UPLong
            P=(P-var2/4096)*6250/var1
            
    ' The *-1 is needed here to negate the value of var1
    ' See p23 of the Bosch data sheet (example calculation).        
            var1=(P9*P*P/2147483648)*-1
            
            var2=P*P8/32768
            P=P+(var1+var2+P7)/16
    
            HSerOut ["Current pressure: ",Dec2 P,"Pa",13]
    
    
    ' Note: The altitude calculation takes about 1.5k of program memory.
    '     : Remove if not needed!
    
    ' Altitude = 44330*((1-(p/101325)) ^ (1/5.255))
    ' 101325 represents the 'standard' pressure at sea level. Adjust to suit.
    
          var1 = pow((P/101000),0.190295)
          Altitude =  44330 *(1-var1)
          HSerOut ["Current altitude: ",Dec2 Altitude ,"m",13,10,13]
    
          DelayMS 2000
    
      Wend
    
    ' End of program
    As with the BMP180, the BMP280 is sensitive to light. Therefore the sensor is best kept in the dark whilst ensuring it is still possible for the atmosphere to reach it.


    Bob