Manuel Caballero / BMP085

BMP085.h

Committer:
mcm
Date:
2017-08-25
Revision:
1:01aeefb5f4cf
Parent:
0:9e768970b8b2
Child:
2:34a32898cd23

File content as of revision 1:01aeefb5f4cf:

/**
 * @brief       BMP085.h
 * @details     Digital pressure sensor.
 *              Header file.
 *
 *
 * @return      NA
 *
 * @author      Manuel Caballero
 * @date        25/August/2017
 * @version     25/August/2017    The ORIGIN
 * @pre         NaN.
 * @warning     NaN
 * @pre         This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
 */
#ifndef BMP085_H
#define BMP085_H

#include "mbed.h"


/*!
 Library for the BMP085 Digital Pressure Sensor.
*/
class BMP085
{
public:
    /**
      * @brief   DEFAULT ADDRESSES
      */
    typedef enum {
        BMP085_ADDRESS     =   0x77
    } BMP085_address_t;


    /**
      * @brief   CALIBRATION COEFFICIENTS
      */
#define BMP085_AC1_MSB                  0xAA        /*!<   MSB AC1 coefficient                                          */
#define BMP085_AC1_LSB                  0xAB        /*!<   LSB AC1 coefficient                                          */
#define BMP085_AC2_MSB                  0xAC        /*!<   MSB AC2 coefficient                                          */
#define BMP085_AC2_LSB                  0xAD        /*!<   LSB AC2 coefficient                                          */
#define BMP085_AC3_MSB                  0xAE        /*!<   MSB AC3 coefficient                                          */
#define BMP085_AC3_LSB                  0xAF        /*!<   LSB AC3 coefficient                                          */
#define BMP085_AC4_MSB                  0xB0        /*!<   MSB AC4 coefficient                                          */
#define BMP085_AC4_LSB                  0xB1        /*!<   LSB AC4 coefficient                                          */
#define BMP085_AC5_MSB                  0xB2        /*!<   MSB AC5 coefficient                                          */
#define BMP085_AC5_LSB                  0xB3        /*!<   LSB AC5 coefficient                                          */
#define BMP085_AC6_MSB                  0xB4        /*!<   MSB AC6 coefficient                                          */
#define BMP085_AC6_LSB                  0xB5        /*!<   LSB AC6 coefficient                                          */
#define BMP085_B1_MSB                   0xB6        /*!<   MSB B1 coefficient                                           */
#define BMP085_B1_LSB                   0xB7        /*!<   LSB B1 coefficient                                           */
#define BMP085_B2_MSB                   0xB8        /*!<   MSB B2 coefficient                                           */
#define BMP085_B2_LSB                   0xB9        /*!<   LSB B2 coefficient                                           */
#define BMP085_MB_MSB                   0xBA        /*!<   MSB MB coefficient                                           */
#define BMP085_MB_LSB                   0xBB        /*!<   LSB MB coefficient                                           */
#define BMP085_MC_MSB                   0xBC        /*!<   MSB MC coefficient                                           */
#define BMP085_MC_LSB                   0xBD        /*!<   LSB MC coefficient                                           */
#define BMP085_MD_MSB                   0xBE        /*!<   MSB MD coefficient                                           */
#define BMP085_MD_LSB                   0xBF        /*!<   LSB MD coefficient                                           */


    /**
      * @brief   REGISTERS MAP
      */
#define BMP085_CONTROL                  0xF4        /*!<   Control register                                             */



    /* Commands Registers */
    /**
      * @brief   TEMPERATURE
      */
#define BMP085_TRIGGER_TEMPERATURE      0x2E        /*!<   Trigger a new Temperature measurement                        */
#define BMP085_READ_TEMPERATURE         0xF6        /*!<   Read Temperature                                             */

    /* Commands Registers */
    /**
      * @brief   PRESSURE
      */
#define BMP085_TRIGGER_PRESSURE         0x34        /*!<   Trigger a new Pressure measurement                           */
#define BMP085_READ_PRESSURE            0xF6        /*!<   Read Pressure                                                */

    typedef enum {
        PRESSURE_ULTRA_LOW_POWER_MODE     =   0,        /*!<  Pressure: Ultra low power mode.                                */
        PRESSURE_STANDARD_MODE            =   1,        /*!<  Pressure: Standard mode.                                       */
        PRESSURE_HIGH_RESOLUTION_MODE     =   2,        /*!<  Pressure: High resolution mode.                                */
        PRESSURE_ULTRA_HIGH_RES_MODE      =   3         /*!<  Pressure: Ultra high resolution mode.                          */
    } BMP085_pressure_osrs_t;




#ifndef VECTOR_STRUCT_H
#define VECTOR_STRUCT_H
    typedef struct {
        int16_t  AC1;
        int16_t  AC2;
        int16_t  AC3;
        uint16_t AC4;
        uint16_t AC5;
        uint16_t AC6;
        int16_t  B1;
        int16_t  B2;
        int16_t  MB;
        int16_t  MC;
        int16_t  MD;
    } Vector_cal_coeff_t;


    typedef struct {
        int16_t UT_Temperature;
    } Vector_temp_f;

    typedef struct {
        int32_t UP_Pressure;
    } Vector_pressure_f;

    typedef struct {
        int16_t Temperature;
        int32_t Pressure;
    } Vector_compensated_data_f;
#endif


    /**
      * @brief   INTERNAL CONSTANTS
      */
    typedef enum {
        BMP085_SUCCESS     =       0,
        BMP085_FAILURE     =       1,
        I2C_SUCCESS        =       0                                           /*!<   I2C communication was fine     */
    } BMP085_status_t;




   /** Create an BMP085 object connected to the specified I2C pins.
     *
     * @param sda     I2C data pin
     * @param scl     I2C clock pin
     * @param addr    I2C slave address
     * @param freq    I2C frequency in Hz.
     */
    BMP085 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );

    /** Delete BMP085 object.
     */
    ~BMP085();
    
    /** It gets the calibration coefficients.
     */
    BMP085_status_t  BMP085_GetCalibrationCoefficients    ( Vector_cal_coeff_t* myCalCoeff );
    
    /** It triggers a new temperature mesurement.
     */
    BMP085_status_t  BMP085_TriggerTemperature            ( void );
    
    /** It reads the raw temperature value.
     */
    BMP085_status_t  BMP085_ReadRawTemperature            ( Vector_temp_f* myRawTemperature );
    
    /** It reads the compensated/true temperature. NOT RECOMMENDED, use BMP085_CalculateCompensated_Temperature_Pressure instead!
     */
    BMP085_status_t  BMP085_ReadCompensatedTemperature    ( Vector_temp_f* myTrueTemperature, Vector_cal_coeff_t myCalCoeff );
    
    /** It triggers a new pressure mesurement.
     */
    BMP085_status_t  BMP085_TriggerPressure               ( BMP085_pressure_osrs_t myResolution );
    
    /** It reads the raw pressure value.
     */
    BMP085_status_t  BMP085_ReadRawPressure               ( Vector_pressure_f* myRawPressure );
    
    /** It calculates the compensated/true temperature and pressure values.
     */
    Vector_compensated_data_f  BMP085_CalculateCompensated_Temperature_Pressure ( Vector_cal_coeff_t myCalCoeff, Vector_temp_f myRawTemperature, Vector_pressure_f myRawPressure,
            BMP085_pressure_osrs_t myResolution );

private:
    I2C      i2c;
    uint32_t BMP085_Addr;
};

#endif