Library for BMP085 digital pressure sensor.
BMP085.h@2:34a32898cd23, 2017-08-25 (annotated)
- Committer:
- mcm
- Date:
- Fri Aug 25 14:16:15 2017 +0000
- Revision:
- 2:34a32898cd23
- Parent:
- 1:01aeefb5f4cf
The library is ready, it was tested successfully and it works as expected.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mcm | 1:01aeefb5f4cf | 1 | /** |
mcm | 1:01aeefb5f4cf | 2 | * @brief BMP085.h |
mcm | 1:01aeefb5f4cf | 3 | * @details Digital pressure sensor. |
mcm | 1:01aeefb5f4cf | 4 | * Header file. |
mcm | 1:01aeefb5f4cf | 5 | * |
mcm | 1:01aeefb5f4cf | 6 | * |
mcm | 1:01aeefb5f4cf | 7 | * @return NA |
mcm | 1:01aeefb5f4cf | 8 | * |
mcm | 1:01aeefb5f4cf | 9 | * @author Manuel Caballero |
mcm | 1:01aeefb5f4cf | 10 | * @date 25/August/2017 |
mcm | 1:01aeefb5f4cf | 11 | * @version 25/August/2017 The ORIGIN |
mcm | 1:01aeefb5f4cf | 12 | * @pre NaN. |
mcm | 1:01aeefb5f4cf | 13 | * @warning NaN |
mcm | 1:01aeefb5f4cf | 14 | * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ). |
mcm | 1:01aeefb5f4cf | 15 | */ |
mcm | 1:01aeefb5f4cf | 16 | #ifndef BMP085_H |
mcm | 1:01aeefb5f4cf | 17 | #define BMP085_H |
mcm | 1:01aeefb5f4cf | 18 | |
mcm | 1:01aeefb5f4cf | 19 | #include "mbed.h" |
mcm | 1:01aeefb5f4cf | 20 | |
mcm | 1:01aeefb5f4cf | 21 | |
mcm | 2:34a32898cd23 | 22 | /** |
mcm | 2:34a32898cd23 | 23 | Example: |
mcm | 2:34a32898cd23 | 24 | |
mcm | 2:34a32898cd23 | 25 | #include "mbed.h" |
mcm | 2:34a32898cd23 | 26 | #include "BMP085.h" |
mcm | 2:34a32898cd23 | 27 | |
mcm | 2:34a32898cd23 | 28 | BMP085 myBarometricSensor ( I2C_SDA, I2C_SCL, BMP085::BMP085_ADDRESS, 400000 ); |
mcm | 2:34a32898cd23 | 29 | Serial pc ( USBTX, USBRX ); // tx, rx |
mcm | 2:34a32898cd23 | 30 | |
mcm | 2:34a32898cd23 | 31 | |
mcm | 2:34a32898cd23 | 32 | Ticker serial; |
mcm | 2:34a32898cd23 | 33 | |
mcm | 2:34a32898cd23 | 34 | DigitalOut myled(LED1); |
mcm | 2:34a32898cd23 | 35 | |
mcm | 2:34a32898cd23 | 36 | BMP085::Vector_cal_coeff_t myCalCoeff; |
mcm | 2:34a32898cd23 | 37 | BMP085::Vector_temp_f myUT; |
mcm | 2:34a32898cd23 | 38 | BMP085::Vector_pressure_f myUP; |
mcm | 2:34a32898cd23 | 39 | BMP085::Vector_compensated_data_f myTrueData; |
mcm | 2:34a32898cd23 | 40 | |
mcm | 2:34a32898cd23 | 41 | uint32_t myState = 0; |
mcm | 2:34a32898cd23 | 42 | |
mcm | 2:34a32898cd23 | 43 | void sendDATA ( void ) |
mcm | 2:34a32898cd23 | 44 | { |
mcm | 2:34a32898cd23 | 45 | switch ( myState ) { |
mcm | 2:34a32898cd23 | 46 | case 0: |
mcm | 2:34a32898cd23 | 47 | // Trigger a new temperature measurement |
mcm | 2:34a32898cd23 | 48 | myBarometricSensor.BMP085_TriggerTemperature (); |
mcm | 2:34a32898cd23 | 49 | myState = 1; |
mcm | 2:34a32898cd23 | 50 | break; |
mcm | 2:34a32898cd23 | 51 | |
mcm | 2:34a32898cd23 | 52 | case 1: |
mcm | 2:34a32898cd23 | 53 | // Read the uncompensated temperature data and trigger a new pressure measurement |
mcm | 2:34a32898cd23 | 54 | myBarometricSensor.BMP085_ReadRawTemperature ( &myUT ); |
mcm | 2:34a32898cd23 | 55 | myBarometricSensor.BMP085_TriggerPressure ( BMP085::PRESSURE_STANDARD_MODE ); |
mcm | 2:34a32898cd23 | 56 | myState = 2; |
mcm | 2:34a32898cd23 | 57 | break; |
mcm | 2:34a32898cd23 | 58 | |
mcm | 2:34a32898cd23 | 59 | case 2: |
mcm | 2:34a32898cd23 | 60 | // Read the uncompensated pressure data, calculate the compensated temperature and pressure and send it through the UART |
mcm | 2:34a32898cd23 | 61 | myled = 1; |
mcm | 2:34a32898cd23 | 62 | myBarometricSensor.BMP085_ReadRawPressure ( &myUP ); |
mcm | 2:34a32898cd23 | 63 | |
mcm | 2:34a32898cd23 | 64 | myTrueData = myBarometricSensor.BMP085_CalculateCompensated_Temperature_Pressure ( myCalCoeff, myUT, myUP, BMP085::PRESSURE_STANDARD_MODE ); |
mcm | 2:34a32898cd23 | 65 | |
mcm | 2:34a32898cd23 | 66 | pc.printf( "Temperature: %0.1f\nPressure: %ld\r\n", ( float )myTrueData.Temperature/10, myTrueData.Pressure ); |
mcm | 2:34a32898cd23 | 67 | myled = 0; |
mcm | 2:34a32898cd23 | 68 | myState = 0; |
mcm | 2:34a32898cd23 | 69 | break; |
mcm | 2:34a32898cd23 | 70 | |
mcm | 2:34a32898cd23 | 71 | default: |
mcm | 2:34a32898cd23 | 72 | myState = 0; |
mcm | 2:34a32898cd23 | 73 | break; |
mcm | 2:34a32898cd23 | 74 | } |
mcm | 2:34a32898cd23 | 75 | |
mcm | 2:34a32898cd23 | 76 | } |
mcm | 2:34a32898cd23 | 77 | |
mcm | 2:34a32898cd23 | 78 | |
mcm | 2:34a32898cd23 | 79 | int main() |
mcm | 2:34a32898cd23 | 80 | { |
mcm | 2:34a32898cd23 | 81 | pc.baud ( 115200 ); |
mcm | 2:34a32898cd23 | 82 | |
mcm | 2:34a32898cd23 | 83 | myBarometricSensor.BMP085_GetCalibrationCoefficients ( &myCalCoeff ); |
mcm | 2:34a32898cd23 | 84 | |
mcm | 2:34a32898cd23 | 85 | // Print the calibration coefficients |
mcm | 2:34a32898cd23 | 86 | pc.printf( "AC1: %ld\nAC2: %ld\nAC3: %ld\nAC4: %ld\nAC5: %ld\nAC6: %ld\nB1: %ld\nB2: %ld\nMB: %ld\nMC: %ld\nMD: %ld\r\n", |
mcm | 2:34a32898cd23 | 87 | myCalCoeff.AC1, myCalCoeff.AC2, myCalCoeff.AC3, myCalCoeff.AC4, myCalCoeff.AC5, myCalCoeff.AC6, myCalCoeff.B1, |
mcm | 2:34a32898cd23 | 88 | myCalCoeff.B2, myCalCoeff.MB, myCalCoeff.MC, myCalCoeff.MD ); |
mcm | 2:34a32898cd23 | 89 | |
mcm | 2:34a32898cd23 | 90 | |
mcm | 2:34a32898cd23 | 91 | serial.attach( &sendDATA, 1 ); // the address of the function to be attached ( sendDATA ) and the interval ( 1s ) |
mcm | 2:34a32898cd23 | 92 | |
mcm | 2:34a32898cd23 | 93 | // Let the callbacks take care of everything |
mcm | 2:34a32898cd23 | 94 | while(1) sleep(); |
mcm | 2:34a32898cd23 | 95 | } |
mcm | 2:34a32898cd23 | 96 | */ |
mcm | 2:34a32898cd23 | 97 | |
mcm | 2:34a32898cd23 | 98 | |
mcm | 1:01aeefb5f4cf | 99 | /*! |
mcm | 1:01aeefb5f4cf | 100 | Library for the BMP085 Digital Pressure Sensor. |
mcm | 1:01aeefb5f4cf | 101 | */ |
mcm | 1:01aeefb5f4cf | 102 | class BMP085 |
mcm | 1:01aeefb5f4cf | 103 | { |
mcm | 1:01aeefb5f4cf | 104 | public: |
mcm | 1:01aeefb5f4cf | 105 | /** |
mcm | 1:01aeefb5f4cf | 106 | * @brief DEFAULT ADDRESSES |
mcm | 1:01aeefb5f4cf | 107 | */ |
mcm | 1:01aeefb5f4cf | 108 | typedef enum { |
mcm | 2:34a32898cd23 | 109 | BMP085_ADDRESS = ( 0x77 << 1 ) |
mcm | 1:01aeefb5f4cf | 110 | } BMP085_address_t; |
mcm | 1:01aeefb5f4cf | 111 | |
mcm | 1:01aeefb5f4cf | 112 | |
mcm | 1:01aeefb5f4cf | 113 | /** |
mcm | 1:01aeefb5f4cf | 114 | * @brief CALIBRATION COEFFICIENTS |
mcm | 1:01aeefb5f4cf | 115 | */ |
mcm | 1:01aeefb5f4cf | 116 | #define BMP085_AC1_MSB 0xAA /*!< MSB AC1 coefficient */ |
mcm | 1:01aeefb5f4cf | 117 | #define BMP085_AC1_LSB 0xAB /*!< LSB AC1 coefficient */ |
mcm | 1:01aeefb5f4cf | 118 | #define BMP085_AC2_MSB 0xAC /*!< MSB AC2 coefficient */ |
mcm | 1:01aeefb5f4cf | 119 | #define BMP085_AC2_LSB 0xAD /*!< LSB AC2 coefficient */ |
mcm | 1:01aeefb5f4cf | 120 | #define BMP085_AC3_MSB 0xAE /*!< MSB AC3 coefficient */ |
mcm | 1:01aeefb5f4cf | 121 | #define BMP085_AC3_LSB 0xAF /*!< LSB AC3 coefficient */ |
mcm | 1:01aeefb5f4cf | 122 | #define BMP085_AC4_MSB 0xB0 /*!< MSB AC4 coefficient */ |
mcm | 1:01aeefb5f4cf | 123 | #define BMP085_AC4_LSB 0xB1 /*!< LSB AC4 coefficient */ |
mcm | 1:01aeefb5f4cf | 124 | #define BMP085_AC5_MSB 0xB2 /*!< MSB AC5 coefficient */ |
mcm | 1:01aeefb5f4cf | 125 | #define BMP085_AC5_LSB 0xB3 /*!< LSB AC5 coefficient */ |
mcm | 1:01aeefb5f4cf | 126 | #define BMP085_AC6_MSB 0xB4 /*!< MSB AC6 coefficient */ |
mcm | 1:01aeefb5f4cf | 127 | #define BMP085_AC6_LSB 0xB5 /*!< LSB AC6 coefficient */ |
mcm | 1:01aeefb5f4cf | 128 | #define BMP085_B1_MSB 0xB6 /*!< MSB B1 coefficient */ |
mcm | 1:01aeefb5f4cf | 129 | #define BMP085_B1_LSB 0xB7 /*!< LSB B1 coefficient */ |
mcm | 1:01aeefb5f4cf | 130 | #define BMP085_B2_MSB 0xB8 /*!< MSB B2 coefficient */ |
mcm | 1:01aeefb5f4cf | 131 | #define BMP085_B2_LSB 0xB9 /*!< LSB B2 coefficient */ |
mcm | 1:01aeefb5f4cf | 132 | #define BMP085_MB_MSB 0xBA /*!< MSB MB coefficient */ |
mcm | 1:01aeefb5f4cf | 133 | #define BMP085_MB_LSB 0xBB /*!< LSB MB coefficient */ |
mcm | 1:01aeefb5f4cf | 134 | #define BMP085_MC_MSB 0xBC /*!< MSB MC coefficient */ |
mcm | 1:01aeefb5f4cf | 135 | #define BMP085_MC_LSB 0xBD /*!< LSB MC coefficient */ |
mcm | 1:01aeefb5f4cf | 136 | #define BMP085_MD_MSB 0xBE /*!< MSB MD coefficient */ |
mcm | 1:01aeefb5f4cf | 137 | #define BMP085_MD_LSB 0xBF /*!< LSB MD coefficient */ |
mcm | 1:01aeefb5f4cf | 138 | |
mcm | 1:01aeefb5f4cf | 139 | |
mcm | 1:01aeefb5f4cf | 140 | /** |
mcm | 1:01aeefb5f4cf | 141 | * @brief REGISTERS MAP |
mcm | 1:01aeefb5f4cf | 142 | */ |
mcm | 1:01aeefb5f4cf | 143 | #define BMP085_CONTROL 0xF4 /*!< Control register */ |
mcm | 1:01aeefb5f4cf | 144 | |
mcm | 1:01aeefb5f4cf | 145 | |
mcm | 1:01aeefb5f4cf | 146 | |
mcm | 1:01aeefb5f4cf | 147 | /* Commands Registers */ |
mcm | 1:01aeefb5f4cf | 148 | /** |
mcm | 1:01aeefb5f4cf | 149 | * @brief TEMPERATURE |
mcm | 1:01aeefb5f4cf | 150 | */ |
mcm | 1:01aeefb5f4cf | 151 | #define BMP085_TRIGGER_TEMPERATURE 0x2E /*!< Trigger a new Temperature measurement */ |
mcm | 1:01aeefb5f4cf | 152 | #define BMP085_READ_TEMPERATURE 0xF6 /*!< Read Temperature */ |
mcm | 1:01aeefb5f4cf | 153 | |
mcm | 1:01aeefb5f4cf | 154 | /* Commands Registers */ |
mcm | 1:01aeefb5f4cf | 155 | /** |
mcm | 1:01aeefb5f4cf | 156 | * @brief PRESSURE |
mcm | 1:01aeefb5f4cf | 157 | */ |
mcm | 1:01aeefb5f4cf | 158 | #define BMP085_TRIGGER_PRESSURE 0x34 /*!< Trigger a new Pressure measurement */ |
mcm | 1:01aeefb5f4cf | 159 | #define BMP085_READ_PRESSURE 0xF6 /*!< Read Pressure */ |
mcm | 1:01aeefb5f4cf | 160 | |
mcm | 1:01aeefb5f4cf | 161 | typedef enum { |
mcm | 1:01aeefb5f4cf | 162 | PRESSURE_ULTRA_LOW_POWER_MODE = 0, /*!< Pressure: Ultra low power mode. */ |
mcm | 1:01aeefb5f4cf | 163 | PRESSURE_STANDARD_MODE = 1, /*!< Pressure: Standard mode. */ |
mcm | 1:01aeefb5f4cf | 164 | PRESSURE_HIGH_RESOLUTION_MODE = 2, /*!< Pressure: High resolution mode. */ |
mcm | 1:01aeefb5f4cf | 165 | PRESSURE_ULTRA_HIGH_RES_MODE = 3 /*!< Pressure: Ultra high resolution mode. */ |
mcm | 1:01aeefb5f4cf | 166 | } BMP085_pressure_osrs_t; |
mcm | 1:01aeefb5f4cf | 167 | |
mcm | 1:01aeefb5f4cf | 168 | |
mcm | 1:01aeefb5f4cf | 169 | |
mcm | 1:01aeefb5f4cf | 170 | |
mcm | 1:01aeefb5f4cf | 171 | #ifndef VECTOR_STRUCT_H |
mcm | 1:01aeefb5f4cf | 172 | #define VECTOR_STRUCT_H |
mcm | 1:01aeefb5f4cf | 173 | typedef struct { |
mcm | 1:01aeefb5f4cf | 174 | int16_t AC1; |
mcm | 1:01aeefb5f4cf | 175 | int16_t AC2; |
mcm | 1:01aeefb5f4cf | 176 | int16_t AC3; |
mcm | 1:01aeefb5f4cf | 177 | uint16_t AC4; |
mcm | 1:01aeefb5f4cf | 178 | uint16_t AC5; |
mcm | 1:01aeefb5f4cf | 179 | uint16_t AC6; |
mcm | 1:01aeefb5f4cf | 180 | int16_t B1; |
mcm | 1:01aeefb5f4cf | 181 | int16_t B2; |
mcm | 1:01aeefb5f4cf | 182 | int16_t MB; |
mcm | 1:01aeefb5f4cf | 183 | int16_t MC; |
mcm | 1:01aeefb5f4cf | 184 | int16_t MD; |
mcm | 1:01aeefb5f4cf | 185 | } Vector_cal_coeff_t; |
mcm | 1:01aeefb5f4cf | 186 | |
mcm | 1:01aeefb5f4cf | 187 | |
mcm | 1:01aeefb5f4cf | 188 | typedef struct { |
mcm | 1:01aeefb5f4cf | 189 | int16_t UT_Temperature; |
mcm | 1:01aeefb5f4cf | 190 | } Vector_temp_f; |
mcm | 1:01aeefb5f4cf | 191 | |
mcm | 1:01aeefb5f4cf | 192 | typedef struct { |
mcm | 1:01aeefb5f4cf | 193 | int32_t UP_Pressure; |
mcm | 1:01aeefb5f4cf | 194 | } Vector_pressure_f; |
mcm | 1:01aeefb5f4cf | 195 | |
mcm | 1:01aeefb5f4cf | 196 | typedef struct { |
mcm | 1:01aeefb5f4cf | 197 | int16_t Temperature; |
mcm | 1:01aeefb5f4cf | 198 | int32_t Pressure; |
mcm | 1:01aeefb5f4cf | 199 | } Vector_compensated_data_f; |
mcm | 1:01aeefb5f4cf | 200 | #endif |
mcm | 1:01aeefb5f4cf | 201 | |
mcm | 1:01aeefb5f4cf | 202 | |
mcm | 1:01aeefb5f4cf | 203 | /** |
mcm | 1:01aeefb5f4cf | 204 | * @brief INTERNAL CONSTANTS |
mcm | 1:01aeefb5f4cf | 205 | */ |
mcm | 1:01aeefb5f4cf | 206 | typedef enum { |
mcm | 1:01aeefb5f4cf | 207 | BMP085_SUCCESS = 0, |
mcm | 1:01aeefb5f4cf | 208 | BMP085_FAILURE = 1, |
mcm | 1:01aeefb5f4cf | 209 | I2C_SUCCESS = 0 /*!< I2C communication was fine */ |
mcm | 1:01aeefb5f4cf | 210 | } BMP085_status_t; |
mcm | 1:01aeefb5f4cf | 211 | |
mcm | 1:01aeefb5f4cf | 212 | |
mcm | 1:01aeefb5f4cf | 213 | |
mcm | 1:01aeefb5f4cf | 214 | |
mcm | 2:34a32898cd23 | 215 | /** Create an BMP085 object connected to the specified I2C pins. |
mcm | 2:34a32898cd23 | 216 | * |
mcm | 2:34a32898cd23 | 217 | * @param sda I2C data pin |
mcm | 2:34a32898cd23 | 218 | * @param scl I2C clock pin |
mcm | 2:34a32898cd23 | 219 | * @param addr I2C slave address |
mcm | 2:34a32898cd23 | 220 | * @param freq I2C frequency in Hz. |
mcm | 2:34a32898cd23 | 221 | */ |
mcm | 1:01aeefb5f4cf | 222 | BMP085 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq ); |
mcm | 1:01aeefb5f4cf | 223 | |
mcm | 1:01aeefb5f4cf | 224 | /** Delete BMP085 object. |
mcm | 1:01aeefb5f4cf | 225 | */ |
mcm | 1:01aeefb5f4cf | 226 | ~BMP085(); |
mcm | 2:34a32898cd23 | 227 | |
mcm | 1:01aeefb5f4cf | 228 | /** It gets the calibration coefficients. |
mcm | 1:01aeefb5f4cf | 229 | */ |
mcm | 1:01aeefb5f4cf | 230 | BMP085_status_t BMP085_GetCalibrationCoefficients ( Vector_cal_coeff_t* myCalCoeff ); |
mcm | 2:34a32898cd23 | 231 | |
mcm | 1:01aeefb5f4cf | 232 | /** It triggers a new temperature mesurement. |
mcm | 1:01aeefb5f4cf | 233 | */ |
mcm | 1:01aeefb5f4cf | 234 | BMP085_status_t BMP085_TriggerTemperature ( void ); |
mcm | 2:34a32898cd23 | 235 | |
mcm | 1:01aeefb5f4cf | 236 | /** It reads the raw temperature value. |
mcm | 1:01aeefb5f4cf | 237 | */ |
mcm | 1:01aeefb5f4cf | 238 | BMP085_status_t BMP085_ReadRawTemperature ( Vector_temp_f* myRawTemperature ); |
mcm | 2:34a32898cd23 | 239 | |
mcm | 1:01aeefb5f4cf | 240 | /** It reads the compensated/true temperature. NOT RECOMMENDED, use BMP085_CalculateCompensated_Temperature_Pressure instead! |
mcm | 1:01aeefb5f4cf | 241 | */ |
mcm | 1:01aeefb5f4cf | 242 | BMP085_status_t BMP085_ReadCompensatedTemperature ( Vector_temp_f* myTrueTemperature, Vector_cal_coeff_t myCalCoeff ); |
mcm | 2:34a32898cd23 | 243 | |
mcm | 1:01aeefb5f4cf | 244 | /** It triggers a new pressure mesurement. |
mcm | 1:01aeefb5f4cf | 245 | */ |
mcm | 1:01aeefb5f4cf | 246 | BMP085_status_t BMP085_TriggerPressure ( BMP085_pressure_osrs_t myResolution ); |
mcm | 2:34a32898cd23 | 247 | |
mcm | 1:01aeefb5f4cf | 248 | /** It reads the raw pressure value. |
mcm | 1:01aeefb5f4cf | 249 | */ |
mcm | 1:01aeefb5f4cf | 250 | BMP085_status_t BMP085_ReadRawPressure ( Vector_pressure_f* myRawPressure ); |
mcm | 2:34a32898cd23 | 251 | |
mcm | 1:01aeefb5f4cf | 252 | /** It calculates the compensated/true temperature and pressure values. |
mcm | 1:01aeefb5f4cf | 253 | */ |
mcm | 1:01aeefb5f4cf | 254 | Vector_compensated_data_f BMP085_CalculateCompensated_Temperature_Pressure ( Vector_cal_coeff_t myCalCoeff, Vector_temp_f myRawTemperature, Vector_pressure_f myRawPressure, |
mcm | 1:01aeefb5f4cf | 255 | BMP085_pressure_osrs_t myResolution ); |
mcm | 1:01aeefb5f4cf | 256 | |
mcm | 1:01aeefb5f4cf | 257 | private: |
mcm | 1:01aeefb5f4cf | 258 | I2C i2c; |
mcm | 1:01aeefb5f4cf | 259 | uint32_t BMP085_Addr; |
mcm | 1:01aeefb5f4cf | 260 | }; |
mcm | 1:01aeefb5f4cf | 261 | |
mcm | 1:01aeefb5f4cf | 262 | #endif |