Skip to content

Commit e71026e

Browse files
authored
Merge pull request #43 from caternuson/bme688_update
Update for BME688
2 parents 21161d6 + 28d9d2d commit e71026e

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
@@ -295,12 +299,21 @@ def altitude(self):
295299
def gas(self):
296300
"""The gas resistance in ohms"""
297301
self._perform_reading()
298-
var1 = (
299-
(1340 + (5 * self._sw_err)) * (_LOOKUP_TABLE_1[self._gas_range])
300-
) / 65536
301-
var2 = ((self._adc_gas * 32768) - 16777216) + var1
302-
var3 = (_LOOKUP_TABLE_2[self._gas_range] * var1) / 512
303-
calc_gas_res = (var3 + (var2 / 2)) / var2
302+
if self._chip_variant == 0x01:
303+
# taken from https://github.com/BoschSensortec/BME68x-Sensor-API
304+
var1 = 262144 >> self._gas_range
305+
var2 = self._adc_gas - 512
306+
var2 *= 3
307+
var2 = 4096 + var2
308+
calc_gas_res = (1000 * var1) / var2
309+
calc_gas_res = calc_gas_res * 100
310+
else:
311+
var1 = (
312+
(1340 + (5 * self._sw_err)) * (_LOOKUP_TABLE_1[self._gas_range])
313+
) / 65536
314+
var2 = ((self._adc_gas * 32768) - 16777216) + var1
315+
var3 = (_LOOKUP_TABLE_2[self._gas_range] * var1) / 512
316+
calc_gas_res = (var3 + (var2 / 2)) / var2
304317
return int(calc_gas_res)
305318

306319
def _perform_reading(self):
@@ -319,23 +332,29 @@ def _perform_reading(self):
319332
# turn on humidity oversample
320333
self._write(_BME680_REG_CTRL_HUM, [self._humidity_oversample])
321334
# gas measurements enabled
322-
self._write(_BME680_REG_CTRL_GAS, [_BME680_RUNGAS])
323-
335+
if self._chip_variant == 0x01:
336+
self._write(_BME680_REG_CTRL_GAS, [_BME680_RUNGAS << 1])
337+
else:
338+
self._write(_BME680_REG_CTRL_GAS, [_BME680_RUNGAS])
324339
ctrl = self._read_byte(_BME680_REG_CTRL_MEAS)
325340
ctrl = (ctrl & 0xFC) | 0x01 # enable single shot!
326341
self._write(_BME680_REG_CTRL_MEAS, [ctrl])
327342
new_data = False
328343
while not new_data:
329-
data = self._read(_BME680_REG_MEAS_STATUS, 15)
344+
data = self._read(_BME680_REG_MEAS_STATUS, 17)
330345
new_data = data[0] & 0x80 != 0
331346
time.sleep(0.005)
332347
self._last_reading = time.monotonic()
333348

334349
self._adc_pres = _read24(data[2:5]) / 16
335350
self._adc_temp = _read24(data[5:8]) / 16
336351
self._adc_hum = struct.unpack(">H", bytes(data[8:10]))[0]
337-
self._adc_gas = int(struct.unpack(">H", bytes(data[13:15]))[0] / 64)
338-
self._gas_range = data[14] & 0x0F
352+
if self._chip_variant == 0x01:
353+
self._adc_gas = int(struct.unpack(">H", bytes(data[15:17]))[0] / 64)
354+
self._gas_range = data[16] & 0x0F
355+
else:
356+
self._adc_gas = int(struct.unpack(">H", bytes(data[13:15]))[0] / 64)
357+
self._gas_range = data[14] & 0x0F
339358

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

0 commit comments

Comments
 (0)