BMP280 I2C Library
Fork of BMP280 by
BMP280.h
- Committer:
- brdarji
- Date:
- 2017-11-23
- Revision:
- 8:0aae5bf93aaa
- Parent:
- 7:c72b726c7dc9
File content as of revision 8:0aae5bf93aaa:
/******************************************************************//** * @file BMP280.h * @brief Contains all I2C based BMP280 Pressure sensor declarations * @version 1.0 * @date 26. May. 2016 * @author Bhavin.Edutech Learning Solutions **********************************************************************/ #include "mbed.h" /** I2C ADDRESS DEFINITIONS **/ /************************************************/ /**\name CHIP ID DEFINITION */ /***********************************************/ #define BMP280_CHIP_ID1 (0x56) #define BMP280_CHIP_ID2 (0x57) #define BMP280_CHIP_ID3 (0x58) /************************************************/ /**\name I2C ADDRESS DEFINITION */ /***********************************************/ #define BMP280_I2C_ADDRESS1 (0x76<<1) #define BMP280_I2C_ADDRESS2 (0x77<<1) /************************************************/ /**\name POWER MODE DEFINITION */ /***********************************************/ /* Sensor Specific constants */ #define BMP280_SOFT_RESET_CODE (0xB6) /************************************************/ /**\name OVERSAMPLING DEFINITION */ /***********************************************/ #define BMP280_OVERSAMP_SKIPPED (0x00) #define BMP280_OVERSAMP_1X (0x01) #define BMP280_OVERSAMP_2X (0x02) #define BMP280_OVERSAMP_4X (0x03) #define BMP280_OVERSAMP_8X (0x04) #define BMP280_OVERSAMP_16X (0x05) /************************************************/ /**\name WORKING MODE DEFINITION */ /***********************************************/ #define BMP280_ULTRA_LOW_POWER_MODE (0x00) #define BMP280_LOW_POWER_MODE (0x01) #define BMP280_STANDARD_RESOLUTION_MODE (0x02) #define BMP280_HIGH_RESOLUTION_MODE (0x03) #define BMP280_ULTRA_HIGH_RESOLUTION_MODE (0x04) #define BMP280_ULTRALOWPOWER_OVERSAMP_PRESSURE BMP280_OVERSAMP_1X #define BMP280_ULTRALOWPOWER_OVERSAMP_TEMPERATURE BMP280_OVERSAMP_1X #define BMP280_LOWPOWER_OVERSAMP_PRESSURE BMP280_OVERSAMP_2X #define BMP280_LOWPOWER_OVERSAMP_TEMPERATURE BMP280_OVERSAMP_1X #define BMP280_STANDARDRESOLUTION_OVERSAMP_PRESSURE BMP280_OVERSAMP_4X #define BMP280_STANDARDRESOLUTION_OVERSAMP_TEMPERATURE BMP280_OVERSAMP_1X #define BMP280_HIGHRESOLUTION_OVERSAMP_PRESSURE BMP280_OVERSAMP_8X #define BMP280_HIGHRESOLUTION_OVERSAMP_TEMPERATURE BMP280_OVERSAMP_1X #define BMP280_ULTRAHIGHRESOLUTION_OVERSAMP_PRESSURE BMP280_OVERSAMP_16X #define BMP280_ULTRAHIGHRESOLUTION_OVERSAMP_TEMPERATURE BMP280_OVERSAMP_2X /************************************************/ /**\name CALIBRATION PARAMETERS DEFINITION */ /***********************************************/ /*calibration parameters */ #define BMP280_TEMPERATURE_CALIB_DIG_T1_LSB_REG (0x88) #define BMP280_TEMPERATURE_CALIB_DIG_T1_MSB_REG (0x89) #define BMP280_TEMPERATURE_CALIB_DIG_T2_LSB_REG (0x8A) #define BMP280_TEMPERATURE_CALIB_DIG_T2_MSB_REG (0x8B) #define BMP280_TEMPERATURE_CALIB_DIG_T3_LSB_REG (0x8C) #define BMP280_TEMPERATURE_CALIB_DIG_T3_MSB_REG (0x8D) #define BMP280_PRESSURE_CALIB_DIG_P1_LSB_REG (0x8E) #define BMP280_PRESSURE_CALIB_DIG_P1_MSB_REG (0x8F) #define BMP280_PRESSURE_CALIB_DIG_P2_LSB_REG (0x90) #define BMP280_PRESSURE_CALIB_DIG_P2_MSB_REG (0x91) #define BMP280_PRESSURE_CALIB_DIG_P3_LSB_REG (0x92) #define BMP280_PRESSURE_CALIB_DIG_P3_MSB_REG (0x93) #define BMP280_PRESSURE_CALIB_DIG_P4_LSB_REG (0x94) #define BMP280_PRESSURE_CALIB_DIG_P4_MSB_REG (0x95) #define BMP280_PRESSURE_CALIB_DIG_P5_LSB_REG (0x96) #define BMP280_PRESSURE_CALIB_DIG_P5_MSB_REG (0x97) #define BMP280_PRESSURE_CALIB_DIG_P6_LSB_REG (0x98) #define BMP280_PRESSURE_CALIB_DIG_P6_MSB_REG (0x99) #define BMP280_PRESSURE_CALIB_DIG_P7_LSB_REG (0x9A) #define BMP280_PRESSURE_CALIB_DIG_P7_MSB_REG (0x9B) #define BMP280_PRESSURE_CALIB_DIG_P8_LSB_REG (0x9C) #define BMP280_PRESSURE_CALIB_DIG_P8_MSB_REG (0x9D) #define BMP280_PRESSURE_CALIB_DIG_P9_LSB_REG (0x9E) #define BMP280_PRESSURE_CALIB_DIG_P9_MSB_REG (0x9F) /************************************************/ /**\name REGISTER ADDRESS DEFINITION */ /***********************************************/ #define BMP280_CHIP_ID_REG (0xD0) /*Chip ID Register */ #define BMP280_RST_REG (0xE0) /*Softreset Register */ #define BMP280_STAT_REG (0xF3) /*Status Register */ #define BMP280_CTRL_MEAS_REG (0xF4) /*Ctrl Measure Register */ #define BMP280_CONFIG_REG (0xF5) /*Configuration Register */ #define BMP280_PRESSURE_MSB_REG (0xF7) /*Pressure MSB Register */ #define BMP280_PRESSURE_LSB_REG (0xF8) /*Pressure LSB Register */ #define BMP280_PRESSURE_XLSB_REG (0xF9) /*Pressure XLSB Register */ #define BMP280_TEMPERATURE_MSB_REG (0xFA) /*Temperature MSB Reg */ #define BMP280_TEMPERATURE_LSB_REG (0xFB) /*Temperature LSB Reg */ #define BMP280_TEMPERATURE_XLSB_REG (0xFC) /*Temperature XLSB Reg */ /************************************************/ /**\name BIT LENGTH,POSITION AND MASK DEFINITION */ /***********************************************/ /* Status Register */ #define BMP280_STATUS_REG_MEASURING__POS (3) #define BMP280_STATUS_REG_MEASURING__MSK (0x08) #define BMP280_STATUS_REG_MEASURING__LEN (1) #define BMP280_STATUS_REG_MEASURING__REG (BMP280_STAT_REG) #define BMP280_STATUS_REG_IM_UPDATE__POS (0) #define BMP280_STATUS_REG_IM_UPDATE__MSK (0x01) #define BMP280_STATUS_REG_IM_UPDATE__LEN (1) #define BMP280_STATUS_REG_IM_UPDATE__REG (BMP280_STAT_REG) /************************************************/ /**\name BIT LENGTH,POSITION AND MASK DEFINITION FOR TEMPERATURE OVERSAMPLING */ /***********************************************/ /* Control Measurement Register */ #define BMP280_CTRL_MEAS_REG_OVERSAMP_TEMPERATURE__POS (5) #define BMP280_CTRL_MEAS_REG_OVERSAMP_TEMPERATURE__MSK (0xE0) #define BMP280_CTRL_MEAS_REG_OVERSAMP_TEMPERATURE__LEN (3) #define BMP280_CTRL_MEAS_REG_OVERSAMP_TEMPERATURE__REG \ (BMP280_CTRL_MEAS_REG) /************************************************/ /**\name BIT LENGTH,POSITION AND MASK DEFINITION FOR PRESSURE OVERSAMPLING */ /***********************************************/ #define BMP280_CTRL_MEAS_REG_OVERSAMP_PRESSURE__POS (2) #define BMP280_CTRL_MEAS_REG_OVERSAMP_PRESSURE__MSK (0x1C) #define BMP280_CTRL_MEAS_REG_OVERSAMP_PRESSURE__LEN (3) #define BMP280_CTRL_MEAS_REG_OVERSAMP_PRESSURE__REG \ (BMP280_CTRL_MEAS_REG) /************************************************/ /**\name BIT LENGTH,POSITION AND MASK DEFINITION FOR POWER MODE */ /***********************************************/ #define BMP280_CTRL_MEAS_REG_POWER_MODE__POS (0) #define BMP280_CTRL_MEAS_REG_POWER_MODE__MSK (0x03) #define BMP280_CTRL_MEAS_REG_POWER_MODE__LEN (2) #define BMP280_CTRL_MEAS_REG_POWER_MODE__REG (BMP280_CTRL_MEAS_REG) /************************************************/ /**\name BIT LENGTH,POSITION AND MASK DEFINITION FOR STANDBY DURATION */ /***********************************************/ /* Configuration Register */ #define BMP280_CONFIG_REG_STANDBY_DURN__POS (5) #define BMP280_CONFIG_REG_STANDBY_DURN__MSK (0xE0) #define BMP280_CONFIG_REG_STANDBY_DURN__LEN (3) #define BMP280_CONFIG_REG_STANDBY_DURN__REG (BMP280_CONFIG_REG) /************************************************/ /**\name BIT LENGTH,POSITION AND MASK DEFINITION FOR IIR FILTER */ /***********************************************/ #define BMP280_CONFIG_REG_FILTER__POS (2) #define BMP280_CONFIG_REG_FILTER__MSK (0x1C) #define BMP280_CONFIG_REG_FILTER__LEN (3) #define BMP280_CONFIG_REG_FILTER__REG (BMP280_CONFIG_REG) /************************************************/ /**\name BIT LENGTH,POSITION AND MASK DEFINITION FOR SPI ENABLE*/ /***********************************************/ #define BMP280_CONFIG_REG_SPI3_ENABLE__POS (0) #define BMP280_CONFIG_REG_SPI3_ENABLE__MSK (0x01) #define BMP280_CONFIG_REG_SPI3_ENABLE__LEN (1) #define BMP280_CONFIG_REG_SPI3_ENABLE__REG (BMP280_CONFIG_REG) /************************************************/ /**\name BIT LENGTH,POSITION AND MASK DEFINITION FOR PRESSURE AND TEMPERATURE DATA REGISTERS */ /***********************************************/ /* Data Register */ #define BMP280_PRESSURE_XLSB_REG_DATA__POS (4) #define BMP280_PRESSURE_XLSB_REG_DATA__MSK (0xF0) #define BMP280_PRESSURE_XLSB_REG_DATA__LEN (4) #define BMP280_PRESSURE_XLSB_REG_DATA__REG (BMP280_PRESSURE_XLSB_REG) #define BMP280_TEMPERATURE_XLSB_REG_DATA__POS (4) #define BMP280_TEMPERATURE_XLSB_REG_DATA__MSK (0xF0) #define BMP280_TEMPERATURE_XLSB_REG_DATA__LEN (4) #define BMP280_TEMPERATURE_XLSB_REG_DATA__REG (BMP280_TEMPERATURE_XLSB_REG) /****************************************************/ /**\name ARRAY PARAMETER FOR CALIBRATION */ /***************************************************/ #define BMP280_TEMPERATURE_CALIB_DIG_T1_LSB (0) #define BMP280_TEMPERATURE_CALIB_DIG_T1_MSB (1) #define BMP280_TEMPERATURE_CALIB_DIG_T2_LSB (2) #define BMP280_TEMPERATURE_CALIB_DIG_T2_MSB (3) #define BMP280_TEMPERATURE_CALIB_DIG_T3_LSB (4) #define BMP280_TEMPERATURE_CALIB_DIG_T3_MSB (5) #define BMP280_PRESSURE_CALIB_DIG_P1_LSB (6) #define BMP280_PRESSURE_CALIB_DIG_P1_MSB (7) #define BMP280_PRESSURE_CALIB_DIG_P2_LSB (8) #define BMP280_PRESSURE_CALIB_DIG_P2_MSB (9) #define BMP280_PRESSURE_CALIB_DIG_P3_LSB (10) #define BMP280_PRESSURE_CALIB_DIG_P3_MSB (11) #define BMP280_PRESSURE_CALIB_DIG_P4_LSB (12) #define BMP280_PRESSURE_CALIB_DIG_P4_MSB (13) #define BMP280_PRESSURE_CALIB_DIG_P5_LSB (14) #define BMP280_PRESSURE_CALIB_DIG_P5_MSB (15) #define BMP280_PRESSURE_CALIB_DIG_P6_LSB (16) #define BMP280_PRESSURE_CALIB_DIG_P6_MSB (17) #define BMP280_PRESSURE_CALIB_DIG_P7_LSB (18) #define BMP280_PRESSURE_CALIB_DIG_P7_MSB (19) #define BMP280_PRESSURE_CALIB_DIG_P8_LSB (20) #define BMP280_PRESSURE_CALIB_DIG_P8_MSB (21) #define BMP280_PRESSURE_CALIB_DIG_P9_LSB (22) #define BMP280_PRESSURE_CALIB_DIG_P9_MSB (23) class BMP280 { public: /** BMP280 Sensor mode Type **/ typedef enum { BMP280_SLEEP_MODE = 0x00, BMP280_FORCED_MODE = 0x01, BMP280_NORMAL_MODE = 0x03 }BMP280_Mode_Type; /** BMP280 Filter Type **/ typedef enum { BMP280_FILTER_COEFF_OFF = 0x00, BMP280_FILTER_COEFF_2 = 0x01, BMP280_FILTER_COEFF_4 = 0x02, BMP280_FILTER_COEFF_8 = 0x03, BMP280_FILTER_COEFF_16 = 0x04 }BMP280_Filter_Coeff_Type; /** BMP280 Standby Type **/ typedef enum { BMP280_STANDBY_TIME_1_MS = 0x00, BMP280_STANDBY_TIME_63_MS = 0x01, BMP280_STANDBY_TIME_125_MS = 0x02, BMP280_STANDBY_TIME_250_MS = 0x03, BMP280_STANDBY_TIME_500_MS = 0x04, BMP280_STANDBY_TIME_1000_MS = 0x05, BMP280_STANDBY_TIME_10_MS = 0x06, BMP280_STANDBY_TIME_20_MS = 0x07 }BMP280_Standby_Type ; /** BMP280 Dataframe Type **/ typedef enum { BMP280_DATA_FRAME_PRESSURE_MSB_BYTE = 0, BMP280_DATA_FRAME_PRESSURE_LSB_BYTE = 1, BMP280_DATA_FRAME_PRESSURE_XLSB_BYTE = 2, BMP280_DATA_FRAME_TEMPERATURE_MSB_BYTE = 3, BMP280_DATA_FRAME_TEMPERATURE_LSB_BYTE = 4, BMP280_DATA_FRAME_TEMPERATURE_XLSB_BYTE = 5, }BMP280_DataFrame_Type; /** * BMP280 constructor. * * @param sda mbed pin to use for SDA line of I2C interface. * @param scl mbed pin to use for SCL line of I2C interface. */ BMP280(PinName sda, PinName scl); /** * BMP280 constructor. * * @param i2c I2C object to use. */ BMP280(I2C *i2c); /** * BMP280 destructor. */ ~BMP280(); /** * @brief To transmit data on I2C * @param Address Register address on which Wr_Data will be written * @param data data */ void writeByte(uint8_t Address, uint8_t data); /** * @brief To read data from the I2C based device * @param Address Register address from data to be read */ char readByte(uint8_t Address); /** * @brief To read data from the I2C based device * @param Address Register address from data to be read * @param counr Lenght of data to be received * @param dest Receive buffer */ void readBytes(uint8_t Address, uint8_t count, uint8_t * dest); /** * @brief To Read the Device ID * @return Device ID */ uint8_t BMP280_GetID(void); /** * @brief To Reset the Device */ void BMP280_SoftReset(void); /** * @brief To get the device status * @return status register value */ uint8_t BMP280_GetStatus(void); /** * @brief To get the Temperature and Pressure CTRL_MEAS register value * @return CTRL_MEAS register value */ uint8_t BMP280_GetCtrlMeasurement(void); /** * @brief To get the config register value * @return Config register value */ uint8_t BMP280_GetConfig(void); /** * @brief To read the sensor data(Temperature,Pressure and humidity) * @return value if fail to read sensor data then it will return 1 */ void BMP280_ReadMeasurements(void); /** * @brief To Read the calibration data for Temperature, Pressure and humidity */ void BMP280_ReadCalibrationParams(void); /** * @brief To set the sampling rate for the Pressure data * @param Value */ void BMP280_SetOversamplingPressure(uint8_t Value); /** * @brief To set the sampling rate for the Temperature data * @param Value */ void BMP280_SetOversamplingTemperature(uint8_t Value); /** * @brief To set the sensor power mode * @param Value Power mode * @arg BMP280_NORMAL_MODE * @arg BMP280_FORCED_MODE * @arg BMP280_SLEEP_MODE */ void BMP280_SetPowerMode(BMP280_Mode_Type Value); /** * @brief To set the filter coefficient value * @param Value Filter cofficient * @arg BMP280_FILTER_COEFF_OFF * @arg BMP280_FILTER_COEFF_2 * @arg BMP280_FILTER_COEFF_4 * @arg BMP280_FILTER_COEFF_8 * @arg BMP280_FILTER_COEFF_16 */ void BMP280_SetFilterCoefficient(BMP280_Filter_Coeff_Type Value); /** * @brief To set standby time * @param Value standny time * @arg BMP280_STANDBY_TIME_1_MS * @arg BMP280_STANDBY_TIME_63_MS * @arg BMP280_STANDBY_TIME_125_MS * @arg BMP280_STANDBY_TIME_250_MS * @arg BMP280_STANDBY_TIME_500_MS * @arg BMP280_STANDBY_TIME_1000_MS * @arg BMP280_STANDBY_TIME_10_MS * @arg BMP280_STANDBY_TIME_20_MS */ void BMP280_SetStandbyTime(BMP280_Standby_Type Value); /** * @brief To check the conversion is running or not * @return value */ uint8_t BMP280_IsMeasuring(void); /** * @brief Temperature calculation * @return temperature in DegC, resolution is 0.01 DegC. Output value of “5123” equals 51.23 DegC. */ int32_t BMP280_Compensate_T(void); /** * @brief Pressure calculation * @return pressure in Pa as unsigned 32 bit integer. Output value of “96386” equals 96386 Pa = 963.86 hPa */ uint32_t BMP280_Compensate_P(void); /** * @brief initialize BMP280 */ void BMP280_INIT(void); /** * @brief Print Temperature value on Uart0 */ float BMP280_GetTemperature(void); /** * @brief Print Pressure value on Uart0 */ float BMP280_GetPressure(void); private: /*! * @brief This structure holds all device specific calibration parameters */ typedef struct bmp280_calib_param_t { uint16_t dig_T1;/**<calibration T1 data*/ int16_t dig_T2;/**<calibration T2 data*/ int16_t dig_T3;/**<calibration T3 data*/ uint16_t dig_P1;/**<calibration P1 data*/ int16_t dig_P2;/**<calibration P2 data*/ int16_t dig_P3;/**<calibration P3 data*/ int16_t dig_P4;/**<calibration P4 data*/ int16_t dig_P5;/**<calibration P5 data*/ int16_t dig_P6;/**<calibration P6 data*/ int16_t dig_P7;/**<calibration P7 data*/ int16_t dig_P8;/**<calibration P8 data*/ int16_t dig_P9;/**<calibration P9 data*/ }BMP280_calibration_param; I2C *i2c_; bool i2c_owner; BMP280::BMP280_calibration_param cal_param; int32_t adc_t, adc_p, t_fine; };