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