Skip to content

Commit 28d9d2d

Browse files
committed
update for bme688
1 parent 44a4498 commit 28d9d2d

File tree

1 file changed

+30
-11
lines changed

1 file changed

+30
-11
lines changed

adafruit_bme680.py

+30-11
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
_BME680_CHIPID = const(0x61)
4848

4949
_BME680_REG_CHIPID = const(0xD0)
50+
_BME68X_REG_VARIANT = const(0xF0)
5051
_BME680_BME680_COEFF_ADDR1 = const(0x89)
5152
_BME680_BME680_COEFF_ADDR2 = const(0xE1)
5253
_BME680_BME680_RES_HEAT_0 = const(0x5A)
@@ -135,6 +136,9 @@ def __init__(self, *, refresh_rate=10):
135136
if chip_id != _BME680_CHIPID:
136137
raise RuntimeError("Failed to find BME680! Chip ID 0x%x" % chip_id)
137138

139+
# Get variant
140+
self._chip_variant = self._read_byte(_BME68X_REG_VARIANT)
141+
138142
self._read_calibration()
139143

140144
# set up heater
@@ -297,12 +301,21 @@ def altitude(self):
297301
def gas(self):
298302
"""The gas resistance in ohms"""
299303
self._perform_reading()
300-
var1 = (
301-
(1340 + (5 * self._sw_err)) * (_LOOKUP_TABLE_1[self._gas_range])
302-
) / 65536
303-
var2 = ((self._adc_gas * 32768) - 16777216) + var1
304-
var3 = (_LOOKUP_TABLE_2[self._gas_range] * var1) / 512
305-
calc_gas_res = (var3 + (var2 / 2)) / var2
304+
if self._chip_variant == 0x01:
305+
# taken from https://github.com/BoschSensortec/BME68x-Sensor-API
306+
var1 = 262144 >> self._gas_range
307+
var2 = self._adc_gas - 512
308+
var2 *= 3
309+
var2 = 4096 + var2
310+
calc_gas_res = (1000 * var1) / var2
311+
calc_gas_res = calc_gas_res * 100
312+
else:
313+
var1 = (
314+
(1340 + (5 * self._sw_err)) * (_LOOKUP_TABLE_1[self._gas_range])
315+
) / 65536
316+
var2 = ((self._adc_gas * 32768) - 16777216) + var1
317+
var3 = (_LOOKUP_TABLE_2[self._gas_range] * var1) / 512
318+
calc_gas_res = (var3 + (var2 / 2)) / var2
306319
return int(calc_gas_res)
307320

308321
def _perform_reading(self):
@@ -321,23 +334,29 @@ def _perform_reading(self):
321334
# turn on humidity oversample
322335
self._write(_BME680_REG_CTRL_HUM, [self._humidity_oversample])
323336
# gas measurements enabled
324-
self._write(_BME680_REG_CTRL_GAS, [_BME680_RUNGAS])
325-
337+
if self._chip_variant == 0x01:
338+
self._write(_BME680_REG_CTRL_GAS, [_BME680_RUNGAS << 1])
339+
else:
340+
self._write(_BME680_REG_CTRL_GAS, [_BME680_RUNGAS])
326341
ctrl = self._read_byte(_BME680_REG_CTRL_MEAS)
327342
ctrl = (ctrl & 0xFC) | 0x01 # enable single shot!
328343
self._write(_BME680_REG_CTRL_MEAS, [ctrl])
329344
new_data = False
330345
while not new_data:
331-
data = self._read(_BME680_REG_MEAS_STATUS, 15)
346+
data = self._read(_BME680_REG_MEAS_STATUS, 17)
332347
new_data = data[0] & 0x80 != 0
333348
time.sleep(0.005)
334349
self._last_reading = time.monotonic()
335350

336351
self._adc_pres = _read24(data[2:5]) / 16
337352
self._adc_temp = _read24(data[5:8]) / 16
338353
self._adc_hum = struct.unpack(">H", bytes(data[8:10]))[0]
339-
self._adc_gas = int(struct.unpack(">H", bytes(data[13:15]))[0] / 64)
340-
self._gas_range = data[14] & 0x0F
354+
if self._chip_variant == 0x01:
355+
self._adc_gas = int(struct.unpack(">H", bytes(data[15:17]))[0] / 64)
356+
self._gas_range = data[16] & 0x0F
357+
else:
358+
self._adc_gas = int(struct.unpack(">H", bytes(data[13:15]))[0] / 64)
359+
self._gas_range = data[14] & 0x0F
341360

342361
var1 = (self._adc_temp / 8) - (self._temp_calibration[0] * 2)
343362
var2 = (var1 * self._temp_calibration[1]) / 2048

0 commit comments

Comments
 (0)