1
0
mirror of https://github.com/cmur2/python-bme680.git synced 2025-07-10 05:11:25 +02:00

25 Commits

Author SHA1 Message Date
50902ac08e Prep for v1.0.5 2018-06-01 17:15:10 +01:00
05f80690e0 Merge branch 'ayeks-offset' 2018-06-01 16:10:47 +01:00
0f0be7f2c2 Tidied up temp-offset.py example 2018-06-01 16:10:34 +01:00
4ae50e2f2c Fixed bug in set_temp_offset 2018-06-01 16:10:08 +01:00
7e08c2d749 Fixed packaging errors 2018-06-01 16:04:37 +01:00
bc2f729013 Made temp-offset.py executable 2018-06-01 16:04:27 +01:00
fed191e40e use math.copysign for temp offset calculation 2018-05-31 08:21:14 +00:00
8cb0dead6b added temp offset float example 2018-05-28 21:41:16 +00:00
ae004aa62b accept float values in set_temp_offset 2018-05-28 21:38:19 +00:00
1c9ba41306 added set_temp_offset function and example 2018-05-28 21:18:20 +00:00
40b4b63b93 Create LICENSE 2018-02-20 15:21:25 +00:00
da6ae97f1f Prep for v1.0.4 2017-12-04 10:37:52 +00:00
097287e842 Merge pull request #8 from lowflyerUK/master
Updated mask operation in constants.py to correct gas resistance
2017-12-04 10:28:14 +00:00
02407e1d01 Updated mask operation in constants.py to correct gas resistance 2017-12-03 21:49:32 +00:00
888d8b312a Convert negative gas resistance readings to unsigned int32 2017-12-01 14:08:40 +00:00
288daed781 Version 1.0.3 prep 2017-11-23 11:25:34 +00:00
c9d4cef987 Merge pull request #5 from gkluoe/master
Fix reassignment of variable in pressure calculation algo
2017-11-22 16:19:43 +00:00
26a28bfde7 Fix reassignment of variable in pressure calculation algo 2017-11-21 21:16:27 +00:00
1baa47fb56 Merge pull request #4 from davea/typeerror_fixes
Fix Python 3 TypeError crashes by using floor division explicitly
2017-11-20 12:09:09 +00:00
3e4bf56802 Fix Python 3 TypeError crashes by using floor division explicitly
The / operator in Python 3 returns a float, which was causing TypeErrors
when being passed to the << or >> operators.
2017-11-19 17:10:27 +00:00
d9970151cd Fixes from upstream BME680_driver 3.5.3 2017-11-17 11:29:48 +00:00
fffb5205d1 Fixed another copy-paste error! 2017-10-19 12:31:19 +01:00
ae48c5aa7f Fixed copy-paste error! 2017-10-19 12:30:52 +01:00
09570742aa Added OLI install details. 2017-10-19 12:30:27 +01:00
25c941fedd Added terminal image. 2017-10-19 11:29:00 +00:00
17 changed files with 306 additions and 52 deletions

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2018 Pimoroni Ltd
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -6,6 +6,20 @@ The state-of-the-art BME680 breakout lets you measure temperature, pressure, hum
## Installing
### Full install (recommended):
We've created an easy installation script that will install all pre-requisites and get your BME680
up and running with minimal efforts. To run it, fire up Terminal which you'll find in Menu -> Accessories -> Terminal
on your Raspberry Pi desktop, as illustrated below:
![Finding the terminal](http://get.pimoroni.com/resources/github-repo-terminal.png)
In the new terminal window type the command exactly as it appears below (check for typos) and follow the on-screen instructions:
```bash
curl https://get.pimoroni.com/bme680 | bash
```
### Manual install:
#### Library install for Python 3:

39
examples/temp-offset.py Executable file
View File

@ -0,0 +1,39 @@
#!/usr/bin/env python
import bme680
print("""Display Temperature, Pressure and Humidity with different offsets.
""")
sensor = bme680.BME680()
# These oversampling settings can be tweaked to
# change the balance between accuracy and noise in
# the data.
sensor.set_humidity_oversample(bme680.OS_2X)
sensor.set_pressure_oversample(bme680.OS_4X)
sensor.set_temperature_oversample(bme680.OS_8X)
sensor.set_filter(bme680.FILTER_SIZE_3)
def display_data(offset=0):
sensor.set_temp_offset(offset)
sensor.get_sensor_data()
output = "{0:.2f} C, {1:.2f} hPa, {2:.3f} %RH".format(sensor.data.temperature, sensor.data.pressure, sensor.data.humidity)
print(output)
print("")
print("Initial readings")
display_data()
print("SET offset 4 degrees celsius")
display_data(4)
print("SET offset -1.87 degrees celsius")
display_data(-1.87)
print("SET offset -100 degrees celsius")
display_data(-100)
print("SET offset 0 degrees celsius")
display_data(0)

View File

@ -1,3 +1,19 @@
1.0.5
-----
* New: set_temp_offset to calibrate temperature offset in degrees C
1.0.4
-----
* Fix to range_sw_err for extremely high gas readings
* Convert to unsigned int to fix negative gas readings
1.0.3
-----
* Merged temperature compensation fix from Bosch's BME680_driver 3.5.3
1.0.2
-----

21
library/LICENSE.txt Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2018 Pimoroni Ltd
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -1,5 +1,5 @@
include CHANGELOG.txt
include LICENSE.txt
include README.txt
include README.rst
include setup.py
include bme680.py
recursive-include bme680 *.py

68
library/README.rst Normal file
View File

@ -0,0 +1,68 @@
BME680
======
https://shop.pimoroni.com/products/bme680
The state-of-the-art BME680 breakout lets you measure temperature,
pressure, humidity, and indoor air quality.
Installing
----------
Full install (recommended):
~~~~~~~~~~~~~~~~~~~~~~~~~~~
We've created an easy installation script that will install all
pre-requisites and get your BME680 up and running with minimal efforts.
To run it, fire up Terminal which you'll find in Menu -> Accessories ->
Terminal on your Raspberry Pi desktop, as illustrated below:
.. figure:: http://get.pimoroni.com/resources/github-repo-terminal.png
:alt: Finding the terminal
In the new terminal window type the command exactly as it appears below
(check for typos) and follow the on-screen instructions:
.. code:: bash
curl https://get.pimoroni.com/bme680 | bash
Manual install:
~~~~~~~~~~~~~~~
Library install for Python 3:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code:: bash
sudo pip3 install bme680
Library install for Python 2:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code:: bash
sudo pip2 install bme680
Development:
~~~~~~~~~~~~
If you want to contribute, or like living on the edge of your seat by
having the latest code, you should clone this repository, ``cd`` to the
library directory, and run:
.. code:: bash
sudo python3 setup.py install
(or ``sudo python setup.py install`` whichever your primary Python
environment may be)
In all cases you will have to enable the i2c bus.
Documentation & Support
-----------------------
- Guides and tutorials - https://learn.pimoroni.com/bme680
- Get help - http://forums.pimoroni.com/c/support

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -2,7 +2,7 @@ from .constants import *
import math
import time
__version__ = '1.0.2'
__version__ = '1.0.5'
class BME680(BME680Data):
"""BOSCH BME680
@ -36,7 +36,7 @@ class BME680(BME680Data):
self.set_temperature_oversample(OS_8X)
self.set_filter(FILTER_SIZE_3)
self.set_gas_status(ENABLE_GAS_MEAS)
self.set_temp_offset(0)
self.get_sensor_data()
def _get_calibration_data(self):
@ -56,6 +56,17 @@ class BME680(BME680Data):
self._set_regs(SOFT_RESET_ADDR, SOFT_RESET_CMD)
time.sleep(RESET_PERIOD / 1000.0)
def set_temp_offset(self, value):
"""Set temperature offset in celsius
If set, the temperature t_fine will be increased by given value in celsius.
:param value: Temperature offset in Celsius, eg. 4, -8, 1.25
"""
if value == 0:
self.offset_temp_in_t_fine = 0
else:
self.offset_temp_in_t_fine = int(math.copysign((((int(abs(value) * 100)) << 8) - 128) / 5, value))
def set_humidity_oversample(self, value):
"""Set humidity oversampling
@ -287,63 +298,75 @@ class BME680(BME680Data):
return self._i2c.read_i2c_block_data(self.i2c_addr, register, length)
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
var1 = (temperature_adc >> 3) - (self.calibration_data.par_t1 << 1)
var2 = (var1 * self.calibration_data.par_t2) >> 11
var3 = ((var1 >> 1) * (var1 >> 1)) >> 12
var3 = ((var3) * (self.calibration_data.par_t3 << 4)) >> 14
# Save teperature data for pressure calculations
self.calibration_data.t_fine = (var2 + var3)
calc_temp = (((self.calibration_data.t_fine * 5) + 128) / 256)
self.calibration_data.t_fine = (var2 + var3) + self.offset_temp_in_t_fine
calc_temp = (((self.calibration_data.t_fine * 5) + 128) >> 8)
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)
var1 = ((self.calibration_data.t_fine) >> 1) - 64000
var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) *
self.calibration_data.par_p6) >> 2
var2 = var2 + ((var1 * self.calibration_data.par_p5) << 1)
var2 = (var2 >> 2) + (self.calibration_data.par_p4 << 16)
var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13 ) *
((self.calibration_data.par_p3 << 5)) >> 3) +
((self.calibration_data.par_p2 * var1) >> 1))
var1 = var1 >> 18
return calc_pres
var1 = ((32768 + var1) * self.calibration_data.par_p1) >> 15
calc_pressure = 1048576 - pressure_adc
calc_pressure = ((calc_pressure - (var2 >> 12)) * (3125))
if calc_pressure >= (1 << 31):
calc_pressure = ((calc_pressure // var1) << 1)
else:
calc_pressure = ((calc_pressure << 1) // var1)
var1 = (self.calibration_data.par_p9 * (((calc_pressure >> 3) *
(calc_pressure >> 3)) >> 13)) >> 12
var2 = ((calc_pressure >> 2) *
self.calibration_data.par_p8) >> 13
var3 = ((calc_pressure >> 8) * (calc_pressure >> 8) *
(calc_pressure >> 8) *
self.calibration_data.par_p10) >> 17
calc_pressure = (calc_pressure) + ((var1 + var2 + var3 +
(self.calibration_data.par_p7 << 7)) >> 4)
return calc_pressure
def _calc_humidity(self, humidity_adc):
temp_scaled = ((self.calibration_data.t_fine * 5) + 128) / 256
temp_scaled = ((self.calibration_data.t_fine * 5) + 128) >> 8
var1 = (humidity_adc - ((self.calibration_data.par_h1 * 16))) \
- (((temp_scaled * self.calibration_data.par_h3) / (100)) / 2)
- (((temp_scaled * self.calibration_data.par_h3) // (100)) >> 1)
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
* (((temp_scaled * self.calibration_data.par_h4) // (100))
+ (((temp_scaled * ((temp_scaled * self.calibration_data.par_h5) // (100))) >> 6)
// (100)) + (1 * 16384))) >> 10
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
var4 = self.calibration_data.par_h6 << 7
var4 = ((var4) + ((temp_scaled * self.calibration_data.par_h7) // (100))) >> 4
var5 = ((var3 >> 14) * (var3 >> 14)) >> 10
var6 = (var4 * var5) >> 1
calc_hum = (((var3 + var6) >> 10) * (1000)) >> 12
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)) * (lookupTable1[gas_range])) / 65536
var2 = (((gas_res_adc * 32768) - (16777216)) + var1)
var3 = ((lookupTable2[gas_range] * var1) / 512)
calc_gas_res = ((var3 + (var2 / 2)) / var2)
var1 = ((1340 + (5 * self.calibration_data.range_sw_err)) * (lookupTable1[gas_range])) >> 16
var2 = (((gas_res_adc << 15) - (16777216)) + var1)
var3 = ((lookupTable2[gas_range] * var1) >> 9)
calc_gas_res = ((var3 + (var2 >> 1)) / var2)
if calc_gas_res < 0:
calc_gas_res = (1<<32) + calc_gas_res
return calc_gas_res

View File

@ -323,9 +323,9 @@ class CalibrationData:
self.par_gh3 = twos_comp(calibration[GH3_REG], bits=8)
def set_other(self, heat_range, heat_value, sw_error):
self.res_heat_range = (heat_range & RHRANGE_MSK) / 16
self.res_heat_range = (heat_range & RHRANGE_MSK) // 16
self.res_heat_val = heat_value
self.range_sw_err = (sw_error * RSERROR_MSK) / 16
self.range_sw_err = (sw_error & RSERROR_MSK) // 16
# BME680 sensor settings structure which comprises of ODR,
# over-sampling and filter settings.

View File

@ -39,11 +39,11 @@ classifiers = ['Development Status :: 5 - Production/Stable',
setup(
name = 'bme680',
version = '1.0.2',
version = '1.0.5',
author = 'Philip Howard',
author_email = 'phil@pimoroni.com',
description = """Python library for driving the Pimoroni BME680 Breakout""",
long_description= open('README.txt').read() + open('CHANGELOG.txt').read(),
long_description= open('README.rst').read() + "\n" + open('CHANGELOG.txt').read(),
license = 'MIT',
keywords = 'Raspberry Pi',
url = 'http://www.pimoroni.com',

View File

@ -1,3 +1,22 @@
bme680 (1.0.5) stable; urgency=low
* New: set_temp_offset to calibrate temperature offset in degrees C
-- Phil Howard <phil@pimoroni.com> Fri, 01 Jun 2018 00:00:00 +0000
bme680 (1.0.4) stable; urgency=low
* Fix to range_sw_err for extremely high gas readings
* Convert to unsigned int to fix negative gas readings
-- Phil Howard <phil@pimoroni.com> Mon, 04 Dec 2017 00:00:00 +0000
bme680 (1.0.3) stable; urgency=low
* Merged temperature compensation fix from Bosch's BME680_driver 3.5.3
-- Phil Howard <phil@pimoroni.com> Wed, 22 Nov 2017 00:00:00 +0000
bme680 (1.0.2) stable; urgency=low
* Fixed set_gas_heater_temperature to avoid i2c TypeError

View File

@ -0,0 +1,5 @@
Successfully uploaded bme680_1.0.2.dsc to build-master.raspberrypi.org for raspberrypi.
Successfully uploaded bme680_1.0.2.tar.xz to build-master.raspberrypi.org for raspberrypi.
Successfully uploaded python-bme680_1.0.2_all.deb to build-master.raspberrypi.org for raspberrypi.
Successfully uploaded python3-bme680_1.0.2_all.deb to build-master.raspberrypi.org for raspberrypi.
Successfully uploaded bme680_1.0.2_armhf.changes to build-master.raspberrypi.org for raspberrypi.

View File

@ -1,3 +1,22 @@
bme680 (1.0.5) stable; urgency=low
* New: set_temp_offset to calibrate temperature offset in degrees C
-- Phil Howard <phil@pimoroni.com> Fri, 01 Jun 2018 00:00:00 +0000
bme680 (1.0.4) stable; urgency=low
* Fix to range_sw_err for extremely high gas readings
* Convert to unsigned int to fix negative gas readings
-- Phil Howard <phil@pimoroni.com> Mon, 04 Dec 2017 00:00:00 +0000
bme680 (1.0.3) stable; urgency=low
* Merged temperature compensation fix from Bosch's BME680_driver 3.5.3
-- Phil Howard <phil@pimoroni.com> Wed, 22 Nov 2017 00:00:00 +0000
bme680 (1.0.2) stable; urgency=low
* Fixed set_gas_heater_temperature to avoid i2c TypeError

View File

@ -39,9 +39,10 @@ inform "seeded debian changelog"
# generate pypi changelog
sed -e "/--/d" -e "s/ \*/\*/" \
-e "s/.*\([0-9].[0-9].[0-9]\).*/\1/" \
-e '/[0-9].[0-9].[0-9]/ a\
sed -e "/--/d" \
-e "s/ \*/\*/" \
-e "s/.*(\([0-9].[0-9].[0-9]\)).*/\1/" \
-e '/^[0-9].[0-9].[0-9]$/ a\
-----' $mainlog | cat -s > $pypilog
version=$(head -n 1 $pypilog)

8
packaging/testlog.sh Executable file
View File

@ -0,0 +1,8 @@
#!/bin/bash
sed -e "/--/d" \
-e "s/ \*/\*/" \
-e "s/.*(\([0-9].[0-9].[0-9]\)).*/\1/" \
-e '/^[0-9].[0-9].[0-9]$/ a\
-----' CHANGELOG

BIN
terminal.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB