Library for BMP085 digital pressure sensor.

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?

UserRevisionLine numberNew 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