Bhavin Darji / BMP280

Fork of BMP280 by Edwin Cho

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BMP280.h Source File

BMP280.h

Go to the documentation of this file.
00001 /******************************************************************//**
00002 * @file     BMP280.h
00003 * @brief    Contains all I2C based BMP280 Pressure sensor declarations
00004 * @version  1.0
00005 * @date     26. May. 2016
00006 * @author   Bhavin.Edutech Learning Solutions
00007 **********************************************************************/
00008 
00009 #include "mbed.h"
00010 
00011 /** I2C ADDRESS DEFINITIONS  **/
00012 /************************************************/
00013 /**\name  CHIP ID DEFINITION       */
00014 /***********************************************/
00015 #define BMP280_CHIP_ID1   (0x56)
00016 #define BMP280_CHIP_ID2   (0x57)
00017 #define BMP280_CHIP_ID3   (0x58)
00018 /************************************************/
00019 /**\name  I2C ADDRESS DEFINITION       */
00020 /***********************************************/
00021 #define BMP280_I2C_ADDRESS1                  (0x76<<1)
00022 #define BMP280_I2C_ADDRESS2                  (0x77<<1)
00023 /************************************************/
00024 /**\name  POWER MODE DEFINITION       */
00025 /***********************************************/
00026 /* Sensor Specific constants */
00027 #define BMP280_SOFT_RESET_CODE               (0xB6)
00028 
00029 /************************************************/
00030 /**\name  OVERSAMPLING DEFINITION       */
00031 /***********************************************/
00032 #define BMP280_OVERSAMP_SKIPPED          (0x00)
00033 #define BMP280_OVERSAMP_1X               (0x01)
00034 #define BMP280_OVERSAMP_2X               (0x02)
00035 #define BMP280_OVERSAMP_4X               (0x03)
00036 #define BMP280_OVERSAMP_8X               (0x04)
00037 #define BMP280_OVERSAMP_16X              (0x05)
00038 /************************************************/
00039 /**\name  WORKING MODE DEFINITION       */
00040 /***********************************************/
00041 #define BMP280_ULTRA_LOW_POWER_MODE          (0x00)
00042 #define BMP280_LOW_POWER_MODE              (0x01)
00043 #define BMP280_STANDARD_RESOLUTION_MODE      (0x02)
00044 #define BMP280_HIGH_RESOLUTION_MODE          (0x03)
00045 #define BMP280_ULTRA_HIGH_RESOLUTION_MODE    (0x04)
00046 
00047 #define BMP280_ULTRALOWPOWER_OVERSAMP_PRESSURE          BMP280_OVERSAMP_1X
00048 #define BMP280_ULTRALOWPOWER_OVERSAMP_TEMPERATURE       BMP280_OVERSAMP_1X
00049 
00050 #define BMP280_LOWPOWER_OVERSAMP_PRESSURE          BMP280_OVERSAMP_2X
00051 #define BMP280_LOWPOWER_OVERSAMP_TEMPERATURE           BMP280_OVERSAMP_1X
00052 
00053 #define BMP280_STANDARDRESOLUTION_OVERSAMP_PRESSURE     BMP280_OVERSAMP_4X
00054 #define BMP280_STANDARDRESOLUTION_OVERSAMP_TEMPERATURE  BMP280_OVERSAMP_1X
00055 
00056 #define BMP280_HIGHRESOLUTION_OVERSAMP_PRESSURE         BMP280_OVERSAMP_8X
00057 #define BMP280_HIGHRESOLUTION_OVERSAMP_TEMPERATURE      BMP280_OVERSAMP_1X
00058 
00059 #define BMP280_ULTRAHIGHRESOLUTION_OVERSAMP_PRESSURE       BMP280_OVERSAMP_16X
00060 #define BMP280_ULTRAHIGHRESOLUTION_OVERSAMP_TEMPERATURE    BMP280_OVERSAMP_2X
00061 
00062 
00063 /************************************************/
00064 /**\name  CALIBRATION PARAMETERS DEFINITION       */
00065 /***********************************************/
00066 /*calibration parameters */
00067 #define BMP280_TEMPERATURE_CALIB_DIG_T1_LSB_REG             (0x88)
00068 #define BMP280_TEMPERATURE_CALIB_DIG_T1_MSB_REG             (0x89)
00069 #define BMP280_TEMPERATURE_CALIB_DIG_T2_LSB_REG             (0x8A)
00070 #define BMP280_TEMPERATURE_CALIB_DIG_T2_MSB_REG             (0x8B)
00071 #define BMP280_TEMPERATURE_CALIB_DIG_T3_LSB_REG             (0x8C)
00072 #define BMP280_TEMPERATURE_CALIB_DIG_T3_MSB_REG             (0x8D)
00073 #define BMP280_PRESSURE_CALIB_DIG_P1_LSB_REG                (0x8E)
00074 #define BMP280_PRESSURE_CALIB_DIG_P1_MSB_REG                (0x8F)
00075 #define BMP280_PRESSURE_CALIB_DIG_P2_LSB_REG                (0x90)
00076 #define BMP280_PRESSURE_CALIB_DIG_P2_MSB_REG                (0x91)
00077 #define BMP280_PRESSURE_CALIB_DIG_P3_LSB_REG                (0x92)
00078 #define BMP280_PRESSURE_CALIB_DIG_P3_MSB_REG                (0x93)
00079 #define BMP280_PRESSURE_CALIB_DIG_P4_LSB_REG                (0x94)
00080 #define BMP280_PRESSURE_CALIB_DIG_P4_MSB_REG                (0x95)
00081 #define BMP280_PRESSURE_CALIB_DIG_P5_LSB_REG                (0x96)
00082 #define BMP280_PRESSURE_CALIB_DIG_P5_MSB_REG                (0x97)
00083 #define BMP280_PRESSURE_CALIB_DIG_P6_LSB_REG                (0x98)
00084 #define BMP280_PRESSURE_CALIB_DIG_P6_MSB_REG                (0x99)
00085 #define BMP280_PRESSURE_CALIB_DIG_P7_LSB_REG                (0x9A)
00086 #define BMP280_PRESSURE_CALIB_DIG_P7_MSB_REG                (0x9B)
00087 #define BMP280_PRESSURE_CALIB_DIG_P8_LSB_REG                (0x9C)
00088 #define BMP280_PRESSURE_CALIB_DIG_P8_MSB_REG                (0x9D)
00089 #define BMP280_PRESSURE_CALIB_DIG_P9_LSB_REG                (0x9E)
00090 #define BMP280_PRESSURE_CALIB_DIG_P9_MSB_REG                (0x9F)
00091 /************************************************/
00092 /**\name  REGISTER ADDRESS DEFINITION       */
00093 /***********************************************/
00094 #define BMP280_CHIP_ID_REG                   (0xD0)  /*Chip ID Register */
00095 #define BMP280_RST_REG                       (0xE0) /*Softreset Register */
00096 #define BMP280_STAT_REG                      (0xF3)  /*Status Register */
00097 #define BMP280_CTRL_MEAS_REG                 (0xF4)  /*Ctrl Measure Register */
00098 #define BMP280_CONFIG_REG                    (0xF5)  /*Configuration Register */
00099 #define BMP280_PRESSURE_MSB_REG              (0xF7)  /*Pressure MSB Register */
00100 #define BMP280_PRESSURE_LSB_REG              (0xF8)  /*Pressure LSB Register */
00101 #define BMP280_PRESSURE_XLSB_REG             (0xF9)  /*Pressure XLSB Register */
00102 #define BMP280_TEMPERATURE_MSB_REG           (0xFA)  /*Temperature MSB Reg */
00103 #define BMP280_TEMPERATURE_LSB_REG           (0xFB)  /*Temperature LSB Reg */
00104 #define BMP280_TEMPERATURE_XLSB_REG          (0xFC)  /*Temperature XLSB Reg */
00105 /************************************************/
00106 /**\name  BIT LENGTH,POSITION AND MASK DEFINITION      */
00107 /***********************************************/
00108 /* Status Register */
00109 #define BMP280_STATUS_REG_MEASURING__POS           (3)
00110 #define BMP280_STATUS_REG_MEASURING__MSK           (0x08)
00111 #define BMP280_STATUS_REG_MEASURING__LEN           (1)
00112 #define BMP280_STATUS_REG_MEASURING__REG           (BMP280_STAT_REG)
00113 
00114 #define BMP280_STATUS_REG_IM_UPDATE__POS            (0)
00115 #define BMP280_STATUS_REG_IM_UPDATE__MSK            (0x01)
00116 #define BMP280_STATUS_REG_IM_UPDATE__LEN            (1)
00117 #define BMP280_STATUS_REG_IM_UPDATE__REG           (BMP280_STAT_REG)
00118 /************************************************/
00119 /**\name  BIT LENGTH,POSITION AND MASK DEFINITION
00120 FOR TEMPERATURE OVERSAMPLING */
00121 /***********************************************/
00122 /* Control Measurement Register */
00123 #define BMP280_CTRL_MEAS_REG_OVERSAMP_TEMPERATURE__POS             (5)
00124 #define BMP280_CTRL_MEAS_REG_OVERSAMP_TEMPERATURE__MSK             (0xE0)
00125 #define BMP280_CTRL_MEAS_REG_OVERSAMP_TEMPERATURE__LEN             (3)
00126 #define BMP280_CTRL_MEAS_REG_OVERSAMP_TEMPERATURE__REG             \
00127 (BMP280_CTRL_MEAS_REG)
00128 /************************************************/
00129 /**\name  BIT LENGTH,POSITION AND MASK DEFINITION
00130 FOR PRESSURE OVERSAMPLING */
00131 /***********************************************/
00132 #define BMP280_CTRL_MEAS_REG_OVERSAMP_PRESSURE__POS             (2)
00133 #define BMP280_CTRL_MEAS_REG_OVERSAMP_PRESSURE__MSK             (0x1C)
00134 #define BMP280_CTRL_MEAS_REG_OVERSAMP_PRESSURE__LEN             (3)
00135 #define BMP280_CTRL_MEAS_REG_OVERSAMP_PRESSURE__REG             \
00136 (BMP280_CTRL_MEAS_REG)
00137 /************************************************/
00138 /**\name  BIT LENGTH,POSITION AND MASK DEFINITION
00139 FOR POWER MODE */
00140 /***********************************************/
00141 #define BMP280_CTRL_MEAS_REG_POWER_MODE__POS              (0)
00142 #define BMP280_CTRL_MEAS_REG_POWER_MODE__MSK              (0x03)
00143 #define BMP280_CTRL_MEAS_REG_POWER_MODE__LEN              (2)
00144 #define BMP280_CTRL_MEAS_REG_POWER_MODE__REG             (BMP280_CTRL_MEAS_REG)
00145 /************************************************/
00146 /**\name  BIT LENGTH,POSITION AND MASK DEFINITION
00147 FOR STANDBY DURATION */
00148 /***********************************************/
00149 /* Configuration Register */
00150 #define BMP280_CONFIG_REG_STANDBY_DURN__POS                 (5)
00151 #define BMP280_CONFIG_REG_STANDBY_DURN__MSK                 (0xE0)
00152 #define BMP280_CONFIG_REG_STANDBY_DURN__LEN                 (3)
00153 #define BMP280_CONFIG_REG_STANDBY_DURN__REG                 (BMP280_CONFIG_REG)
00154 /************************************************/
00155 /**\name  BIT LENGTH,POSITION AND MASK DEFINITION
00156 FOR IIR FILTER */
00157 /***********************************************/
00158 #define BMP280_CONFIG_REG_FILTER__POS              (2)
00159 #define BMP280_CONFIG_REG_FILTER__MSK              (0x1C)
00160 #define BMP280_CONFIG_REG_FILTER__LEN              (3)
00161 #define BMP280_CONFIG_REG_FILTER__REG              (BMP280_CONFIG_REG)
00162 /************************************************/
00163 /**\name  BIT LENGTH,POSITION AND MASK DEFINITION
00164 FOR SPI ENABLE*/
00165 /***********************************************/
00166 #define BMP280_CONFIG_REG_SPI3_ENABLE__POS             (0)
00167 #define BMP280_CONFIG_REG_SPI3_ENABLE__MSK             (0x01)
00168 #define BMP280_CONFIG_REG_SPI3_ENABLE__LEN             (1)
00169 #define BMP280_CONFIG_REG_SPI3_ENABLE__REG             (BMP280_CONFIG_REG)
00170 /************************************************/
00171 /**\name  BIT LENGTH,POSITION AND MASK DEFINITION
00172 FOR PRESSURE AND TEMPERATURE DATA REGISTERS */
00173 /***********************************************/
00174 /* Data Register */
00175 #define BMP280_PRESSURE_XLSB_REG_DATA__POS         (4)
00176 #define BMP280_PRESSURE_XLSB_REG_DATA__MSK         (0xF0)
00177 #define BMP280_PRESSURE_XLSB_REG_DATA__LEN         (4)
00178 #define BMP280_PRESSURE_XLSB_REG_DATA__REG         (BMP280_PRESSURE_XLSB_REG)
00179 
00180 #define BMP280_TEMPERATURE_XLSB_REG_DATA__POS      (4)
00181 #define BMP280_TEMPERATURE_XLSB_REG_DATA__MSK      (0xF0)
00182 #define BMP280_TEMPERATURE_XLSB_REG_DATA__LEN      (4)
00183 #define BMP280_TEMPERATURE_XLSB_REG_DATA__REG (BMP280_TEMPERATURE_XLSB_REG)
00184 
00185 /****************************************************/
00186 /**\name  ARRAY PARAMETER FOR CALIBRATION     */
00187 /***************************************************/
00188 #define BMP280_TEMPERATURE_CALIB_DIG_T1_LSB (0)
00189 #define BMP280_TEMPERATURE_CALIB_DIG_T1_MSB (1)
00190 #define BMP280_TEMPERATURE_CALIB_DIG_T2_LSB (2)
00191 #define BMP280_TEMPERATURE_CALIB_DIG_T2_MSB (3)
00192 #define BMP280_TEMPERATURE_CALIB_DIG_T3_LSB (4)
00193 #define BMP280_TEMPERATURE_CALIB_DIG_T3_MSB (5)
00194 #define BMP280_PRESSURE_CALIB_DIG_P1_LSB  (6)
00195 #define BMP280_PRESSURE_CALIB_DIG_P1_MSB  (7)
00196 #define BMP280_PRESSURE_CALIB_DIG_P2_LSB  (8)
00197 #define BMP280_PRESSURE_CALIB_DIG_P2_MSB  (9)
00198 #define BMP280_PRESSURE_CALIB_DIG_P3_LSB  (10)
00199 #define BMP280_PRESSURE_CALIB_DIG_P3_MSB  (11)
00200 #define BMP280_PRESSURE_CALIB_DIG_P4_LSB  (12)
00201 #define BMP280_PRESSURE_CALIB_DIG_P4_MSB  (13)
00202 #define BMP280_PRESSURE_CALIB_DIG_P5_LSB  (14)
00203 #define BMP280_PRESSURE_CALIB_DIG_P5_MSB  (15)
00204 #define BMP280_PRESSURE_CALIB_DIG_P6_LSB  (16)
00205 #define BMP280_PRESSURE_CALIB_DIG_P6_MSB  (17)
00206 #define BMP280_PRESSURE_CALIB_DIG_P7_LSB  (18)
00207 #define BMP280_PRESSURE_CALIB_DIG_P7_MSB  (19)
00208 #define BMP280_PRESSURE_CALIB_DIG_P8_LSB  (20)
00209 #define BMP280_PRESSURE_CALIB_DIG_P8_MSB  (21)
00210 #define BMP280_PRESSURE_CALIB_DIG_P9_LSB  (22)
00211 #define BMP280_PRESSURE_CALIB_DIG_P9_MSB  (23)
00212 
00213 class BMP280
00214 {
00215 
00216 public:
00217 
00218     /** BMP280 Sensor mode Type **/
00219     typedef enum
00220     {
00221       BMP280_SLEEP_MODE = 0x00,
00222       BMP280_FORCED_MODE = 0x01,
00223       BMP280_NORMAL_MODE = 0x03
00224     }BMP280_Mode_Type;
00225     
00226     
00227     /** BMP280 Filter Type **/
00228     typedef enum
00229     {
00230       BMP280_FILTER_COEFF_OFF = 0x00,
00231       BMP280_FILTER_COEFF_2 = 0x01,
00232       BMP280_FILTER_COEFF_4 = 0x02,
00233       BMP280_FILTER_COEFF_8 = 0x03,
00234       BMP280_FILTER_COEFF_16 = 0x04
00235     }BMP280_Filter_Coeff_Type;
00236     
00237     /** BMP280 Standby Type **/
00238     typedef enum
00239     {
00240       BMP280_STANDBY_TIME_1_MS = 0x00,
00241       BMP280_STANDBY_TIME_63_MS = 0x01,
00242       BMP280_STANDBY_TIME_125_MS = 0x02,
00243       BMP280_STANDBY_TIME_250_MS = 0x03,
00244       BMP280_STANDBY_TIME_500_MS = 0x04,
00245       BMP280_STANDBY_TIME_1000_MS = 0x05,
00246       BMP280_STANDBY_TIME_10_MS = 0x06,
00247       BMP280_STANDBY_TIME_20_MS = 0x07
00248     }BMP280_Standby_Type ;
00249     
00250     /** BMP280 Dataframe Type **/
00251     typedef enum
00252     {
00253       BMP280_DATA_FRAME_PRESSURE_MSB_BYTE = 0,
00254       BMP280_DATA_FRAME_PRESSURE_LSB_BYTE = 1,
00255       BMP280_DATA_FRAME_PRESSURE_XLSB_BYTE = 2,
00256       BMP280_DATA_FRAME_TEMPERATURE_MSB_BYTE = 3,
00257       BMP280_DATA_FRAME_TEMPERATURE_LSB_BYTE = 4,
00258       BMP280_DATA_FRAME_TEMPERATURE_XLSB_BYTE = 5,
00259     }BMP280_DataFrame_Type;
00260 
00261     /**
00262      * BMP280 constructor.
00263      *
00264      * @param sda mbed pin to use for SDA line of I2C interface.
00265      * @param scl mbed pin to use for SCL line of I2C interface.
00266      */
00267     BMP280(PinName sda, PinName scl);
00268 
00269     /**
00270      * BMP280 constructor.
00271      *
00272      * @param i2c I2C object to use.
00273      */
00274     BMP280(I2C *i2c);
00275 
00276     /**
00277      * BMP280 destructor.
00278      */
00279     ~BMP280();
00280     
00281     
00282     /**
00283      * @brief To transmit data on I2C
00284      * @param Address   Register address on which Wr_Data will be written
00285      * @param data   data
00286      */
00287     void writeByte(uint8_t Address, uint8_t data);
00288     
00289     
00290     /**
00291      * @brief To read data from the I2C based device
00292      * @param Address   Register address from data to be read
00293      */
00294     char readByte(uint8_t Address);
00295   
00296     /**
00297      * @brief To read data from the I2C based device
00298      * @param Address   Register address from data to be read
00299      * @param counr     Lenght of data to be received
00300      * @param dest      Receive buffer
00301      */
00302     void readBytes(uint8_t Address, uint8_t count, uint8_t * dest);  
00303   
00304     /**
00305      * @brief To Read the Device ID
00306      * @return Device ID
00307      */
00308     uint8_t BMP280_GetID(void);
00309   
00310   
00311     /**
00312      * @brief To Reset the Device
00313      */
00314     void BMP280_SoftReset(void);
00315    
00316    
00317     /**
00318      * @brief To get the device status
00319      * @return  status register value
00320      */
00321     uint8_t BMP280_GetStatus(void);
00322     
00323     
00324     /**
00325      * @brief To get the Temperature and Pressure CTRL_MEAS register value
00326      * @return  CTRL_MEAS register value
00327      */
00328     uint8_t BMP280_GetCtrlMeasurement(void);
00329     
00330     
00331     /**
00332      * @brief To get the config register value
00333      * @return  Config register value
00334      */
00335     uint8_t BMP280_GetConfig(void);
00336     
00337     
00338     /**
00339      * @brief To read the sensor data(Temperature,Pressure and humidity)
00340      * @return value  if fail to read sensor data then it will return 1
00341      */
00342     void BMP280_ReadMeasurements(void);
00343     
00344     
00345     /**
00346      * @brief To Read the calibration data for Temperature, Pressure and humidity
00347      */
00348     void BMP280_ReadCalibrationParams(void);
00349     
00350     
00351     /**
00352      * @brief To set the sampling rate for the Pressure data
00353      * @param Value
00354      */
00355     void BMP280_SetOversamplingPressure(uint8_t Value);
00356     
00357     /**
00358      * @brief To set the sampling rate for the Temperature data
00359      * @param Value
00360      */
00361     void BMP280_SetOversamplingTemperature(uint8_t Value);
00362     
00363     /**
00364      * @brief To set the sensor power mode
00365      * @param Value Power mode
00366      *      @arg BMP280_NORMAL_MODE
00367      *      @arg BMP280_FORCED_MODE
00368      *      @arg BMP280_SLEEP_MODE
00369      */
00370     void BMP280_SetPowerMode(BMP280_Mode_Type Value);
00371     
00372     
00373     /**
00374      * @brief To set the filter coefficient value
00375      * @param Value Filter cofficient
00376      *      @arg  BMP280_FILTER_COEFF_OFF
00377      *      @arg  BMP280_FILTER_COEFF_2
00378      *      @arg  BMP280_FILTER_COEFF_4
00379      *      @arg  BMP280_FILTER_COEFF_8
00380      *      @arg  BMP280_FILTER_COEFF_16
00381      */
00382     void BMP280_SetFilterCoefficient(BMP280_Filter_Coeff_Type Value);
00383     
00384     
00385     /**
00386      * @brief To set standby time
00387      * @param Value standny time
00388      *      @arg  BMP280_STANDBY_TIME_1_MS
00389      *      @arg  BMP280_STANDBY_TIME_63_MS
00390      *      @arg  BMP280_STANDBY_TIME_125_MS
00391      *      @arg  BMP280_STANDBY_TIME_250_MS
00392      *      @arg  BMP280_STANDBY_TIME_500_MS
00393      *      @arg  BMP280_STANDBY_TIME_1000_MS
00394      *      @arg  BMP280_STANDBY_TIME_10_MS
00395      *      @arg  BMP280_STANDBY_TIME_20_MS
00396      */
00397     void BMP280_SetStandbyTime(BMP280_Standby_Type Value);
00398    
00399    
00400     /**
00401      * @brief To check the conversion is running or not
00402      * @return  value
00403      */
00404     uint8_t BMP280_IsMeasuring(void);
00405     
00406     
00407     /**
00408      * @brief Temperature calculation
00409      * @return temperature in DegC, resolution is 0.01 DegC. Output value of “5123” equals 51.23 DegC.
00410      */
00411     int32_t BMP280_Compensate_T(void);
00412    
00413    
00414     /**
00415      * @brief Pressure calculation
00416      * @return pressure in Pa as unsigned 32 bit integer. Output value of “96386” equals 96386 Pa = 963.86 hPa
00417      */
00418     uint32_t BMP280_Compensate_P(void);
00419    
00420    
00421     /**
00422      * @brief initialize BMP280
00423      */
00424     void BMP280_INIT(void);
00425     
00426     
00427     /**
00428      * @brief Print Temperature value on Uart0
00429      */
00430     float BMP280_GetTemperature(void);
00431     
00432     
00433     /**
00434      * @brief Print Pressure value on Uart0
00435      */
00436     float BMP280_GetPressure(void);
00437 
00438 private:
00439     /*!
00440      * @brief This structure holds all device specific calibration parameters
00441      */
00442     typedef struct bmp280_calib_param_t {
00443       uint16_t dig_T1;/**<calibration T1 data*/
00444       int16_t dig_T2;/**<calibration T2 data*/
00445       int16_t dig_T3;/**<calibration T3 data*/
00446       uint16_t dig_P1;/**<calibration P1 data*/
00447       int16_t dig_P2;/**<calibration P2 data*/
00448       int16_t dig_P3;/**<calibration P3 data*/
00449       int16_t dig_P4;/**<calibration P4 data*/
00450       int16_t dig_P5;/**<calibration P5 data*/
00451       int16_t dig_P6;/**<calibration P6 data*/
00452       int16_t dig_P7;/**<calibration P7 data*/
00453       int16_t dig_P8;/**<calibration P8 data*/
00454       int16_t dig_P9;/**<calibration P9 data*/
00455     }BMP280_calibration_param;
00456 
00457     I2C *i2c_;
00458     bool i2c_owner;
00459 
00460     BMP280::BMP280_calibration_param cal_param;
00461     int32_t adc_t, adc_p, t_fine;
00462 
00463 };