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
@@ -297,12 +301,21 @@ def altitude(self):
297
301
def gas (self ):
298
302
"""The gas resistance in ohms"""
299
303
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
306
319
return int (calc_gas_res )
307
320
308
321
def _perform_reading (self ):
@@ -321,23 +334,29 @@ def _perform_reading(self):
321
334
# turn on humidity oversample
322
335
self ._write (_BME680_REG_CTRL_HUM , [self ._humidity_oversample ])
323
336
# 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 ])
326
341
ctrl = self ._read_byte (_BME680_REG_CTRL_MEAS )
327
342
ctrl = (ctrl & 0xFC ) | 0x01 # enable single shot!
328
343
self ._write (_BME680_REG_CTRL_MEAS , [ctrl ])
329
344
new_data = False
330
345
while not new_data :
331
- data = self ._read (_BME680_REG_MEAS_STATUS , 15 )
346
+ data = self ._read (_BME680_REG_MEAS_STATUS , 17 )
332
347
new_data = data [0 ] & 0x80 != 0
333
348
time .sleep (0.005 )
334
349
self ._last_reading = time .monotonic ()
335
350
336
351
self ._adc_pres = _read24 (data [2 :5 ]) / 16
337
352
self ._adc_temp = _read24 (data [5 :8 ]) / 16
338
353
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
341
360
342
361
var1 = (self ._adc_temp / 8 ) - (self ._temp_calibration [0 ] * 2 )
343
362
var2 = (var1 * self ._temp_calibration [1 ]) / 2048
0 commit comments