47
47
_BME680_CHIPID = const (0x61 )
48
48
49
49
_BME680_REG_CHIPID = const (0xD0 )
50
+ _BME68X_REG_VARIANT = const (0xF0 )
50
51
_BME680_BME680_COEFF_ADDR1 = const (0x89 )
51
52
_BME680_BME680_COEFF_ADDR2 = const (0xE1 )
52
53
_BME680_BME680_RES_HEAT_0 = const (0x5A )
@@ -135,6 +136,9 @@ def __init__(self, *, refresh_rate=10):
135
136
if chip_id != _BME680_CHIPID :
136
137
raise RuntimeError ("Failed to find BME680! Chip ID 0x%x" % chip_id )
137
138
139
+ # Get variant
140
+ self ._chip_variant = self ._read_byte (_BME68X_REG_VARIANT )
141
+
138
142
self ._read_calibration ()
139
143
140
144
# set up heater
@@ -295,12 +299,21 @@ def altitude(self):
295
299
def gas (self ):
296
300
"""The gas resistance in ohms"""
297
301
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
304
317
return int (calc_gas_res )
305
318
306
319
def _perform_reading (self ):
@@ -319,23 +332,29 @@ def _perform_reading(self):
319
332
# turn on humidity oversample
320
333
self ._write (_BME680_REG_CTRL_HUM , [self ._humidity_oversample ])
321
334
# 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 ])
324
339
ctrl = self ._read_byte (_BME680_REG_CTRL_MEAS )
325
340
ctrl = (ctrl & 0xFC ) | 0x01 # enable single shot!
326
341
self ._write (_BME680_REG_CTRL_MEAS , [ctrl ])
327
342
new_data = False
328
343
while not new_data :
329
- data = self ._read (_BME680_REG_MEAS_STATUS , 15 )
344
+ data = self ._read (_BME680_REG_MEAS_STATUS , 17 )
330
345
new_data = data [0 ] & 0x80 != 0
331
346
time .sleep (0.005 )
332
347
self ._last_reading = time .monotonic ()
333
348
334
349
self ._adc_pres = _read24 (data [2 :5 ]) / 16
335
350
self ._adc_temp = _read24 (data [5 :8 ]) / 16
336
351
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
339
358
340
359
var1 = (self ._adc_temp / 8 ) - (self ._temp_calibration [0 ] * 2 )
341
360
var2 = (var1 * self ._temp_calibration [1 ]) / 2048
0 commit comments