parent
c2e87940f2
commit
bf282b0a12
@ -0,0 +1,7 @@ |
|||||||
|
set(COMPONENT_ADD_INCLUDEDIRS |
||||||
|
"include") |
||||||
|
|
||||||
|
set(COMPONENT_SRCDIRS |
||||||
|
"src") |
||||||
|
|
||||||
|
register_component() |
@ -0,0 +1,225 @@ |
|||||||
|
/**
|
||||||
|
* Copyright (C) 2017 - 2018 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 bme680.h |
||||||
|
* @date 30 Oct 2017 |
||||||
|
* @version 3.5.3 |
||||||
|
* @brief |
||||||
|
* |
||||||
|
*/ |
||||||
|
/*! @file bme680.h
|
||||||
|
@brief Sensor driver for BME680 sensor */ |
||||||
|
/*!
|
||||||
|
* @defgroup BME680 SENSOR API |
||||||
|
* @{*/ |
||||||
|
#ifndef BME680_H_ |
||||||
|
#define BME680_H_ |
||||||
|
|
||||||
|
/*! CPP guard */ |
||||||
|
#ifdef __cplusplus |
||||||
|
extern "C" |
||||||
|
{ |
||||||
|
#endif |
||||||
|
|
||||||
|
/* Header includes */ |
||||||
|
#include "bme680_defs.h" |
||||||
|
|
||||||
|
/* function prototype declarations */ |
||||||
|
/*!
|
||||||
|
* @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 bme680_dev |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error |
||||||
|
*/ |
||||||
|
int8_t bme680_init(struct bme680_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 bme680_dev. |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error |
||||||
|
*/ |
||||||
|
int8_t bme680_set_regs(const uint8_t *reg_addr, const uint8_t *reg_data, uint8_t len, struct bme680_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 bme680_dev. |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error |
||||||
|
*/ |
||||||
|
int8_t bme680_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint16_t len, struct bme680_dev *dev); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This API performs the soft reset of the sensor. |
||||||
|
* |
||||||
|
* @param[in] dev : Structure instance of bme680_dev. |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error. |
||||||
|
*/ |
||||||
|
int8_t bme680_soft_reset(struct bme680_dev *dev); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This API is used to set the power mode of the sensor. |
||||||
|
* |
||||||
|
* @param[in] dev : Structure instance of bme680_dev |
||||||
|
* @note : Pass the value to bme680_dev.power_mode structure variable. |
||||||
|
* |
||||||
|
* value | mode |
||||||
|
* -------------|------------------ |
||||||
|
* 0x00 | BME680_SLEEP_MODE |
||||||
|
* 0x01 | BME680_FORCED_MODE |
||||||
|
* |
||||||
|
* * @return Result of API execution status |
||||||
|
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error |
||||||
|
*/ |
||||||
|
int8_t bme680_set_sensor_mode(struct bme680_dev *dev); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This API is used to get the power mode of the sensor. |
||||||
|
* |
||||||
|
* @param[in] dev : Structure instance of bme680_dev |
||||||
|
* @note : bme680_dev.power_mode structure variable hold the power mode. |
||||||
|
* |
||||||
|
* value | mode |
||||||
|
* ---------|------------------ |
||||||
|
* 0x00 | BME680_SLEEP_MODE |
||||||
|
* 0x01 | BME680_FORCED_MODE |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error |
||||||
|
*/ |
||||||
|
int8_t bme680_get_sensor_mode(struct bme680_dev *dev); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This API is used to set the profile duration of the sensor. |
||||||
|
* |
||||||
|
* @param[in] dev : Structure instance of bme680_dev. |
||||||
|
* @param[in] duration : Duration of the measurement in ms. |
||||||
|
* |
||||||
|
* @return Nothing |
||||||
|
*/ |
||||||
|
void bme680_set_profile_dur(uint16_t duration, struct bme680_dev *dev); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This API is used to get the profile duration of the sensor. |
||||||
|
* |
||||||
|
* @param[in] dev : Structure instance of bme680_dev. |
||||||
|
* @param[in] duration : Duration of the measurement in ms. |
||||||
|
* |
||||||
|
* @return Nothing |
||||||
|
*/ |
||||||
|
void bme680_get_profile_dur(uint16_t *duration, const struct bme680_dev *dev); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This API reads the pressure, temperature and humidity and gas data |
||||||
|
* from the sensor, compensates the data and store it in the bme680_data |
||||||
|
* structure instance passed by the user. |
||||||
|
* |
||||||
|
* @param[out] data: Structure instance to hold the data. |
||||||
|
* @param[in] dev : Structure instance of bme680_dev. |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error |
||||||
|
*/ |
||||||
|
int8_t bme680_get_sensor_data(struct bme680_field_data *data, struct bme680_dev *dev); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This API is used to set the oversampling, filter and T,P,H, gas selection |
||||||
|
* settings in the sensor. |
||||||
|
* |
||||||
|
* @param[in] dev : Structure instance of bme680_dev. |
||||||
|
* @param[in] desired_settings : Variable used to select the settings which |
||||||
|
* are to be set in the sensor. |
||||||
|
* |
||||||
|
* Macros | Functionality |
||||||
|
*---------------------------------|---------------------------------------------- |
||||||
|
* BME680_OST_SEL | To set temperature oversampling. |
||||||
|
* BME680_OSP_SEL | To set pressure oversampling. |
||||||
|
* BME680_OSH_SEL | To set humidity oversampling. |
||||||
|
* BME680_GAS_MEAS_SEL | To set gas measurement setting. |
||||||
|
* BME680_FILTER_SEL | To set filter setting. |
||||||
|
* BME680_HCNTRL_SEL | To set humidity control setting. |
||||||
|
* BME680_RUN_GAS_SEL | To set run gas setting. |
||||||
|
* BME680_NBCONV_SEL | To set NB conversion setting. |
||||||
|
* BME680_GAS_SENSOR_SEL | To set all gas sensor related settings |
||||||
|
* |
||||||
|
* @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. |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error. |
||||||
|
*/ |
||||||
|
int8_t bme680_set_sensor_settings(uint16_t desired_settings, struct bme680_dev *dev); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief This API is used to get the oversampling, filter and T,P,H, gas selection |
||||||
|
* settings in the sensor. |
||||||
|
* |
||||||
|
* @param[in] dev : Structure instance of bme680_dev. |
||||||
|
* @param[in] desired_settings : Variable used to select the settings which |
||||||
|
* are to be get from the sensor. |
||||||
|
* |
||||||
|
* @return Result of API execution status |
||||||
|
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error. |
||||||
|
*/ |
||||||
|
int8_t bme680_get_sensor_settings(uint16_t desired_settings, struct bme680_dev *dev); |
||||||
|
#ifdef __cplusplus |
||||||
|
} |
||||||
|
#endif /* End of CPP guard */ |
||||||
|
#endif /* BME680_H_ */ |
||||||
|
/** @}*/ |
@ -0,0 +1,512 @@ |
|||||||
|
/**
|
||||||
|
* Copyright (C) 2017 - 2018 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 bme680_defs.h |
||||||
|
* @date 30 Oct 2017 |
||||||
|
* @version 3.5.3 |
||||||
|
* @brief |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
/*! @file bme680_defs.h
|
||||||
|
@brief Sensor driver for BME680 sensor */ |
||||||
|
/*!
|
||||||
|
* @defgroup BME680 SENSOR API |
||||||
|
* @brief |
||||||
|
* @{*/ |
||||||
|
#ifndef BME680_DEFS_H_ |
||||||
|
#define BME680_DEFS_H_ |
||||||
|
|
||||||
|
/********************************************************/ |
||||||
|
/* header includes */ |
||||||
|
#ifdef __KERNEL__ |
||||||
|
#include <linux/types.h> |
||||||
|
#include <linux/kernel.h> |
||||||
|
#else |
||||||
|
#include <stdint.h> |
||||||
|
#include <stddef.h> |
||||||
|
#endif |
||||||
|
|
||||||
|
/******************************************************************************/ |
||||||
|
/*! @name Common macros */ |
||||||
|
/******************************************************************************/ |
||||||
|
|
||||||
|
#if !defined(UINT8_C) && !defined(INT8_C) |
||||||
|
#define INT8_C(x) S8_C(x) |
||||||
|
#define UINT8_C(x) U8_C(x) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if !defined(UINT16_C) && !defined(INT16_C) |
||||||
|
#define INT16_C(x) S16_C(x) |
||||||
|
#define UINT16_C(x) U16_C(x) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if !defined(INT32_C) && !defined(UINT32_C) |
||||||
|
#define INT32_C(x) S32_C(x) |
||||||
|
#define UINT32_C(x) U32_C(x) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if !defined(INT64_C) && !defined(UINT64_C) |
||||||
|
#define INT64_C(x) S64_C(x) |
||||||
|
#define UINT64_C(x) U64_C(x) |
||||||
|
#endif |
||||||
|
|
||||||
|
/**@}*/ |
||||||
|
|
||||||
|
/**\name C standard macros */ |
||||||
|
#ifndef NULL |
||||||
|
#ifdef __cplusplus |
||||||
|
#define NULL 0 |
||||||
|
#else |
||||||
|
#define NULL ((void *) 0) |
||||||
|
#endif |
||||||
|
#endif |
||||||
|
|
||||||
|
/** BME680 General config */ |
||||||
|
#define BME680_POLL_PERIOD_MS UINT8_C(10) |
||||||
|
|
||||||
|
/** BME680 I2C addresses */ |
||||||
|
#define BME680_I2C_ADDR_PRIMARY UINT8_C(0x76) |
||||||
|
#define BME680_I2C_ADDR_SECONDARY UINT8_C(0x77) |
||||||
|
|
||||||
|
/** BME680 unique chip identifier */ |
||||||
|
#define BME680_CHIP_ID UINT8_C(0x61) |
||||||
|
|
||||||
|
/** BME680 coefficients related defines */ |
||||||
|
#define BME680_COEFF_SIZE UINT8_C(0x41) |
||||||
|
#define BME680_COEFF_ADDR1_LEN UINT8_C(25) |
||||||
|
#define BME680_COEFF_ADDR2_LEN UINT8_C(16) |
||||||
|
|
||||||
|
/** BME680 field_x related defines */ |
||||||
|
#define BME680_FIELD_LENGTH UINT8_C(15) |
||||||
|
#define BME680_FIELD_ADDR_OFFSET UINT8_C(17) |
||||||
|
|
||||||
|
/** Soft reset command */ |
||||||
|
#define BME680_SOFT_RESET_CMD UINT8_C(0xb6) |
||||||
|
|
||||||
|
/** Error code definitions */ |
||||||
|
#define BME680_OK INT8_C(0) |
||||||
|
/* Errors */ |
||||||
|
#define BME680_E_NULL_PTR INT8_C(-1) |
||||||
|
#define BME680_E_COM_FAIL INT8_C(-2) |
||||||
|
#define BME680_E_DEV_NOT_FOUND INT8_C(-3) |
||||||
|
#define BME680_E_INVALID_LENGTH INT8_C(-4) |
||||||
|
|
||||||
|
/* Warnings */ |
||||||
|
#define BME680_W_DEFINE_PWR_MODE INT8_C(1) |
||||||
|
#define BME680_W_NO_NEW_DATA INT8_C(2) |
||||||
|
|
||||||
|
/* Info's */ |
||||||
|
#define BME680_I_MIN_CORRECTION UINT8_C(1) |
||||||
|
#define BME680_I_MAX_CORRECTION UINT8_C(2) |
||||||
|
|
||||||
|
/** Register map */ |
||||||
|
/** Other coefficient's address */ |
||||||
|
#define BME680_ADDR_RES_HEAT_VAL_ADDR UINT8_C(0x00) |
||||||
|
#define BME680_ADDR_RES_HEAT_RANGE_ADDR UINT8_C(0x02) |
||||||
|
#define BME680_ADDR_RANGE_SW_ERR_ADDR UINT8_C(0x04) |
||||||
|
#define BME680_ADDR_SENS_CONF_START UINT8_C(0x5A) |
||||||
|
#define BME680_ADDR_GAS_CONF_START UINT8_C(0x64) |
||||||
|
|
||||||
|
/** Field settings */ |
||||||
|
#define BME680_FIELD0_ADDR UINT8_C(0x1d) |
||||||
|
|
||||||
|
/** Heater settings */ |
||||||
|
#define BME680_RES_HEAT0_ADDR UINT8_C(0x5a) |
||||||
|
#define BME680_GAS_WAIT0_ADDR UINT8_C(0x64) |
||||||
|
|
||||||
|
/** Sensor configuration registers */ |
||||||
|
#define BME680_CONF_HEAT_CTRL_ADDR UINT8_C(0x70) |
||||||
|
#define BME680_CONF_ODR_RUN_GAS_NBC_ADDR UINT8_C(0x71) |
||||||
|
#define BME680_CONF_OS_H_ADDR UINT8_C(0x72) |
||||||
|
#define BME680_MEM_PAGE_ADDR UINT8_C(0xf3) |
||||||
|
#define BME680_CONF_T_P_MODE_ADDR UINT8_C(0x74) |
||||||
|
#define BME680_CONF_ODR_FILT_ADDR UINT8_C(0x75) |
||||||
|
|
||||||
|
/** Coefficient's address */ |
||||||
|
#define BME680_COEFF_ADDR1 UINT8_C(0x89) |
||||||
|
#define BME680_COEFF_ADDR2 UINT8_C(0xe1) |
||||||
|
|
||||||
|
/** Chip identifier */ |
||||||
|
#define BME680_CHIP_ID_ADDR UINT8_C(0xd0) |
||||||
|
|
||||||
|
/** Soft reset register */ |
||||||
|
#define BME680_SOFT_RESET_ADDR UINT8_C(0xe0) |
||||||
|
|
||||||
|
/** Heater control settings */ |
||||||
|
#define BME680_ENABLE_HEATER UINT8_C(0x00) |
||||||
|
#define BME680_DISABLE_HEATER UINT8_C(0x08) |
||||||
|
|
||||||
|
/** Gas measurement settings */ |
||||||
|
#define BME680_DISABLE_GAS_MEAS UINT8_C(0x00) |
||||||
|
#define BME680_ENABLE_GAS_MEAS UINT8_C(0x01) |
||||||
|
|
||||||
|
/** Over-sampling settings */ |
||||||
|
#define BME680_OS_NONE UINT8_C(0) |
||||||
|
#define BME680_OS_1X UINT8_C(1) |
||||||
|
#define BME680_OS_2X UINT8_C(2) |
||||||
|
#define BME680_OS_4X UINT8_C(3) |
||||||
|
#define BME680_OS_8X UINT8_C(4) |
||||||
|
#define BME680_OS_16X UINT8_C(5) |
||||||
|
|
||||||
|
/** IIR filter settings */ |
||||||
|
#define BME680_FILTER_SIZE_0 UINT8_C(0) |
||||||
|
#define BME680_FILTER_SIZE_1 UINT8_C(1) |
||||||
|
#define BME680_FILTER_SIZE_3 UINT8_C(2) |
||||||
|
#define BME680_FILTER_SIZE_7 UINT8_C(3) |
||||||
|
#define BME680_FILTER_SIZE_15 UINT8_C(4) |
||||||
|
#define BME680_FILTER_SIZE_31 UINT8_C(5) |
||||||
|
#define BME680_FILTER_SIZE_63 UINT8_C(6) |
||||||
|
#define BME680_FILTER_SIZE_127 UINT8_C(7) |
||||||
|
|
||||||
|
/** Power mode settings */ |
||||||
|
#define BME680_SLEEP_MODE UINT8_C(0) |
||||||
|
#define BME680_FORCED_MODE UINT8_C(1) |
||||||
|
|
||||||
|
/** Delay related macro declaration */ |
||||||
|
#define BME680_RESET_PERIOD UINT32_C(10) |
||||||
|
|
||||||
|
/** SPI memory page settings */ |
||||||
|
#define BME680_MEM_PAGE0 UINT8_C(0x10) |
||||||
|
#define BME680_MEM_PAGE1 UINT8_C(0x00) |
||||||
|
|
||||||
|
/** Ambient humidity shift value for compensation */ |
||||||
|
#define BME680_HUM_REG_SHIFT_VAL UINT8_C(4) |
||||||
|
|
||||||
|
/** Run gas enable and disable settings */ |
||||||
|
#define BME680_RUN_GAS_DISABLE UINT8_C(0) |
||||||
|
#define BME680_RUN_GAS_ENABLE UINT8_C(1) |
||||||
|
|
||||||
|
/** Buffer length macro declaration */ |
||||||
|
#define BME680_TMP_BUFFER_LENGTH UINT8_C(40) |
||||||
|
#define BME680_REG_BUFFER_LENGTH UINT8_C(6) |
||||||
|
#define BME680_FIELD_DATA_LENGTH UINT8_C(3) |
||||||
|
#define BME680_GAS_REG_BUF_LENGTH UINT8_C(20) |
||||||
|
#define BME680_GAS_HEATER_PROF_LEN_MAX UINT8_C(10) |
||||||
|
|
||||||
|
/** Settings selector */ |
||||||
|
#define BME680_OST_SEL UINT16_C(1) |
||||||
|
#define BME680_OSP_SEL UINT16_C(2) |
||||||
|
#define BME680_OSH_SEL UINT16_C(4) |
||||||
|
#define BME680_GAS_MEAS_SEL UINT16_C(8) |
||||||
|
#define BME680_FILTER_SEL UINT16_C(16) |
||||||
|
#define BME680_HCNTRL_SEL UINT16_C(32) |
||||||
|
#define BME680_RUN_GAS_SEL UINT16_C(64) |
||||||
|
#define BME680_NBCONV_SEL UINT16_C(128) |
||||||
|
#define BME680_GAS_SENSOR_SEL (BME680_GAS_MEAS_SEL | BME680_RUN_GAS_SEL | BME680_NBCONV_SEL) |
||||||
|
|
||||||
|
/** Number of conversion settings*/ |
||||||
|
#define BME680_NBCONV_MIN UINT8_C(0) |
||||||
|
#define BME680_NBCONV_MAX UINT8_C(10) |
||||||
|
|
||||||
|
/** Mask definitions */ |
||||||
|
#define BME680_GAS_MEAS_MSK UINT8_C(0x30) |
||||||
|
#define BME680_NBCONV_MSK UINT8_C(0X0F) |
||||||
|
#define BME680_FILTER_MSK UINT8_C(0X1C) |
||||||
|
#define BME680_OST_MSK UINT8_C(0XE0) |
||||||
|
#define BME680_OSP_MSK UINT8_C(0X1C) |
||||||
|
#define BME680_OSH_MSK UINT8_C(0X07) |
||||||
|
#define BME680_HCTRL_MSK UINT8_C(0x08) |
||||||
|
#define BME680_RUN_GAS_MSK UINT8_C(0x10) |
||||||
|
#define BME680_MODE_MSK UINT8_C(0x03) |
||||||
|
#define BME680_RHRANGE_MSK UINT8_C(0x30) |
||||||
|
#define BME680_RSERROR_MSK UINT8_C(0xf0) |
||||||
|
#define BME680_NEW_DATA_MSK UINT8_C(0x80) |
||||||
|
#define BME680_GAS_INDEX_MSK UINT8_C(0x0f) |
||||||
|
#define BME680_GAS_RANGE_MSK UINT8_C(0x0f) |
||||||
|
#define BME680_GASM_VALID_MSK UINT8_C(0x20) |
||||||
|
#define BME680_HEAT_STAB_MSK UINT8_C(0x10) |
||||||
|
#define BME680_MEM_PAGE_MSK UINT8_C(0x10) |
||||||
|
#define BME680_SPI_RD_MSK UINT8_C(0x80) |
||||||
|
#define BME680_SPI_WR_MSK UINT8_C(0x7f) |
||||||
|
#define BME680_BIT_H1_DATA_MSK UINT8_C(0x0F) |
||||||
|
|
||||||
|
/** Bit position definitions for sensor settings */ |
||||||
|
#define BME680_GAS_MEAS_POS UINT8_C(4) |
||||||
|
#define BME680_FILTER_POS UINT8_C(2) |
||||||
|
#define BME680_OST_POS UINT8_C(5) |
||||||
|
#define BME680_OSP_POS UINT8_C(2) |
||||||
|
#define BME680_RUN_GAS_POS UINT8_C(4) |
||||||
|
|
||||||
|
/** Array Index to Field data mapping for Calibration Data*/ |
||||||
|
#define BME680_T2_LSB_REG (1) |
||||||
|
#define BME680_T2_MSB_REG (2) |
||||||
|
#define BME680_T3_REG (3) |
||||||
|
#define BME680_P1_LSB_REG (5) |
||||||
|
#define BME680_P1_MSB_REG (6) |
||||||
|
#define BME680_P2_LSB_REG (7) |
||||||
|
#define BME680_P2_MSB_REG (8) |
||||||
|
#define BME680_P3_REG (9) |
||||||
|
#define BME680_P4_LSB_REG (11) |
||||||
|
#define BME680_P4_MSB_REG (12) |
||||||
|
#define BME680_P5_LSB_REG (13) |
||||||
|
#define BME680_P5_MSB_REG (14) |
||||||
|
#define BME680_P7_REG (15) |
||||||
|
#define BME680_P6_REG (16) |
||||||
|
#define BME680_P8_LSB_REG (19) |
||||||
|
#define BME680_P8_MSB_REG (20) |
||||||
|
#define BME680_P9_LSB_REG (21) |
||||||
|
#define BME680_P9_MSB_REG (22) |
||||||
|
#define BME680_P10_REG (23) |
||||||
|
#define BME680_H2_MSB_REG (25) |
||||||
|
#define BME680_H2_LSB_REG (26) |
||||||
|
#define BME680_H1_LSB_REG (26) |
||||||
|
#define BME680_H1_MSB_REG (27) |
||||||
|
#define BME680_H3_REG (28) |
||||||
|
#define BME680_H4_REG (29) |
||||||
|
#define BME680_H5_REG (30) |
||||||
|
#define BME680_H6_REG (31) |
||||||
|
#define BME680_H7_REG (32) |
||||||
|
#define BME680_T1_LSB_REG (33) |
||||||
|
#define BME680_T1_MSB_REG (34) |
||||||
|
#define BME680_GH2_LSB_REG (35) |
||||||
|
#define BME680_GH2_MSB_REG (36) |
||||||
|
#define BME680_GH1_REG (37) |
||||||
|
#define BME680_GH3_REG (38) |
||||||
|
|
||||||
|
/** BME680 register buffer index settings*/ |
||||||
|
#define BME680_REG_FILTER_INDEX UINT8_C(5) |
||||||
|
#define BME680_REG_TEMP_INDEX UINT8_C(4) |
||||||
|
#define BME680_REG_PRES_INDEX UINT8_C(4) |
||||||
|
#define BME680_REG_HUM_INDEX UINT8_C(2) |
||||||
|
#define BME680_REG_NBCONV_INDEX UINT8_C(1) |
||||||
|
#define BME680_REG_RUN_GAS_INDEX UINT8_C(1) |
||||||
|
#define BME680_REG_HCTRL_INDEX UINT8_C(0) |
||||||
|
|
||||||
|
/** Macro to combine two 8 bit data's to form a 16 bit data */ |
||||||
|
#define BME680_CONCAT_BYTES(msb, lsb) (((uint16_t)msb << 8) | (uint16_t)lsb) |
||||||
|
|
||||||
|
/** Macro to SET and GET BITS of a register */ |
||||||
|
#define BME680_SET_BITS(reg_data, bitname, data) \ |
||||||
|
((reg_data & ~(bitname##_MSK)) | \
|
||||||
|
((data << bitname##_POS) & bitname##_MSK)) |
||||||
|
#define BME680_GET_BITS(reg_data, bitname) ((reg_data & (bitname##_MSK)) >> \ |
||||||
|
(bitname##_POS)) |
||||||
|
|
||||||
|
/** Macro variant to handle the bitname position if it is zero */ |
||||||
|
#define BME680_SET_BITS_POS_0(reg_data, bitname, data) \ |
||||||
|
((reg_data & ~(bitname##_MSK)) | \
|
||||||
|
(data & bitname##_MSK)) |
||||||
|
#define BME680_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK)) |
||||||
|
|
||||||
|
/** Type definitions */ |
||||||
|
/*
|
||||||
|
* Generic communication function pointer |
||||||
|
* @param[in] dev_id: Place holder to store the id of the device structure |
||||||
|
* Can be used to store the index of the Chip select or |
||||||
|
* I2C address of the device. |
||||||
|
* @param[in] reg_addr: Used to select the register the where data needs to |
||||||
|
* be read from or written to. |
||||||
|
* @param[in/out] reg_data: Data array to read/write |
||||||
|
* @param[in] len: Length of the data array |
||||||
|
*/ |
||||||
|
typedef int8_t (*bme680_com_fptr_t)(uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len); |
||||||
|
|
||||||
|
/*
|
||||||
|
* Delay function pointer |
||||||
|
* @param[in] period: Time period in milliseconds |
||||||
|
*/ |
||||||
|
typedef void (*bme680_delay_fptr_t)(uint32_t period); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Interface selection Enumerations |
||||||
|
*/ |
||||||
|
enum bme680_intf { |
||||||
|
/*! SPI interface */ |
||||||
|
BME680_SPI_INTF, |
||||||
|
/*! I2C interface */ |
||||||
|
BME680_I2C_INTF |
||||||
|
}; |
||||||
|
|
||||||
|
/* structure definitions */ |
||||||
|
/*!
|
||||||
|
* @brief Sensor field data structure |
||||||
|
*/ |
||||||
|
struct bme680_field_data { |
||||||
|
/*! Contains new_data, gasm_valid & heat_stab */ |
||||||
|
uint8_t status; |
||||||
|
/*! The index of the heater profile used */ |
||||||
|
uint8_t gas_index; |
||||||
|
/*! Measurement index to track order */ |
||||||
|
uint8_t meas_index; |
||||||
|
/*! Temperature in degree celsius x100 */ |
||||||
|
int16_t temperature; |
||||||
|
/*! Pressure in Pascal */ |
||||||
|
uint32_t pressure; |
||||||
|
/*! Humidity in % relative humidity x1000 */ |
||||||
|
uint32_t humidity; |
||||||
|
/*! Gas resistance in Ohms */ |
||||||
|
uint32_t gas_resistance; |
||||||
|
}; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Structure to hold the Calibration data |
||||||
|
*/ |
||||||
|
struct bme680_calib_data { |
||||||
|
/*! Variable to store calibrated humidity data */ |
||||||
|
uint16_t par_h1; |
||||||
|
/*! Variable to store calibrated humidity data */ |
||||||
|
uint16_t par_h2; |
||||||
|
/*! Variable to store calibrated humidity data */ |
||||||
|
int8_t par_h3; |
||||||
|
/*! Variable to store calibrated humidity data */ |
||||||
|
int8_t par_h4; |
||||||
|
/*! Variable to store calibrated humidity data */ |
||||||
|
int8_t par_h5; |
||||||
|
/*! Variable to store calibrated humidity data */ |
||||||
|
uint8_t par_h6; |
||||||
|
/*! Variable to store calibrated humidity data */ |
||||||
|
int8_t par_h7; |
||||||
|
/*! Variable to store calibrated gas data */ |
||||||
|
int8_t par_gh1; |
||||||
|
/*! Variable to store calibrated gas data */ |
||||||
|
int16_t par_gh2; |
||||||
|
/*! Variable to store calibrated gas data */ |
||||||
|
int8_t par_gh3; |
||||||
|
/*! Variable to store calibrated temperature data */ |
||||||
|
uint16_t par_t1; |
||||||
|
/*! Variable to store calibrated temperature data */ |
||||||
|
int16_t par_t2; |
||||||
|
/*! Variable to store calibrated temperature data */ |
||||||
|
int8_t par_t3; |
||||||
|
/*! Variable to store calibrated pressure data */ |
||||||
|
uint16_t par_p1; |
||||||
|
/*! Variable to store calibrated pressure data */ |
||||||
|
int16_t par_p2; |
||||||
|
/*! Variable to store calibrated pressure data */ |
||||||
|
int8_t par_p3; |
||||||
|
/*! Variable to store calibrated pressure data */ |
||||||
|
int16_t par_p4; |
||||||
|
/*! Variable to store calibrated pressure data */ |
||||||
|
int16_t par_p5; |
||||||
|
/*! Variable to store calibrated pressure data */ |
||||||
|
int8_t par_p6; |
||||||
|
/*! Variable to store calibrated pressure data */ |
||||||
|
int8_t par_p7; |
||||||
|
/*! Variable to store calibrated pressure data */ |
||||||
|
int16_t par_p8; |
||||||
|
/*! Variable to store calibrated pressure data */ |
||||||
|
int16_t par_p9; |
||||||
|
/*! Variable to store calibrated pressure data */ |
||||||
|
uint8_t par_p10; |
||||||
|
/*! Variable to store t_fine size */ |
||||||
|
int32_t t_fine; |
||||||
|
/*! Variable to store heater resistance range */ |
||||||
|
uint8_t res_heat_range; |
||||||
|
/*! Variable to store heater resistance value */ |
||||||
|
int8_t res_heat_val; |
||||||
|
/*! Variable to store error range */ |
||||||
|
int8_t range_sw_err; |
||||||
|
}; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief BME680 sensor settings structure which comprises of ODR, |
||||||
|
* over-sampling and filter settings. |
||||||
|
*/ |
||||||
|
struct bme680_tph_sett { |
||||||
|
/*! Humidity oversampling */ |
||||||
|
uint8_t os_hum; |
||||||
|
/*! Temperature oversampling */ |
||||||
|
uint8_t os_temp; |
||||||
|
/*! Pressure oversampling */ |
||||||
|
uint8_t os_pres; |
||||||
|
/*! Filter coefficient */ |
||||||
|
uint8_t filter; |
||||||
|
}; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief BME680 gas sensor which comprises of gas settings |
||||||
|
* and status parameters |
||||||
|
*/ |
||||||
|
struct bme680_gas_sett { |
||||||
|
/*! Variable to store nb conversion */ |
||||||
|
uint8_t nb_conv; |
||||||
|
/*! Variable to store heater control */ |
||||||
|
uint8_t heatr_ctrl; |
||||||
|
/*! Run gas enable value */ |
||||||
|
uint8_t run_gas; |
||||||
|
/*! Pointer to store heater temperature */ |
||||||
|
uint16_t heatr_temp; |
||||||
|
/*! Pointer to store duration profile */ |
||||||
|
uint16_t heatr_dur; |
||||||
|
}; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief BME680 device structure |
||||||
|
*/ |
||||||
|
struct bme680_dev { |
||||||
|
/*! Chip Id */ |
||||||
|
uint8_t chip_id; |
||||||
|
/*! Device Id */ |
||||||
|
uint8_t dev_id; |
||||||
|
/*! SPI/I2C interface */ |
||||||
|
enum bme680_intf intf; |
||||||
|
/*! Memory page used */ |
||||||
|
uint8_t mem_page; |
||||||
|
/*! Ambient temperature in Degree C*/ |
||||||
|
int8_t amb_temp; |
||||||
|
/*! Sensor calibration data */ |
||||||
|
struct bme680_calib_data calib; |
||||||
|
/*! Sensor settings */ |
||||||
|
struct bme680_tph_sett tph_sett; |
||||||
|
/*! Gas Sensor settings */ |
||||||
|
struct bme680_gas_sett gas_sett; |
||||||
|
/*! Sensor power modes */ |
||||||
|
uint8_t power_mode; |
||||||
|
/*! New sensor fields */ |
||||||
|
uint8_t new_fields; |
||||||
|
/*! Store the info messages */ |
||||||
|
uint8_t info_msg; |
||||||
|
/*! Burst read structure */ |
||||||
|
bme680_com_fptr_t read; |
||||||
|
/*! Burst write structure */ |
||||||
|
bme680_com_fptr_t write; |
||||||
|
/*! Delay in ms */ |
||||||
|
bme680_delay_fptr_t delay_ms; |
||||||
|
/*! Communication function result */ |
||||||
|
int8_t com_rslt; |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* BME680_DEFS_H_ */ |
||||||
|
/** @}*/ |
||||||
|
/** @}*/ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,61 @@ |
|||||||
|
#include <esp_err.h> |
||||||
|
#include <driver/i2c.h> |
||||||
|
#include "i2c_utils.h" |
||||||
|
|
||||||
|
esp_err_t i2c_reg_read_byte(i2c_cmd_handle_t chain, uint8_t dev_addr, uint8_t reg_addr, uint8_t *dest) |
||||||
|
{ |
||||||
|
esp_err_t suc; |
||||||
|
#define TRY(x) suc=x;if(suc!=ESP_OK)return suc; |
||||||
|
TRY(i2c_master_start(chain)); |
||||||
|
TRY(i2c_master_write_byte(chain, (dev_addr << 1) | I2C_MASTER_WRITE, /*check ack*/true)); |
||||||
|
TRY(i2c_master_write_byte(chain, reg_addr, /*check ack*/true)); |
||||||
|
|
||||||
|
TRY(i2c_master_start(chain)); |
||||||
|
TRY(i2c_master_write_byte(chain, (dev_addr << 1) | I2C_MASTER_READ, /*check ack*/true)); |
||||||
|
TRY(i2c_master_read_byte(chain, dest, I2C_MASTER_NACK)); |
||||||
|
TRY(i2c_master_stop(chain)); |
||||||
|
return ESP_OK; |
||||||
|
#undef TRY |
||||||
|
} |
||||||
|
|
||||||
|
esp_err_t i2c_reg_read(i2c_cmd_handle_t chain, uint8_t dev_addr, uint8_t reg_addr, uint8_t *dest, size_t count) |
||||||
|
{ |
||||||
|
esp_err_t suc; |
||||||
|
#define TRY(x) suc=x;if(suc!=ESP_OK)return suc; |
||||||
|
TRY(i2c_master_start(chain)); |
||||||
|
TRY(i2c_master_write_byte(chain, (dev_addr << 1) | I2C_MASTER_WRITE, /*check ack*/true)); |
||||||
|
TRY(i2c_master_write_byte(chain, reg_addr, /*check ack*/true)); |
||||||
|
|
||||||
|
TRY(i2c_master_start(chain)); |
||||||
|
TRY(i2c_master_write_byte(chain, (dev_addr << 1) | I2C_MASTER_READ, /*check ack*/true)); |
||||||
|
TRY(i2c_master_read(chain, dest, count, I2C_MASTER_LAST_NACK)); |
||||||
|
TRY(i2c_master_stop(chain)); |
||||||
|
return ESP_OK; |
||||||
|
#undef TRY |
||||||
|
} |
||||||
|
|
||||||
|
esp_err_t i2c_reg_write_byte(i2c_cmd_handle_t chain, uint8_t dev_addr, uint8_t reg_addr, uint8_t value) |
||||||
|
{ |
||||||
|
esp_err_t suc; |
||||||
|
#define TRY(x) suc=x;if(suc!=ESP_OK)return suc; |
||||||
|
TRY(i2c_master_start(chain)); |
||||||
|
TRY(i2c_master_write_byte(chain, (dev_addr << 1) | I2C_MASTER_WRITE, true)); |
||||||
|
TRY(i2c_master_write_byte(chain, reg_addr, true)); |
||||||
|
TRY(i2c_master_write_byte(chain, value, true)); |
||||||
|
TRY(i2c_master_stop(chain)); |
||||||
|
return ESP_OK; |
||||||
|
#undef TRY |
||||||
|
} |
||||||
|
|
||||||
|
esp_err_t i2c_reg_write(i2c_cmd_handle_t chain, uint8_t dev_addr, uint8_t reg_addr, const uint8_t *values, size_t count) |
||||||
|
{ |
||||||
|
esp_err_t suc; |
||||||
|
#define TRY(x) suc=x;if(suc!=ESP_OK)return suc; |
||||||
|
TRY(i2c_master_start(chain)); |
||||||
|
TRY(i2c_master_write_byte(chain, (dev_addr << 1) | I2C_MASTER_WRITE, true)); |
||||||
|
TRY(i2c_master_write_byte(chain, reg_addr, true)); |
||||||
|
TRY(i2c_master_write(chain, (uint8_t*)values, count, true)); |
||||||
|
TRY(i2c_master_stop(chain)); |
||||||
|
return ESP_OK; |
||||||
|
#undef TRY |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
/**
|
||||||
|
* TODO file description |
||||||
|
* |
||||||
|
* Created on 2021/12/12. |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef ESPNODE_I2C_UTILS_H |
||||||
|
#define ESPNODE_I2C_UTILS_H |
||||||
|
|
||||||
|
esp_err_t i2c_reg_read_byte(i2c_cmd_handle_t chain, uint8_t dev_addr, uint8_t reg_addr, uint8_t *dest); |
||||||
|
esp_err_t i2c_reg_read(i2c_cmd_handle_t chain, uint8_t dev_addr, uint8_t reg_addr, uint8_t *dest, size_t count); |
||||||
|
esp_err_t i2c_reg_write_byte(i2c_cmd_handle_t chain, uint8_t dev_addr, uint8_t reg_addr, uint8_t value); |
||||||
|
esp_err_t i2c_reg_write(i2c_cmd_handle_t chain, uint8_t dev_addr, uint8_t reg_addr, const uint8_t *values, size_t count); |
||||||
|
|
||||||
|
#endif //ESPNODE_I2C_UTILS_H
|
@ -0,0 +1,33 @@ |
|||||||
|
#include <esp_log.h> |
||||||
|
#include "periph_init.h" |
||||||
|
#include "driver/i2c.h" |
||||||
|
|
||||||
|
static const char *TAG = "periph_init"; |
||||||
|
|
||||||
|
esp_err_t periph_init() { |
||||||
|
esp_err_t rv; |
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Init I2C"); |
||||||
|
|
||||||
|
int i2c_master_port = I2C_NUM_0; |
||||||
|
i2c_config_t conf = { |
||||||
|
.mode = I2C_MODE_MASTER, |
||||||
|
.sda_io_num = CONFIG_PIN_I2C_SDA0, |
||||||
|
.sda_pullup_en = GPIO_PULLUP_ENABLE, // is this enough?
|
||||||
|
.scl_io_num = CONFIG_PIN_I2C_SCL0, |
||||||
|
.scl_pullup_en = GPIO_PULLUP_ENABLE, |
||||||
|
.master.clk_speed = 100000, |
||||||
|
}; |
||||||
|
rv = i2c_param_config(i2c_master_port, &conf); |
||||||
|
if (rv != ESP_OK) { |
||||||
|
ESP_LOGE(TAG, "Err in i2c_param_config"); |
||||||
|
return rv; |
||||||
|
} |
||||||
|
rv = i2c_driver_install(i2c_master_port, conf.mode, 0, 0, 0); |
||||||
|
if (rv != ESP_OK) { |
||||||
|
ESP_LOGE(TAG, "Err in i2c_driver_install"); |
||||||
|
return rv; |
||||||
|
} |
||||||
|
|
||||||
|
return ESP_OK; |
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
/**
|
||||||
|
* TODO file description |
||||||
|
* |
||||||
|
* Created on 2021/12/12. |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef ESPNODE_PERIPH_INIT_H |
||||||
|
#define ESPNODE_PERIPH_INIT_H |
||||||
|
|
||||||
|
#include <esp_err.h> |
||||||
|
|
||||||
|
esp_err_t periph_init(); |
||||||
|
|
||||||
|
#endif //ESPNODE_PERIPH_INIT_H
|
@ -0,0 +1,268 @@ |
|||||||
|
//
|
||||||
|
// Created by MightyPork on 2017/11/17.
|
||||||
|
//
|
||||||
|
|
||||||
|
#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG |
||||||
|
|
||||||
|
#include <esp_log.h> |
||||||
|
#include <esp_err.h> |
||||||
|
#include <freertos/FreeRTOS.h> |
||||||
|
#include <freertos/task.h> |
||||||
|
#include <driver/i2c.h> |
||||||
|
#include "voc_sensor.h" |
||||||
|
|
||||||
|
struct bme680_dev gas_sensor; |
||||||
|
|
||||||
|
static const char *TAG = "vocsensor"; |
||||||
|
|
||||||
|
#define i2c_num I2C_NUM_0 |
||||||
|
#define WRITE_BIT I2C_MASTER_WRITE /*!< I2C master write */ |
||||||
|
#define READ_BIT I2C_MASTER_READ /*!< I2C master read */ |
||||||
|
#define ACK_CHECK_EN 0x1 /*!< I2C master will check ack from slave*/ |
||||||
|
#define ACK_CHECK_DIS 0x0 /*!< I2C master will not check ack from slave */ |
||||||
|
#define ACK_VAL 0x0 /*!< I2C ack value */ |
||||||
|
#define NACK_VAL 0x1 /*!< I2C nack value */ |
||||||
|
|
||||||
|
static void user_delay_ms(uint32_t period) { |
||||||
|
/*
|
||||||
|
* Return control or wait, |
||||||
|
* for a period amount of milliseconds |
||||||
|
*/ |
||||||
|
vTaskDelay(pdMS_TO_TICKS(period)); |
||||||
|
} |
||||||
|
|
||||||
|
#if 0 |
||||||
|
static int8_t user_spi_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 select which Chip Select pin has |
||||||
|
* to be set low to activate the relevant device on the SPI bus |
||||||
|
*/ |
||||||
|
|
||||||
|
/*
|
||||||
|
* Data on the bus should be like |
||||||
|
* |----------------+---------------------+-------------| |
||||||
|
* | MOSI | MISO | Chip Select | |
||||||
|
* |----------------+---------------------|-------------| |
||||||
|
* | (don't care) | (don't care) | HIGH | |
||||||
|
* | (reg_addr) | (don't care) | LOW | |
||||||
|
* | (don't care) | (reg_data[0]) | LOW | |
||||||
|
* | (....) | (....) | LOW | |
||||||
|
* | (don't care) | (reg_data[len - 1]) | LOW | |
||||||
|
* | (don't care) | (don't care) | HIGH | |
||||||
|
* |----------------+---------------------|-------------| |
||||||
|
*/ |
||||||
|
|
||||||
|
return rslt; |
||||||
|
} |
||||||
|
|
||||||
|
static int8_t user_spi_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 select which Chip Select pin has |
||||||
|
* to be set low to activate the relevant device on the SPI bus |
||||||
|
*/ |
||||||
|
|
||||||
|
/*
|
||||||
|
* Data on the bus should be like |
||||||
|
* |---------------------+--------------+-------------| |
||||||
|
* | MOSI | MISO | Chip Select | |
||||||
|
* |---------------------+--------------|-------------| |
||||||
|
* | (don't care) | (don't care) | HIGH | |
||||||
|
* | (reg_addr) | (don't care) | LOW | |
||||||
|
* | (reg_data[0]) | (don't care) | LOW | |
||||||
|
* | (....) | (....) | LOW | |
||||||
|
* | (reg_data[len - 1]) | (don't care) | LOW | |
||||||
|
* | (don't care) | (don't care) | HIGH | |
||||||
|
* |---------------------+--------------|-------------| |
||||||
|
*/ |
||||||
|
|
||||||
|
return rslt; |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
static int8_t user_i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *data_rd, uint16_t size) { |
||||||
|
ESP_LOGD(TAG, "BME680 i2c read"); |
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 | - | |
||||||
|
* |------------+---------------------| |
||||||
|
*/ |
||||||
|
|
||||||
|
if (size == 0) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
i2c_cmd_handle_t cmd = i2c_cmd_link_create(); |
||||||
|
i2c_master_start(cmd); |
||||||
|
i2c_master_write_byte(cmd, (dev_id << 1) | I2C_MASTER_WRITE, ACK_CHECK_EN); |
||||||
|
i2c_master_write_byte(cmd, reg_addr, ACK_CHECK_EN); |
||||||
|
|
||||||
|
i2c_master_start(cmd); |
||||||
|
i2c_master_write_byte(cmd, (dev_id << 1) | I2C_MASTER_READ, ACK_CHECK_EN); |
||||||
|
i2c_master_read(cmd, data_rd, size, I2C_MASTER_LAST_NACK); |
||||||
|
i2c_master_stop(cmd); |
||||||
|
|
||||||
|
esp_err_t ret = i2c_master_cmd_begin(i2c_num, cmd, pdMS_TO_TICKS(1000)); |
||||||
|
i2c_cmd_link_delete(cmd); |
||||||
|
|
||||||
|
// HAL_I2C_Master_Transmit(&hi2c1, dev_id<<1, ®_addr, 1, 100);
|
||||||
|
// HAL_I2C_Master_Receive(&hi2c1, dev_id<<1, reg_data, len, 100);
|
||||||
|
|
||||||
|
return ret == ESP_OK ? BME680_OK : BME680_E_COM_FAIL; |
||||||
|
} |
||||||
|
|
||||||
|
static int8_t user_i2c_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len) { |
||||||
|
ESP_LOGD(TAG, "BME680 i2c write"); |
||||||
|
/*
|
||||||
|
* 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 | - | |
||||||
|
* |------------+---------------------| |
||||||
|
*/ |
||||||
|
//HAL_I2C_Master_Transmit(&hi2c1, dev_id<<1, &data[0], (uint16_t) (len + 1), 100);
|
||||||
|
|
||||||
|
i2c_cmd_handle_t cmd = i2c_cmd_link_create(); |
||||||
|
i2c_master_start(cmd); |
||||||
|
i2c_master_write_byte(cmd, (dev_id << 1) | I2C_MASTER_WRITE, ACK_CHECK_EN); |
||||||
|
i2c_master_write_byte(cmd, reg_addr, ACK_CHECK_EN); |
||||||
|
i2c_master_write(cmd, reg_data, len, ACK_CHECK_EN); |
||||||
|
i2c_master_stop(cmd); |
||||||
|
|
||||||
|
esp_err_t ret = i2c_master_cmd_begin(i2c_num, cmd, pdMS_TO_TICKS(1000)); |
||||||
|
i2c_cmd_link_delete(cmd); |
||||||
|
|
||||||
|
return ret == ESP_OK ? BME680_OK : BME680_E_COM_FAIL; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
esp_err_t voc_init(void) { |
||||||
|
int8_t rslt; |
||||||
|
gas_sensor.dev_id = BME680_I2C_ADDR_PRIMARY; |
||||||
|
gas_sensor.intf = BME680_I2C_INTF; |
||||||
|
gas_sensor.read = user_i2c_read; |
||||||
|
gas_sensor.write = user_i2c_write; |
||||||
|
gas_sensor.delay_ms = user_delay_ms; |
||||||
|
|
||||||
|
ESP_LOGD(TAG, "BME680 initializing"); |
||||||
|
rslt = bme680_init(&gas_sensor); |
||||||
|
if (rslt != BME680_OK) { |
||||||
|
ESP_LOGE(TAG, "Error from bme680_init: %d", rslt); |
||||||
|
return ESP_FAIL; |
||||||
|
} |
||||||
|
|
||||||
|
ESP_LOGD(TAG, "BME680 configuring"); |
||||||
|
/* Set the temperature, pressure and humidity settings */ |
||||||
|
gas_sensor.tph_sett.os_hum = BME680_OS_2X; |
||||||
|
gas_sensor.tph_sett.os_pres = BME680_OS_4X; |
||||||
|
gas_sensor.tph_sett.os_temp = BME680_OS_8X; |
||||||
|
gas_sensor.tph_sett.filter = BME680_FILTER_SIZE_3; |
||||||
|
|
||||||
|
/* Set the remaining gas sensor settings and link the heating profile */ |
||||||
|
gas_sensor.gas_sett.run_gas = BME680_ENABLE_GAS_MEAS; |
||||||
|
/* Create a ramp heat waveform in 3 steps */ |
||||||
|
gas_sensor.gas_sett.heatr_temp = 320; /* degree Celsius */ |
||||||
|
gas_sensor.gas_sett.heatr_dur = 150; /* milliseconds */ |
||||||
|
|
||||||
|
/* Select the power mode */ |
||||||
|
/* Must be set before writing the sensor configuration */ |
||||||
|
gas_sensor.power_mode = BME680_FORCED_MODE; |
||||||
|
|
||||||
|
/* Set the required sensor settings needed */ |
||||||
|
uint8_t set_required_settings = BME680_OST_SEL | BME680_OSP_SEL | BME680_OSH_SEL | BME680_FILTER_SEL | BME680_GAS_SENSOR_SEL; |
||||||
|
|
||||||
|
/* Set the desired sensor configuration */ |
||||||
|
rslt = bme680_set_sensor_settings(set_required_settings, &gas_sensor); |
||||||
|
if (rslt != BME680_OK) { |
||||||
|
ESP_LOGE(TAG, "Error from bme680_set_sensor_settings: %d", rslt); |
||||||
|
return ESP_FAIL; |
||||||
|
} |
||||||
|
return ESP_OK; |
||||||
|
} |
||||||
|
|
||||||
|
uint32_t voc_start_measure(void) { |
||||||
|
/* Set the power mode */ |
||||||
|
int8_t rslt; |
||||||
|
|
||||||
|
rslt = bme680_set_sensor_mode(&gas_sensor); |
||||||
|
if (rslt != BME680_OK) { |
||||||
|
ESP_LOGE(TAG, "Error from bme680_set_sensor_mode: %d", rslt); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
/* Get the total measurement duration so as to sleep or wait till the
|
||||||
|
* measurement is complete */ |
||||||
|
uint16_t meas_period; |
||||||
|
bme680_get_profile_dur(&meas_period, &gas_sensor); |
||||||
|
meas_period += 10; // add some extra safety margin
|
||||||
|
|
||||||
|
ESP_LOGD(TAG, "Measurement will take %d ms\r\n", meas_period); |
||||||
|
|
||||||
|
return meas_period; |
||||||
|
} |
||||||
|
|
||||||
|
esp_err_t voc_read(struct bme680_field_data *data) { |
||||||
|
/* Set the power mode */ |
||||||
|
int8_t rslt; |
||||||
|
rslt = bme680_get_sensor_data(data, &gas_sensor); |
||||||
|
if (rslt != BME680_OK) { |
||||||
|
ESP_LOGE(TAG, "Error from bme680_get_sensor_data: %d", rslt); |
||||||
|
return ESP_FAIL; |
||||||
|
} |
||||||
|
|
||||||
|
ESP_LOGI(TAG, "T: %d/100 degC, P: %d/100 hPa, H %d/1000 %%rH ", data->temperature, data->pressure, data->humidity); |
||||||
|
/* Avoid using measurements from an unstable heating setup */ |
||||||
|
if (data->status & BME680_GASM_VALID_MSK) { |
||||||
|
ESP_LOGI(TAG, "G: %d ohms", data->gas_resistance); |
||||||
|
} |
||||||
|
return ESP_OK; |
||||||
|
} |
||||||
|
|
||||||
|
void voc_read_task(void *param) { |
||||||
|
ESP_LOGI(TAG, "VOC sensor init"); |
||||||
|
voc_init(); |
||||||
|
|
||||||
|
struct bme680_field_data data; |
||||||
|
|
||||||
|
while (1) { |
||||||
|
ESP_LOGI(TAG, "VOC sensor meas"); |
||||||
|
uint32_t mswait = voc_start_measure(); |
||||||
|
vTaskDelay(pdMS_TO_TICKS(mswait)); |
||||||
|
|
||||||
|
ESP_LOGI(TAG, "VOC sensor read"); |
||||||
|
voc_read(&data); |
||||||
|
|
||||||
|
// TODO do something with it
|
||||||
|
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000)); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
//
|
||||||
|
// Created by MightyPork on 2017/11/17.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef PROJ_VOC_SENSOR_H |
||||||
|
#define PROJ_VOC_SENSOR_H |
||||||
|
|
||||||
|
#include <bme680.h> |
||||||
|
#include <esp_err.h> |
||||||
|
|
||||||
|
extern struct bme680_dev gas_sensor; |
||||||
|
|
||||||
|
esp_err_t voc_init(void); |
||||||
|
uint32_t voc_start_measure(void); |
||||||
|
esp_err_t voc_read(struct bme680_field_data *data); |
||||||
|
void voc_read_task(void *param); |
||||||
|
|
||||||
|
#endif //PROJ_VOC_SENSOR_H
|
Loading…
Reference in new issue