mirror of
https://github.com/cmur2/python-bme680.git
synced 2025-01-24 13:27:08 +01:00
Initial Commit
This commit is contained in:
commit
c84cabe700
1
BME680_driver
Submodule
1
BME680_driver
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 2a51b9c0c1899f28e561e6701caa22cb23201cfc
|
225
bme680.h
Normal file
225
bme680.h
Normal file
@ -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 5 Jul 2017
|
||||||
|
* @version 3.5.1
|
||||||
|
* @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, 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_ */
|
||||||
|
/** @}*/
|
127
bme680/__init__.py
Normal file
127
bme680/__init__.py
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
from . import constants
|
||||||
|
import math
|
||||||
|
|
||||||
|
class BME680(constants.BME680):
|
||||||
|
def __init__(self):
|
||||||
|
constants.BME680.__init__(self)
|
||||||
|
|
||||||
|
def init(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def soft_reset(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def set_sensor_mode(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_sensor_mode(self, mode):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def set_profile_duration(self, duration):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_profile_duration(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def _get_sensor_data(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def _get_regs(self, addr, length):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def _get_calibration_data(self):
|
||||||
|
calibration = self._get_regs(constants.COEFF_ADDR1, constants.COEFF_ADDR1_LEN)
|
||||||
|
calibration += self._get_regs(constants.COEFF_ADDR2, constants.COEFF_ADDR2_LEN)
|
||||||
|
|
||||||
|
heat_range = self._get_regs(constants.ADDR_RES_HEAT_RANGE_ADDR, 1)[0]
|
||||||
|
heat_value = self._get_regs(constants.ADDR_RES_HEAT_VAL_ADDR, 1)[0]
|
||||||
|
sw_error = self._get_regs(constants.ADDR_RANGE_SW_ERR_ADDR, 1)[0]
|
||||||
|
|
||||||
|
self.calibration_data.set_from_array(calibration)
|
||||||
|
self.calibration_data.set_other(heat_range, heat_value, sw_error)
|
||||||
|
|
||||||
|
def _calc_temperature(self, temperature_adc):
|
||||||
|
var1 = (temperature_adc / 8) - (self.calibration_data.par_t1 * 2)
|
||||||
|
var2 = (var1 * self.calibration_data.par_t2) / 2048
|
||||||
|
var3 = ((var1 / 2) * (var1 / 2)) / 4096
|
||||||
|
var3 = ((var3) * (self.calibration_data.par_t3 * 16)) / 16384
|
||||||
|
|
||||||
|
# Save teperature data for pressure calculations
|
||||||
|
self.calibration_data.t_fine = (var2 + var3)
|
||||||
|
calc_temp = (((self.calibration_data.t_fine * 5) + 128) / 256)
|
||||||
|
|
||||||
|
return calc_temp
|
||||||
|
|
||||||
|
def _calc_pressure(self, pressure_adc):
|
||||||
|
var1 = (self.calibration_data.t_fine / 2) - 64000
|
||||||
|
var2 = ((var1 / 4) * (var1 / 4)) / 2048
|
||||||
|
var2 = (var2 * self.calibration_data.par_p6) / 4
|
||||||
|
var2 = var2 + ((var1 * self.calibration_data.par_p5) * 2)
|
||||||
|
var2 = (var2 / 4) + (self.calibration_data.par_p4 * 65536)
|
||||||
|
|
||||||
|
var1 = ((var1 / 4) * (var1 / 4)) / 8192
|
||||||
|
var1 = ((var1 * (self.calibration_data.par_p3 * 32)) / 8) + ((self.calibration_data.par_p2 * var1) / 2)
|
||||||
|
var1 = var1 / 262144
|
||||||
|
var1 = ((32768 + var1) * self.calibration_data.par_p1) / 32768
|
||||||
|
calc_pres = 1048576 - pressure_adc
|
||||||
|
calc_pres = (calc_pres - (var2 / 4096)) * 3125
|
||||||
|
calc_pres = (calc_pres / var1) * 2
|
||||||
|
var1 = (self.calibration_data.par_p9 * (((calc_pres / 8) * (calc_pres / 8)) / 8192)) / 4096
|
||||||
|
var2 = ((calc_pres / 4) * self.calibration_data.par_p8) / 8192
|
||||||
|
var3 = ((calc_pres / 256)
|
||||||
|
* (calc_pres / 256)
|
||||||
|
* (calc_pres / 256)
|
||||||
|
* self.calibration_data.par_p10) / 131072
|
||||||
|
calc_pres = calc_pres + ((var1 + var2 + var3 + (self.calibration_data.par_p7 * 128)) / 16)
|
||||||
|
|
||||||
|
return calc_pres
|
||||||
|
|
||||||
|
def _calc_humidity(self, humidity_adc):
|
||||||
|
temp_scaled = ((self.calibration_data.t_fine * 5) + 128) / 256
|
||||||
|
var1 = (humidity_adc - ((self.calibration_data.par_h1 * 16))) \
|
||||||
|
- (((temp_scaled * self.calibration_data.par_h3) / (100)) / 2)
|
||||||
|
var2 = (self.calibration_data.par_h2
|
||||||
|
* (((temp_scaled * self.calibration_data.par_h4) / (100))
|
||||||
|
+ (((temp_scaled * ((temp_scaled * self.calibration_data.par_h5) / (100))) / 64)
|
||||||
|
/ (100)) + (1 * 16384))) / 1024
|
||||||
|
var3 = var1 * var2
|
||||||
|
var4 = self.calibration_data.par_h6 * 128
|
||||||
|
var4 = ((var4) + ((temp_scaled * self.calibration_data.par_h7) / (100))) / 16
|
||||||
|
var5 = ((var3 / 16384) * (var3 / 16384)) / 1024
|
||||||
|
var6 = (var4 * var5) / 2
|
||||||
|
calc_hum = (((var3 + var6) / 1024) * (1000)) / 4096
|
||||||
|
|
||||||
|
return min(max(calc_hum,0),100000)
|
||||||
|
|
||||||
|
def _calc_gas_resistance(self, gas_res_adc, gas_range):
|
||||||
|
var1 = ((1340 + (5 * self.calibration_data.range_sw_err)) * (constants.lookupTable1[gas_range])) / 65536
|
||||||
|
var2 = (((gas_res_adc * 32768) - (16777216)) + var1)
|
||||||
|
var3 = ((constants.lookupTable2[gas_range] * var1) / 512)
|
||||||
|
calc_gas_res = ((var3 + (var2 / 2)) / var2)
|
||||||
|
|
||||||
|
return calc_gas_res
|
||||||
|
|
||||||
|
def _calc_heater_resistance(self, temperature):
|
||||||
|
temperature = min(max(temperature,200),400)
|
||||||
|
|
||||||
|
var1 = ((self.ambient_temperature * self.calibration_data.par_gh3) / 1000) * 256
|
||||||
|
var2 = (self.calibration_data.par_gh1 + 784) * (((((self.calibration_data.par_gh2 + 154009) * temperature * 5) / 100) + 3276800) / 10)
|
||||||
|
var3 = var1 + (var2 / 2)
|
||||||
|
var4 = (var3 / (self.calibration_data.res_heat_range + 4))
|
||||||
|
var5 = (131 * self.calibration_data.res_heat_val) + 65536
|
||||||
|
heatr_res_x100 = (((var4 / var5) - 250) * 34)
|
||||||
|
heatr_res = ((heatr_res_x100 + 50) / 100)
|
||||||
|
|
||||||
|
return int(heatr_res)
|
||||||
|
|
||||||
|
def _calc_heater_duration(self, duration):
|
||||||
|
if duration < 0xfc0:
|
||||||
|
factor = 0
|
||||||
|
|
||||||
|
while duration > 0x3f:
|
||||||
|
duration /= 4
|
||||||
|
factor += 1
|
||||||
|
|
||||||
|
return int(duration + (factor * 64))
|
||||||
|
|
||||||
|
return 0xff
|
BIN
bme680/__init__.pyc
Normal file
BIN
bme680/__init__.pyc
Normal file
Binary file not shown.
BIN
bme680/__pycache__/__init__.cpython-35.pyc
Normal file
BIN
bme680/__pycache__/__init__.cpython-35.pyc
Normal file
Binary file not shown.
BIN
bme680/__pycache__/__init__.cpython-36.pyc
Normal file
BIN
bme680/__pycache__/__init__.cpython-36.pyc
Normal file
Binary file not shown.
BIN
bme680/__pycache__/constants.cpython-35.pyc
Normal file
BIN
bme680/__pycache__/constants.cpython-35.pyc
Normal file
Binary file not shown.
BIN
bme680/__pycache__/constants.cpython-36.pyc
Normal file
BIN
bme680/__pycache__/constants.cpython-36.pyc
Normal file
Binary file not shown.
381
bme680/constants.py
Normal file
381
bme680/constants.py
Normal file
@ -0,0 +1,381 @@
|
|||||||
|
# BME680 General config
|
||||||
|
POLL_PERIOD_MS = 10
|
||||||
|
|
||||||
|
# BME680 I2C addresses
|
||||||
|
I2C_ADDR_PRIMARY = 0x76
|
||||||
|
I2C_ADDR_SECONDARY = 0x77
|
||||||
|
|
||||||
|
# BME680 unique chip identifier
|
||||||
|
CHIP_ID = 0x61
|
||||||
|
|
||||||
|
# BME680 coefficients related defines
|
||||||
|
COEFF_SIZE = 41
|
||||||
|
COEFF_ADDR1_LEN = 25
|
||||||
|
COEFF_ADDR2_LEN = 16
|
||||||
|
|
||||||
|
# BME680 field_x related defines
|
||||||
|
FIELD_LENGTH = 15
|
||||||
|
FIELD_ADDR_OFFSET = 17
|
||||||
|
|
||||||
|
# Soft reset command
|
||||||
|
SOFT_RESET_CMD = 0xb6
|
||||||
|
|
||||||
|
# Error code definitions
|
||||||
|
OK = 0
|
||||||
|
# Errors
|
||||||
|
E_NULL_PTR = -1
|
||||||
|
E_COM_FAIL = -2
|
||||||
|
E_DEV_NOT_FOUND = -3
|
||||||
|
E_INVALID_LENGTH = -4
|
||||||
|
|
||||||
|
# Warnings
|
||||||
|
W_DEFINE_PWR_MODE = 1
|
||||||
|
W_NO_NEW_DATA = 2
|
||||||
|
|
||||||
|
# Info's
|
||||||
|
I_MIN_CORRECTION = 1
|
||||||
|
I_MAX_CORRECTION = 2
|
||||||
|
|
||||||
|
# Register map
|
||||||
|
# Other coefficient's address
|
||||||
|
ADDR_RES_HEAT_VAL_ADDR = 0x00
|
||||||
|
ADDR_RES_HEAT_RANGE_ADDR = 0x02
|
||||||
|
ADDR_RANGE_SW_ERR_ADDR = 0x04
|
||||||
|
ADDR_SENS_CONF_START = 0x5A
|
||||||
|
ADDR_GAS_CONF_START = 0x64
|
||||||
|
|
||||||
|
# Field settings
|
||||||
|
FIELD0_ADDR = 0x1d
|
||||||
|
|
||||||
|
# Heater settings
|
||||||
|
RES_HEAT0_ADDR = 0x5a
|
||||||
|
GAS_WAIT0_ADDR = 0x64
|
||||||
|
|
||||||
|
# Sensor configuration registers
|
||||||
|
CONF_HEAT_CTRL_ADDR = 0x70
|
||||||
|
CONF_ODR_RUN_GAS_NBC_ADDR = 0x71
|
||||||
|
CONF_OS_H_ADDR = 0x72
|
||||||
|
MEM_PAGE_ADDR = 0xf3
|
||||||
|
CONF_T_P_MODE_ADDR = 0x74
|
||||||
|
CONF_ODR_FILT_ADDR = 0x75
|
||||||
|
|
||||||
|
# Coefficient's address
|
||||||
|
COEFF_ADDR1 = 0x89
|
||||||
|
COEFF_ADDR2 = 0xe1
|
||||||
|
|
||||||
|
# Chip identifier
|
||||||
|
CHIP_ID_ADDR = 0xd0
|
||||||
|
|
||||||
|
# Soft reset register
|
||||||
|
SOFT_RESET_ADDR = 0xe0
|
||||||
|
|
||||||
|
# Heater control settings
|
||||||
|
ENABLE_HEATER = 0x00
|
||||||
|
DISABLE_HEATER = 0x08
|
||||||
|
|
||||||
|
# Gas measurement settings
|
||||||
|
DISABLE_GAS_MEAS = 0x00
|
||||||
|
ENABLE_GAS_MEAS = 0x01
|
||||||
|
|
||||||
|
# Over-sampling settings
|
||||||
|
OS_NONE = 0
|
||||||
|
OS_1X = 1
|
||||||
|
OS_2X = 2
|
||||||
|
OS_4X = 3
|
||||||
|
OS_8X = 4
|
||||||
|
OS_16X = 5
|
||||||
|
|
||||||
|
# IIR filter settings
|
||||||
|
FILTER_SIZE_0 = 0
|
||||||
|
FILTER_SIZE_1 = 1
|
||||||
|
FILTER_SIZE_3 = 2
|
||||||
|
FILTER_SIZE_7 = 3
|
||||||
|
FILTER_SIZE_15 = 4
|
||||||
|
FILTER_SIZE_31 = 5
|
||||||
|
FILTER_SIZE_63 = 6
|
||||||
|
FILTER_SIZE_127 = 7
|
||||||
|
|
||||||
|
# Power mode settings
|
||||||
|
SLEEP_MODE = 0
|
||||||
|
FORCED_MODE = 1
|
||||||
|
|
||||||
|
# Delay related macro declaration
|
||||||
|
RESET_PERIOD = 10
|
||||||
|
|
||||||
|
# SPI memory page settings
|
||||||
|
MEM_PAGE0 = 0x10
|
||||||
|
MEM_PAGE1 = 0x00
|
||||||
|
|
||||||
|
# Ambient humidity shift value for compensation
|
||||||
|
HUM_REG_SHIFT_VAL = 4
|
||||||
|
|
||||||
|
# Run gas enable and disable settings
|
||||||
|
RUN_GAS_DISABLE = 0
|
||||||
|
RUN_GAS_ENABLE = 1
|
||||||
|
|
||||||
|
# Buffer length macro declaration
|
||||||
|
TMP_BUFFER_LENGTH = 40
|
||||||
|
REG_BUFFER_LENGTH = 6
|
||||||
|
FIELD_DATA_LENGTH = 3
|
||||||
|
GAS_REG_BUF_LENGTH = 20
|
||||||
|
GAS_HEATER_PROF_LEN_MAX = 10
|
||||||
|
|
||||||
|
# Settings selector
|
||||||
|
OST_SEL = 1
|
||||||
|
OSP_SEL = 2
|
||||||
|
OSH_SEL = 4
|
||||||
|
GAS_MEAS_SEL = 8
|
||||||
|
FILTER_SEL = 16
|
||||||
|
HCNTRL_SEL = 32
|
||||||
|
RUN_GAS_SEL = 64
|
||||||
|
NBCONV_SEL = 128
|
||||||
|
GAS_SENSOR_SEL = GAS_MEAS_SEL | RUN_GAS_SEL | NBCONV_SEL
|
||||||
|
|
||||||
|
# Number of conversion settings
|
||||||
|
NBCONV_MIN = 0
|
||||||
|
NBCONV_MAX = 10
|
||||||
|
|
||||||
|
# Mask definitions
|
||||||
|
GAS_MEAS_MSK = 0x30
|
||||||
|
NBCONV_MSK = 0X0F
|
||||||
|
FILTER_MSK = 0X1C
|
||||||
|
OST_MSK = 0XE0
|
||||||
|
OSP_MSK = 0X1C
|
||||||
|
OSH_MSK = 0X07
|
||||||
|
HCTRL_MSK = 0x08
|
||||||
|
RUN_GAS_MSK = 0x10
|
||||||
|
MODE_MSK = 0x03
|
||||||
|
RHRANGE_MSK = 0x30
|
||||||
|
RSERROR_MSK = 0xf0
|
||||||
|
NEW_DATA_MSK = 0x80
|
||||||
|
GAS_INDEX_MSK = 0x0f
|
||||||
|
GAS_RANGE_MSK = 0x0f
|
||||||
|
GASM_VALID_MSK = 0x20
|
||||||
|
HEAT_STAB_MSK = 0x10
|
||||||
|
MEM_PAGE_MSK = 0x10
|
||||||
|
SPI_RD_MSK = 0x80
|
||||||
|
SPI_WR_MSK = 0x7f
|
||||||
|
BIT_H1_DATA_MSK = 0x0F
|
||||||
|
|
||||||
|
# Bit position definitions for sensor settings
|
||||||
|
GAS_MEAS_POS = 4
|
||||||
|
FILTER_POS = 2
|
||||||
|
OST_POS = 5
|
||||||
|
OSP_POS = 2
|
||||||
|
RUN_GAS_POS = 4
|
||||||
|
|
||||||
|
# Array Index to Field data mapping for Calibration Data
|
||||||
|
T2_LSB_REG = 1
|
||||||
|
T2_MSB_REG = 2
|
||||||
|
T3_REG = 3
|
||||||
|
P1_LSB_REG = 5
|
||||||
|
P1_MSB_REG = 6
|
||||||
|
P2_LSB_REG = 7
|
||||||
|
P2_MSB_REG = 8
|
||||||
|
P3_REG = 9
|
||||||
|
P4_LSB_REG = 11
|
||||||
|
P4_MSB_REG = 12
|
||||||
|
P5_LSB_REG = 13
|
||||||
|
P5_MSB_REG = 14
|
||||||
|
P7_REG = 15
|
||||||
|
P6_REG = 16
|
||||||
|
P8_LSB_REG = 19
|
||||||
|
P8_MSB_REG = 20
|
||||||
|
P9_LSB_REG = 21
|
||||||
|
P9_MSB_REG = 22
|
||||||
|
P10_REG = 23
|
||||||
|
H2_MSB_REG = 25
|
||||||
|
H2_LSB_REG = 26
|
||||||
|
H1_LSB_REG = 26
|
||||||
|
H1_MSB_REG = 27
|
||||||
|
H3_REG = 28
|
||||||
|
H4_REG = 29
|
||||||
|
H5_REG = 30
|
||||||
|
H6_REG = 31
|
||||||
|
H7_REG = 32
|
||||||
|
T1_LSB_REG = 33
|
||||||
|
T1_MSB_REG = 34
|
||||||
|
GH2_LSB_REG = 35
|
||||||
|
GH2_MSB_REG = 36
|
||||||
|
GH1_REG = 37
|
||||||
|
GH3_REG = 38
|
||||||
|
|
||||||
|
# BME680 register buffer index settings
|
||||||
|
REG_FILTER_INDEX = 5
|
||||||
|
REG_TEMP_INDEX = 4
|
||||||
|
REG_PRES_INDEX = 4
|
||||||
|
REG_HUM_INDEX = 2
|
||||||
|
REG_NBCONV_INDEX = 1
|
||||||
|
REG_RUN_GAS_INDEX = 1
|
||||||
|
REG_HCTRL_INDEX = 0
|
||||||
|
|
||||||
|
# Look up tables for the possible gas range values
|
||||||
|
lookupTable1 = [2147483647, 2147483647, 2147483647, 2147483647,
|
||||||
|
2147483647, 2126008810, 2147483647, 2130303777, 2147483647,
|
||||||
|
2147483647, 2143188679, 2136746228, 2147483647, 2126008810,
|
||||||
|
2147483647, 2147483647]
|
||||||
|
|
||||||
|
lookupTable2 = [4096000000, 2048000000, 1024000000, 512000000,
|
||||||
|
255744255, 127110228, 64000000, 32258064,
|
||||||
|
16016016, 8000000, 4000000, 2000000,
|
||||||
|
1000000, 500000, 250000, 125000]
|
||||||
|
|
||||||
|
def bytes_to_word(msb, lsb):
|
||||||
|
return (msb << 8) | lsb
|
||||||
|
|
||||||
|
# Sensor field data structure
|
||||||
|
|
||||||
|
class FieldData:
|
||||||
|
def __init__(self):
|
||||||
|
# Contains new_data, gasm_valid & heat_stab
|
||||||
|
self.status = None
|
||||||
|
# The index of the heater profile used
|
||||||
|
self.gas_index = None
|
||||||
|
# Measurement index to track order
|
||||||
|
self.meas_index = None
|
||||||
|
# Temperature in degree celsius x100
|
||||||
|
self.temperature = None
|
||||||
|
# Pressure in Pascal
|
||||||
|
self.pressure = None
|
||||||
|
# Humidity in % relative humidity x1000
|
||||||
|
self.humidity = None
|
||||||
|
# Gas resistance in Ohms
|
||||||
|
self.gas_resistance = None
|
||||||
|
|
||||||
|
# Structure to hold the Calibration data
|
||||||
|
|
||||||
|
class CalibrationData:
|
||||||
|
def __init__(self):
|
||||||
|
self.par_h1 = None
|
||||||
|
self.par_h2 = None
|
||||||
|
self.par_h3 = None
|
||||||
|
self.par_h4 = None
|
||||||
|
self.par_h5 = None
|
||||||
|
self.par_h6 = None
|
||||||
|
self.par_h7 = None
|
||||||
|
self.par_gh1 = None
|
||||||
|
self.par_gh2 = None
|
||||||
|
self.par_gh3 = None
|
||||||
|
self.par_t1 = None
|
||||||
|
self.par_t2 = None
|
||||||
|
self.par_t3 = None
|
||||||
|
self.par_p1 = None
|
||||||
|
self.par_p2 = None
|
||||||
|
self.par_p3 = None
|
||||||
|
self.par_p4 = None
|
||||||
|
self.par_p5 = None
|
||||||
|
self.par_p6 = None
|
||||||
|
self.par_p7 = None
|
||||||
|
self.par_p8 = None
|
||||||
|
self.par_p9 = None
|
||||||
|
self.par_p10 = None
|
||||||
|
# Variable to store t_fine size
|
||||||
|
self.t_fine = None
|
||||||
|
# Variable to store heater resistance range
|
||||||
|
self.res_heat_range = None
|
||||||
|
# Variable to store heater resistance value
|
||||||
|
self.res_heat_val = None
|
||||||
|
# Variable to store error range
|
||||||
|
self.range_sw_err = None
|
||||||
|
|
||||||
|
def set_from_array(self, calibration):
|
||||||
|
# Temperature related coefficients
|
||||||
|
self.par_t1 = bytes_to_word(calibration[T1_MSB_REG], calibration[T1_LSB_REG])
|
||||||
|
self.par_t2 = bytes_to_word(calibration[T2_MSB_REG], calibration[T2_LSB_REG])
|
||||||
|
self.par_t3 = calibration[T3_REG]
|
||||||
|
|
||||||
|
# Pressure related coefficients
|
||||||
|
self.par_p1 = bytes_to_word(calibration[P1_MSB_REG], calibration[P1_LSB_REG])
|
||||||
|
self.par_p2 = bytes_to_word(calibration[P2_MSB_REG], calibration[P2_LSB_REG])
|
||||||
|
self.par_p3 = calibration[P3_REG]
|
||||||
|
self.par_p4 = bytes_to_word(calibration[P4_MSB_REG], calibration[P4_LSB_REG])
|
||||||
|
self.par_p5 = bytes_to_word(calibration[P5_MSB_REG], calibration[P5_LSB_REG])
|
||||||
|
self.par_p6 = calibration[P6_REG]
|
||||||
|
self.par_p7 = calibration[P7_REG]
|
||||||
|
self.par_p8 = bytes_to_word(calibration[P8_MSB_REG], calibration[P8_LSB_REG])
|
||||||
|
self.par_p9 = bytes_to_word(calibration[P9_MSB_REG], calibration[P9_LSB_REG])
|
||||||
|
self.par_p10 = calibration[P10_REG]
|
||||||
|
|
||||||
|
# Humidity related coefficients
|
||||||
|
self.par_h1 = (calibration[H1_MSB_REG] << HUM_REG_SHIFT_VAL) | (calibration[H1_LSB_REG] & BIT_H1_DATA_MSK)
|
||||||
|
self.par_h2 = (calibration[H2_MSB_REG] << HUM_REG_SHIFT_VAL) | (calibration[H2_LSB_REG] >> HUM_REG_SHIFT_VAL)
|
||||||
|
self.par_h3 = calibration[H3_REG]
|
||||||
|
self.par_h4 = calibration[H4_REG]
|
||||||
|
self.par_h5 = calibration[H5_REG]
|
||||||
|
self.par_h6 = calibration[H6_REG]
|
||||||
|
self.par_h7 = calibration[H7_REG]
|
||||||
|
|
||||||
|
# Gas heater related coefficients
|
||||||
|
self.par_gh1 = calibration[GH1_REG]
|
||||||
|
self.par_gh2 = bytes_to_word(calibration[GH2_MSB_REG], calibration[GH2_LSB_REG])
|
||||||
|
self.par_gh3 = calibration[GH3_REG]
|
||||||
|
|
||||||
|
def set_other(self, heat_range, heat_value, sw_error):
|
||||||
|
self.res_heat_range = (heat_range & RHRANGE_MSK) / 16
|
||||||
|
self.res_heat_val = heat_value
|
||||||
|
self.range_sw_err = (sw_error * RSERROR_MSK) / 16
|
||||||
|
|
||||||
|
# BME680 sensor settings structure which comprises of ODR,
|
||||||
|
# over-sampling and filter settings.
|
||||||
|
|
||||||
|
class TPHSettings:
|
||||||
|
def __init__(self):
|
||||||
|
# Humidity oversampling
|
||||||
|
self.os_hum = None
|
||||||
|
# Temperature oversampling
|
||||||
|
self.os_temp = None
|
||||||
|
# Pressure oversampling
|
||||||
|
self.os_pres = None
|
||||||
|
# Filter coefficient
|
||||||
|
self.filter = None
|
||||||
|
|
||||||
|
# BME680 gas sensor which comprises of gas settings
|
||||||
|
## and status parameters
|
||||||
|
|
||||||
|
class GasSettings:
|
||||||
|
def __init__(self):
|
||||||
|
# Variable to store nb conversion
|
||||||
|
self.nb_conv = None
|
||||||
|
# Variable to store heater control
|
||||||
|
self.heatr_ctrl = None
|
||||||
|
# Run gas enable value
|
||||||
|
self.run_gas = None
|
||||||
|
# Pointer to store heater temperature
|
||||||
|
self.heatr_temp = None
|
||||||
|
# Pointer to store duration profile
|
||||||
|
self.heatr_dur = None
|
||||||
|
|
||||||
|
# BME680 device structure
|
||||||
|
|
||||||
|
class BME680:
|
||||||
|
def __init__(self):
|
||||||
|
# Chip Id
|
||||||
|
self.chip_id = None
|
||||||
|
# Device Id
|
||||||
|
self.dev_id = None
|
||||||
|
# SPI/I2C interface
|
||||||
|
self.intf = None
|
||||||
|
# Memory page used
|
||||||
|
self.mem_page = None
|
||||||
|
# Ambient temperature in Degree C
|
||||||
|
self.ambient_temperature = None
|
||||||
|
# Sensor calibration data
|
||||||
|
self.calibration_data = CalibrationData()
|
||||||
|
# Sensor settings
|
||||||
|
self.tph_settings = TPHSettings()
|
||||||
|
# Gas Sensor settings
|
||||||
|
self.gas_settings = GasSettings()
|
||||||
|
# Sensor power modes
|
||||||
|
self.power_mode = None
|
||||||
|
# New sensor fields
|
||||||
|
self.new_fields = None
|
||||||
|
# Store the info messages
|
||||||
|
self.info_msg = None
|
||||||
|
# Burst read structure
|
||||||
|
self.read = None
|
||||||
|
# Burst write structure
|
||||||
|
self.write = None
|
||||||
|
# Delay in ms
|
||||||
|
self.delay_ms = None
|
||||||
|
# Communication function result
|
||||||
|
self.com_rslt = None
|
BIN
bme680/constants.pyc
Normal file
BIN
bme680/constants.pyc
Normal file
Binary file not shown.
529
bme680_defs.h
Normal file
529
bme680_defs.h
Normal file
@ -0,0 +1,529 @@
|
|||||||
|
/**
|
||||||
|
* 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 5 Jul 2017
|
||||||
|
* @version 3.5.1
|
||||||
|
* @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>
|
||||||
|
#else
|
||||||
|
#include <stdint.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __KERNEL__
|
||||||
|
#if (LONG_MAX) > 0x7fffffff
|
||||||
|
#define __have_long64 1
|
||||||
|
#elif (LONG_MAX) == 0x7fffffff
|
||||||
|
#define __have_long32 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(UINT8_C)
|
||||||
|
#define INT8_C(x) x
|
||||||
|
#if (INT_MAX) > 0x7f
|
||||||
|
#define UINT8_C(x) x
|
||||||
|
#else
|
||||||
|
#define UINT8_C(x) x##U
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(UINT16_C)
|
||||||
|
#define INT16_C(x) x
|
||||||
|
#if (INT_MAX) > 0x7fff
|
||||||
|
#define UINT16_C(x) x
|
||||||
|
#else
|
||||||
|
#define UINT16_C(x) x##U
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(INT32_C) && !defined(UINT32_C)
|
||||||
|
#if __have_long32
|
||||||
|
#define INT32_C(x) x##L
|
||||||
|
#define UINT32_C(x) x##UL
|
||||||
|
#else
|
||||||
|
#define INT32_C(x) x
|
||||||
|
#define UINT32_C(x) x##U
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(INT64_C) && !defined(UINT64_C)
|
||||||
|
#if __have_long64
|
||||||
|
#define INT64_C(x) x##L
|
||||||
|
#define UINT64_C(x) x##UL
|
||||||
|
#else
|
||||||
|
#define INT64_C(x) x##LL
|
||||||
|
#define UINT64_C(x) x##ULL
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#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 UINT16_C(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_ */
|
||||||
|
/** @}*/
|
||||||
|
/** @}*/
|
109
test.py
Normal file
109
test.py
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
"""
|
||||||
|
Pressure Temperature Humidity
|
||||||
|
128,0, 79,186,128, 122,185,0, 76,55, 128,0,0, 29,39,
|
||||||
|
|
||||||
|
128,0, 79,186,144, 122,185,64, 76,59, 128,0,0, 220,120,
|
||||||
|
2017-10-13 22:51:50 T: 26.67 degC, P: 1011.79 hPa, H: 49.64 %rH , G: 24487 ohms
|
||||||
|
|
||||||
|
128,0, 79,186,160, 122,186,32, 76,61, 128,0,0, 70,56,
|
||||||
|
2017-10-13 22:51:53 T: 26.68 degC, P: 1011.79 hPa, H: 49.65 %rH , G: 37891 ohms
|
||||||
|
|
||||||
|
128,0, 79,186,224, 122,187,0, 76,61, 128,0,0, 205,55,
|
||||||
|
2017-10-13 22:51:56 T: 26.68 degC, P: 1011.79 hPa, H: 49.65 %rH , G: 51080 ohms
|
||||||
|
|
||||||
|
128,0, 79,186,224, 122,187,224, 76,62, 128,0,0, 127,247,
|
||||||
|
2017-10-13 22:51:59 T: 26.68 degC, P: 1011.79 hPa, H: 49.66 %rH , G: 63052 ohms
|
||||||
|
|
||||||
|
128,0, 79,187,32, 122,188,64, 76,58, 128,0,0, 78,119,
|
||||||
|
2017-10-13 22:52:02 T: 26.69 degC, P: 1011.79 hPa, H: 49.63 %rH , G: 74195 ohms
|
||||||
|
|
||||||
|
128,0, 79,187,112, 122,189,64, 76,48, 128,0,0, 46,183,
|
||||||
|
2017-10-13 22:52:05 T: 26.69 degC, P: 1011.77 hPa, H: 49.57 %rH , G: 83681 ohms
|
||||||
|
|
||||||
|
128,0, 79,187,128, 122,189,160, 76,45, 128,0,0, 25,55,
|
||||||
|
2017-10-13 22:52:08 T: 26.69 degC, P: 1011.77 hPa, H: 49.55 %rH , G: 91612 ohms
|
||||||
|
|
||||||
|
128,0, 79,187,144, 122,189,240, 76,48, 128,0,0, 223,182,
|
||||||
|
2017-10-13 22:52:11 T: 26.69 degC, P: 1011.77 hPa, H: 49.57 %rH , G: 97109 ohms
|
||||||
|
|
||||||
|
128,0, 79,187,160, 122,190,80, 76,49, 128,0,0, 198,118,
|
||||||
|
2017-10-13 22:52:14 T: 26.70 degC, P: 1011.77 hPa, H: 49.58 %rH , G: 103197 ohms
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
import bme680
|
||||||
|
|
||||||
|
example_calibration = [
|
||||||
|
# T2L T2H T3 TP P1L P1H P2L
|
||||||
|
192, 108, 103, 3, 47, 80, 144, 236,
|
||||||
|
# P2H P3 - P4L P4H P5L P5H P7
|
||||||
|
214, 88, 255, 42, 30, 169, 255, 54,
|
||||||
|
# P6 - - P8L P8H P9L P9H P10
|
||||||
|
30, 0, 0, 199, 239, 69, 248, 30,
|
||||||
|
# H2H H2L H1L H1H H3 H4 H5 H6
|
||||||
|
1, 64, 206, 39, 0, 45, 20, 120,
|
||||||
|
# H7 T1L T1H GH2L GH2H GH1 GH3
|
||||||
|
156, 24, 102, 142, 171, 226, 18, 16,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
|
||||||
|
example_heat_range = 22
|
||||||
|
example_heat_value = 44
|
||||||
|
example_sw_error = 227
|
||||||
|
|
||||||
|
sensor = bme680.BME680()
|
||||||
|
|
||||||
|
sensor.calibration_data.set_from_array(example_calibration)
|
||||||
|
sensor.calibration_data.set_other(
|
||||||
|
example_heat_range,
|
||||||
|
example_heat_value,
|
||||||
|
example_sw_error)
|
||||||
|
|
||||||
|
for name in dir(sensor.calibration_data):
|
||||||
|
if not name.startswith('_'):
|
||||||
|
value = getattr(sensor.calibration_data, name)
|
||||||
|
if isinstance(value, int):
|
||||||
|
print("{}: {}".format(name, value))
|
||||||
|
|
||||||
|
sensor.ambient_temperature = 25
|
||||||
|
|
||||||
|
"""
|
||||||
|
result = []
|
||||||
|
for x in range(63, 4033):
|
||||||
|
result.append((x, sensor._calc_heater_duration(x)))
|
||||||
|
|
||||||
|
print(result)
|
||||||
|
|
||||||
|
result = []
|
||||||
|
for x in range(200, 401):
|
||||||
|
result.append(sensor._calc_heater_resistance(x))
|
||||||
|
|
||||||
|
print(result)
|
||||||
|
"""
|
||||||
|
|
||||||
|
"""
|
||||||
|
Pressure Temperature Humidity Gas
|
||||||
|
128,0, 79,187,160, 122,190,80, 76,49, 128,0,0, 198,118,
|
||||||
|
2017-10-13 22:52:14 T: 26.70 degC, P: 1011.77 hPa, H: 49.58 %rH , G: 103197 ohms
|
||||||
|
"""
|
||||||
|
|
||||||
|
regs = [128,0, 79,186,144, 122,185,64, 76,59, 128,0,0, 220,120]
|
||||||
|
vals = [26.67, 1011.79, 49.64, 24487]
|
||||||
|
|
||||||
|
adc_pres = (regs[2] << 12) | (regs[3] << 4) | (regs[4] >> 4)
|
||||||
|
adc_temp = (regs[5] << 12) | (regs[6] << 4) | (regs[7] >> 4)
|
||||||
|
adc_hum = (regs[8] << 8) | regs[9]
|
||||||
|
adc_gas_res = (regs[13] << 2) | (regs[14] >> 6)
|
||||||
|
gas_range = regs[14] & bme680.constants.GAS_RANGE_MSK
|
||||||
|
|
||||||
|
result = sensor._calc_temperature(adc_temp) / 100
|
||||||
|
print("Temperature: Raw: {}: {} {}".format(adc_temp, vals[0], result))
|
||||||
|
|
||||||
|
result = sensor._calc_pressure(adc_pres)
|
||||||
|
print("Pressure: Raw: {}: {} {}".format(adc_pres, vals[1], result))
|
||||||
|
|
||||||
|
result = sensor._calc_humidity(adc_hum) / 1000
|
||||||
|
print("Humidity: Raw: {}: {}% {}%".format(adc_hum, vals[2], result))
|
||||||
|
|
||||||
|
result = sensor._calc_gas_resistance(adc_gas_res, gas_range)
|
||||||
|
print("Resistance: Raw: {}: {} {}".format(adc_gas_res, vals[3], result))
|
Loading…
x
Reference in New Issue
Block a user