Manuel Caballero / BME280
Revision:
1:f01fab2521b1
Parent:
0:ac5ce2103c04
Child:
3:ab857b70346e
--- a/BME280.h	Tue Sep 03 14:43:44 2019 +0000
+++ b/BME280.h	Tue Sep 03 15:00:49 2019 +0000
@@ -0,0 +1,477 @@
+/**
+ * @brief       BME280.h
+ * @details     Combined humidity and pressure sensor.
+ *              Header file.
+ *
+ *
+ * @return      N/A
+ *
+ * @author      Manuel Caballero
+ * @date        03/September/2019
+ * @version     03/September/2019    The ORIGIN
+ * @pre         This is just a port from Bosh driver to mBed ( c++ )
+ * @warning     N/A
+ * @pre         This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
+ */
+/**
+ * Copyright (C) 2018 - 2019 Bosch Sensortec GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of the copyright holder nor the names of the
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ *
+ * The information provided is believed to be accurate and reliable.
+ * The copyright holder assumes no responsibility
+ * for the consequences of use
+ * of such information nor for any infringement of patents or
+ * other rights of third parties which may result from its use.
+ * No license is granted by implication or otherwise under any patent or
+ * patent rights of the copyright holder.
+ *
+ * @file    bme280.h
+ * @date    08 Mar 2019
+ * @version 3.3.6
+ * @brief
+ *
+ */
+
+/*! @file bme280.h
+ * @brief Sensor driver for BME280 sensor
+ */
+
+/*!
+ * @defgroup BME280 SENSOR API
+ */
+#ifndef BME280_H_
+#define BME280_H_
+
+#include "mbed.h"
+#include "bme280_defs.h"
+
+
+/**
+    Example:
+@code
+#include "mbed.h"
+#include "BME280.h"
+
+BME680 myBME280     ( I2C_SDA, I2C_SCL, 400000 );
+Serial pc           ( USBTX, USBRX );
+
+DigitalOut  myled       ( LED1 );
+Ticker      newReading;
+
+uint32_t    myState = 0;
+
+
+//@brief   FUNCTION PROTOTYPES
+void    changeDATA     ( void );
+void    user_delay_ms  ( uint32_t  period );
+int8_t  user_i2c_read  ( uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len );
+int8_t  user_i2c_write ( uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len );
+
+
+//@brief FUNCTION FOR APPLICATION MAIN ENTRY.
+int main()
+{
+    pc.baud ( 115200 );
+
+    myled   =   1;
+    wait(3);
+    myled   =   0;
+
+
+
+    newReading.attach( &changeDATA, 1 );                                        // the address of the function to be attached ( changeDATA ) and the interval ( 1s )
+
+    // Let the callbacks take care of everything
+    while(1) {
+        sleep();
+
+        myled = 1;
+
+        if ( myState == 1 ) {
+
+            myState  =   0;                                                             // Reset the variable
+        }
+
+        myled = 0;
+    }
+}
+
+
+
+
+ // @brief       changeDATA ( void  )
+ //
+ // @details     It changes myState variable
+ //
+ // @param[in]    N/A
+ //
+ // @param[out]   N/A.
+ //
+ //
+ // @return       N/A..
+ //
+ //
+ // @author      Manuel Caballero
+ // @date        03/September/2019
+ // @version     03/September/2019   The ORIGIN
+ // @pre         N/A
+ // @warning     N/A.
+void changeDATA ( void )
+{
+    myState = 1;
+}
+
+
+
+ // @brief       user_delay_ms ( uint32_t  )
+ //
+ // @details     Return control or wait, for a period amount of milliseconds
+ //
+ // @param[in]    period:       Delay in milliseconds.
+ //
+ // @param[out]   N/A.
+ //
+ //
+ // @return       N/A..
+ //
+ //
+ // @author      Manuel Caballero
+ // @date        03/September/2019
+ // @version     03/September/2019   The ORIGIN
+ // @pre         This is a Bosh pointer function adapted to our system.
+ // @warning     N/A.
+void user_delay_ms ( uint32_t period )
+{
+     // Return control or wait,
+     // for a period amount of milliseconds
+
+    wait_ms ( period );
+}
+
+
+
+ // @brief       user_i2c_read ( uint8_t , uint8_t reg_addr, uint8_t *reg_data, uint16_t len )
+ //
+ // @details     It adapts I2C reading functionality.
+ //
+ // @param[in]    dev_id:    I2C address.
+ // @param[in]    reg_addr:  Register to be read.
+ // @param[in]    len:       How many bytes to read.
+ //
+ // @param[out]   reg_data:  Result.
+ //
+ //
+ // @return       Status of user_i2c_read.
+ //
+ //
+ // @author      Manuel Caballero
+ // @date        03/September/2019
+ // @version     03/September/2019   The ORIGIN
+ // @pre         This is a Bosh pointer function adapted to our system.
+ // @warning     N/A.
+int8_t user_i2c_read ( uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len )
+{
+    int8_t rslt = 0; // Return 0 for Success, non-zero for failure
+
+    // The parameter dev_id can be used as a variable to store the I2C address of the device
+
+
+     // Data on the bus should be like
+     // |------------+---------------------|
+     // | I2C action | Data                |
+     // |------------+---------------------|
+     // | Start      | -                   |
+     // | Write      | (reg_addr)          |
+     // | Stop       | -                   |
+     // | Start      | -                   |
+     // | Read       | (reg_data[0])       |
+     // | Read       | (....)              |
+     // | Read       | (reg_data[len - 1]) |
+     // | Stop       | -                   |
+     // |------------+---------------------|
+
+
+
+    return rslt;
+}
+
+
+
+
+ // @brief       user_i2c_write ( uint8_t , uint8_t reg_addr, uint8_t *reg_data, uint16_t len )
+ //
+ // @details     It adapts I2C writing functionality.
+ //
+ // @param[in]    dev_id:    I2C address.
+ // @param[in]    reg_addr:  Register to be read.
+ // @param[out]   reg_data:  Data to be written.
+ // @param[in]    len:       How many bytes to read.
+ //
+ // @param[out]   N/A.
+ //
+ //
+ // @return       Status of user_i2c_write.
+ //
+ //
+ // @author      Manuel Caballero
+ // @date        03/September/2019
+ // @version     03/September/2019   The ORIGIN
+ // @pre         This is a Bosh pointer function adapted to our system.
+ // @warning     N/A.
+int8_t user_i2c_write ( uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len )
+{
+    int8_t rslt = 0; // Return 0 for Success, non-zero for failure
+
+    // The parameter dev_id can be used as a variable to store the I2C address of the device
+
+
+    // Data on the bus should be like
+    // |------------+---------------------|
+    // | I2C action | Data                |
+    // |------------+---------------------|
+    // | Start      | -                   |
+    // | Write      | (reg_addr)          |
+    // | Write      | (reg_data[0])       |
+    // | Write      | (....)              |
+    // | Write      | (reg_data[len - 1]) |
+    // | Stop       | -                   |
+    // |------------+---------------------|
+
+
+
+    return rslt;
+}
+@endcode
+*/
+
+
+
+/*!
+ Library for BME680 Low power gas, pressure, temperature & humidity sensor.
+*/
+class BME680
+{
+public:
+    /** Create an BME680 object connected to the specified I2C pins.
+      *
+      * @param sda     I2C data pin
+      * @param scl     I2C clock pin
+      * @param freq    I2C frequency
+      */
+    BME280 ( PinName sda, PinName scl, uint32_t freq );
+
+    /** Delete BME680 object.
+     */
+    ~BME280();
+
+    /*!
+     *  @brief This API is the entry point.
+     *  It reads the chip-id and calibration data from the sensor.
+     *
+     *  @param[in,out] dev : Structure instance of bme280_dev
+     *
+     *  @return Result of API execution status
+     *  @retval zero -> Success / +ve value -> Warning / -ve value -> Error
+     */
+    int8_t bme280_init(struct bme280_dev *dev);
+
+    /*!
+     * @brief This API writes the given data to the register address
+     * of the sensor.
+     *
+     * @param[in] reg_addr : Register address from where the data to be written.
+     * @param[in] reg_data : Pointer to data buffer which is to be written
+     * in the sensor.
+     * @param[in] len : No of bytes of data to write..
+     * @param[in] dev : Structure instance of bme280_dev.
+     *
+     * @return Result of API execution status
+     * @retval zero -> Success / +ve value -> Warning / -ve value -> Error
+     */
+    int8_t bme280_set_regs(uint8_t *reg_addr, const uint8_t *reg_data, uint8_t len, const struct bme280_dev *dev);
+
+    /*!
+     * @brief This API reads the data from the given register address of the sensor.
+     *
+     * @param[in] reg_addr : Register address from where the data to be read
+     * @param[out] reg_data : Pointer to data buffer to store the read data.
+     * @param[in] len : No of bytes of data to be read.
+     * @param[in] dev : Structure instance of bme280_dev.
+     *
+     * @return Result of API execution status
+     * @retval zero -> Success / +ve value -> Warning / -ve value -> Error
+     */
+    int8_t bme280_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint16_t len, const struct bme280_dev *dev);
+
+    /*!
+     * @brief This API sets the oversampling, filter and standby duration
+     * (normal mode) settings in the sensor.
+     *
+     * @param[in] dev : Structure instance of bme280_dev.
+     * @param[in] desired_settings : Variable used to select the settings which
+     * are to be set in the sensor.
+     *
+     * @note : Below are the macros to be used by the user for selecting the
+     * desired settings. User can do OR operation of these macros for configuring
+     * multiple settings.
+     *
+     * Macros         |   Functionality
+     * -----------------------|----------------------------------------------
+     * BME280_OSR_PRESS_SEL    |   To set pressure oversampling.
+     * BME280_OSR_TEMP_SEL     |   To set temperature oversampling.
+     * BME280_OSR_HUM_SEL    |   To set humidity oversampling.
+     * BME280_FILTER_SEL     |   To set filter setting.
+     * BME280_STANDBY_SEL  |   To set standby duration setting.
+     *
+     * @return Result of API execution status
+     * @retval zero -> Success / +ve value -> Warning / -ve value -> Error.
+     */
+    int8_t bme280_set_sensor_settings(uint8_t desired_settings, const struct bme280_dev *dev);
+
+    /*!
+     * @brief This API gets the oversampling, filter and standby duration
+     * (normal mode) settings from the sensor.
+     *
+     * @param[in,out] dev : Structure instance of bme280_dev.
+     *
+     * @return Result of API execution status
+     * @retval zero -> Success / +ve value -> Warning / -ve value -> Error.
+     */
+    int8_t bme280_get_sensor_settings(struct bme280_dev *dev);
+
+    /*!
+     * @brief This API sets the power mode of the sensor.
+     *
+     * @param[in] dev : Structure instance of bme280_dev.
+     * @param[in] sensor_mode : Variable which contains the power mode to be set.
+     *
+     *    sensor_mode           |   Macros
+     * ---------------------|-------------------
+     *     0                | BME280_SLEEP_MODE
+     *     1                | BME280_FORCED_MODE
+     *     3                | BME280_NORMAL_MODE
+     *
+     * @return Result of API execution status
+     * @retval zero -> Success / +ve value -> Warning / -ve value -> Error
+     */
+    int8_t bme280_set_sensor_mode(uint8_t sensor_mode, const struct bme280_dev *dev);
+
+    /*!
+     * @brief This API gets the power mode of the sensor.
+     *
+     * @param[in] dev : Structure instance of bme280_dev.
+     * @param[out] sensor_mode : Pointer variable to store the power mode.
+     *
+     *   sensor_mode            |   Macros
+     * ---------------------|-------------------
+     *     0                | BME280_SLEEP_MODE
+     *     1                | BME280_FORCED_MODE
+     *     3                | BME280_NORMAL_MODE
+     *
+     * @return Result of API execution status
+     * @retval zero -> Success / +ve value -> Warning / -ve value -> Error
+     */
+    int8_t bme280_get_sensor_mode(uint8_t *sensor_mode, const struct bme280_dev *dev);
+
+    /*!
+     * @brief This API performs the soft reset of the sensor.
+     *
+     * @param[in] dev : Structure instance of bme280_dev.
+     *
+     * @return Result of API execution status
+     * @retval zero -> Success / +ve value -> Warning / -ve value -> Error.
+     */
+    int8_t bme280_soft_reset(const struct bme280_dev *dev);
+
+    /*!
+     * @brief This API reads the pressure, temperature and humidity data from the
+     * sensor, compensates the data and store it in the bme280_data structure
+     * instance passed by the user.
+     *
+     * @param[in] sensor_comp : Variable which selects which data to be read from
+     * the sensor.
+     *
+     * sensor_comp |   Macros
+     * ------------|-------------------
+     *     1       | BME280_PRESS
+     *     2       | BME280_TEMP
+     *     4       | BME280_HUM
+     *     7       | BME280_ALL
+     *
+     * @param[out] comp_data : Structure instance of bme280_data.
+     * @param[in] dev : Structure instance of bme280_dev.
+     *
+     * @return Result of API execution status
+     * @retval zero -> Success / +ve value -> Warning / -ve value -> Error
+     */
+    int8_t bme280_get_sensor_data(uint8_t sensor_comp, struct bme280_data *comp_data, struct bme280_dev *dev);
+
+    I2C      _i2c;
+
+private:
+    /*!
+     *  @brief This API is used to parse the pressure, temperature and
+     *  humidity data and store it in the bme280_uncomp_data structure instance.
+     *
+     *  @param[in] reg_data     : Contains register data which needs to be parsed
+     *  @param[out] uncomp_data : Contains the uncompensated pressure, temperature
+     *  and humidity data.
+     */
+    void bme280_parse_sensor_data(const uint8_t *reg_data, struct bme280_uncomp_data *uncomp_data);
+
+    /*!
+     * @brief This API is used to compensate the pressure and/or
+     * temperature and/or humidity data according to the component selected by the
+     * user.
+     *
+     * @param[in] sensor_comp : Used to select pressure and/or temperature and/or
+     * humidity.
+     * @param[in] uncomp_data : Contains the uncompensated pressure, temperature and
+     * humidity data.
+     * @param[out] comp_data : Contains the compensated pressure and/or temperature
+     * and/or humidity data.
+     * @param[in] calib_data : Pointer to the calibration data structure.
+     *
+     * @return Result of API execution status.
+     * @retval zero -> Success / -ve value -> Error
+     */
+    int8_t bme280_compensate_data(uint8_t sensor_comp,
+                                  const struct bme280_uncomp_data *uncomp_data,
+                                  struct bme280_data *comp_data,
+                                  struct bme280_calib_data *calib_data);
+
+
+    uint32_t _BME280_Addr;
+};
+
+#endif /* BME280_H_ */
+/** @}*/