50
50
import time
51
51
import math
52
52
from micropython import const
53
+
53
54
try :
54
55
import struct
55
56
except ImportError :
86
87
87
88
_BME680_RUNGAS = const (0x10 )
88
89
89
- _LOOKUP_TABLE_1 = (2147483647.0 , 2147483647.0 , 2147483647.0 , 2147483647.0 , 2147483647.0 ,
90
- 2126008810.0 , 2147483647.0 , 2130303777.0 , 2147483647.0 , 2147483647.0 ,
91
- 2143188679.0 , 2136746228.0 , 2147483647.0 , 2126008810.0 , 2147483647.0 ,
92
- 2147483647.0 )
93
-
94
- _LOOKUP_TABLE_2 = (4096000000.0 , 2048000000.0 , 1024000000.0 , 512000000.0 , 255744255.0 , 127110228.0 ,
95
- 64000000.0 , 32258064.0 , 16016016.0 , 8000000.0 , 4000000.0 , 2000000.0 , 1000000.0 ,
96
- 500000.0 , 250000.0 , 125000.0 )
90
+ _LOOKUP_TABLE_1 = (
91
+ 2147483647.0 ,
92
+ 2147483647.0 ,
93
+ 2147483647.0 ,
94
+ 2147483647.0 ,
95
+ 2147483647.0 ,
96
+ 2126008810.0 ,
97
+ 2147483647.0 ,
98
+ 2130303777.0 ,
99
+ 2147483647.0 ,
100
+ 2147483647.0 ,
101
+ 2143188679.0 ,
102
+ 2136746228.0 ,
103
+ 2147483647.0 ,
104
+ 2126008810.0 ,
105
+ 2147483647.0 ,
106
+ 2147483647.0 ,
107
+ )
108
+
109
+ _LOOKUP_TABLE_2 = (
110
+ 4096000000.0 ,
111
+ 2048000000.0 ,
112
+ 1024000000.0 ,
113
+ 512000000.0 ,
114
+ 255744255.0 ,
115
+ 127110228.0 ,
116
+ 64000000.0 ,
117
+ 32258064.0 ,
118
+ 16016016.0 ,
119
+ 8000000.0 ,
120
+ 4000000.0 ,
121
+ 2000000.0 ,
122
+ 1000000.0 ,
123
+ 500000.0 ,
124
+ 250000.0 ,
125
+ 125000.0 ,
126
+ )
97
127
98
128
99
129
def _read24 (arr ):
100
130
"""Parse an unsigned 24-bit value as a floating point and return it."""
101
131
ret = 0.0
102
- #print([hex(i) for i in arr])
132
+ # print([hex(i) for i in arr])
103
133
for b in arr :
104
134
ret *= 256.0
105
135
ret += float (b & 0xFF )
@@ -111,6 +141,7 @@ class Adafruit_BME680:
111
141
112
142
:param int refresh_rate: Maximum number of readings per second. Faster property reads
113
143
will be from the previous reading."""
144
+
114
145
def __init__ (self , * , refresh_rate = 10 ):
115
146
"""Check the BME680 was found, read the coefficients and enable the sensor for continuous
116
147
reads."""
@@ -120,7 +151,7 @@ def __init__(self, *, refresh_rate=10):
120
151
# Check device ID.
121
152
chip_id = self ._read_byte (_BME680_REG_CHIPID )
122
153
if chip_id != _BME680_CHIPID :
123
- raise RuntimeError (' Failed to find BME680! Chip ID 0x%x' % chip_id )
154
+ raise RuntimeError (" Failed to find BME680! Chip ID 0x%x" % chip_id )
124
155
125
156
self ._read_calibration ()
126
157
@@ -199,7 +230,7 @@ def filter_size(self, size):
199
230
def temperature (self ):
200
231
"""The compensated temperature in degrees celsius."""
201
232
self ._perform_reading ()
202
- calc_temp = ((( self ._t_fine * 5 ) + 128 ) / 256 )
233
+ calc_temp = ((self ._t_fine * 5 ) + 128 ) / 256
203
234
return calc_temp / 100
204
235
205
236
@property
@@ -211,31 +242,49 @@ def pressure(self):
211
242
var2 = (var2 * self ._pressure_calibration [5 ]) / 4
212
243
var2 = var2 + (var1 * self ._pressure_calibration [4 ] * 2 )
213
244
var2 = (var2 / 4 ) + (self ._pressure_calibration [3 ] * 65536 )
214
- var1 = (((((var1 / 4 ) * (var1 / 4 )) / 8192 ) *
215
- (self ._pressure_calibration [2 ] * 32 ) / 8 ) +
216
- ((self ._pressure_calibration [1 ] * var1 ) / 2 ))
245
+ var1 = (
246
+ (((var1 / 4 ) * (var1 / 4 )) / 8192 )
247
+ * (self ._pressure_calibration [2 ] * 32 )
248
+ / 8
249
+ ) + ((self ._pressure_calibration [1 ] * var1 ) / 2 )
217
250
var1 = var1 / 262144
218
251
var1 = ((32768 + var1 ) * self ._pressure_calibration [0 ]) / 32768
219
252
calc_pres = 1048576 - self ._adc_pres
220
253
calc_pres = (calc_pres - (var2 / 4096 )) * 3125
221
254
calc_pres = (calc_pres / var1 ) * 2
222
- var1 = (self ._pressure_calibration [8 ] * (((calc_pres / 8 ) * (calc_pres / 8 )) / 8192 )) / 4096
255
+ var1 = (
256
+ self ._pressure_calibration [8 ] * (((calc_pres / 8 ) * (calc_pres / 8 )) / 8192 )
257
+ ) / 4096
223
258
var2 = ((calc_pres / 4 ) * self ._pressure_calibration [7 ]) / 8192
224
259
var3 = (((calc_pres / 256 ) ** 3 ) * self ._pressure_calibration [9 ]) / 131072
225
- calc_pres += (( var1 + var2 + var3 + (self ._pressure_calibration [6 ] * 128 )) / 16 )
226
- return calc_pres / 100
260
+ calc_pres += (var1 + var2 + var3 + (self ._pressure_calibration [6 ] * 128 )) / 16
261
+ return calc_pres / 100
227
262
228
263
@property
229
264
def humidity (self ):
230
265
"""The relative humidity in RH %"""
231
266
self ._perform_reading ()
232
267
temp_scaled = ((self ._t_fine * 5 ) + 128 ) / 256
233
- var1 = ((self ._adc_hum - (self ._humidity_calibration [0 ] * 16 )) -
234
- ((temp_scaled * self ._humidity_calibration [2 ]) / 200 ))
235
- var2 = (self ._humidity_calibration [1 ] *
236
- (((temp_scaled * self ._humidity_calibration [3 ]) / 100 ) +
237
- (((temp_scaled * ((temp_scaled * self ._humidity_calibration [4 ]) / 100 )) /
238
- 64 ) / 100 ) + 16384 )) / 1024
268
+ var1 = (self ._adc_hum - (self ._humidity_calibration [0 ] * 16 )) - (
269
+ (temp_scaled * self ._humidity_calibration [2 ]) / 200
270
+ )
271
+ var2 = (
272
+ self ._humidity_calibration [1 ]
273
+ * (
274
+ ((temp_scaled * self ._humidity_calibration [3 ]) / 100 )
275
+ + (
276
+ (
277
+ (
278
+ temp_scaled
279
+ * ((temp_scaled * self ._humidity_calibration [4 ]) / 100 )
280
+ )
281
+ / 64
282
+ )
283
+ / 100
284
+ )
285
+ + 16384
286
+ )
287
+ ) / 1024
239
288
var3 = var1 * var2
240
289
var4 = self ._humidity_calibration [5 ] * 128
241
290
var4 = (var4 + ((temp_scaled * self ._humidity_calibration [6 ]) / 100 )) / 16
@@ -254,14 +303,16 @@ def humidity(self):
254
303
def altitude (self ):
255
304
"""The altitude based on current ``pressure`` vs the sea level pressure
256
305
(``sea_level_pressure``) - which you must enter ahead of time)"""
257
- pressure = self .pressure # in Si units for hPascal
306
+ pressure = self .pressure # in Si units for hPascal
258
307
return 44330 * (1.0 - math .pow (pressure / self .sea_level_pressure , 0.1903 ))
259
308
260
309
@property
261
310
def gas (self ):
262
311
"""The gas resistance in ohms"""
263
312
self ._perform_reading ()
264
- var1 = ((1340 + (5 * self ._sw_err )) * (_LOOKUP_TABLE_1 [self ._gas_range ])) / 65536
313
+ var1 = (
314
+ (1340 + (5 * self ._sw_err )) * (_LOOKUP_TABLE_1 [self ._gas_range ])
315
+ ) / 65536
265
316
var2 = ((self ._adc_gas * 32768 ) - 16777216 ) + var1
266
317
var3 = (_LOOKUP_TABLE_2 [self ._gas_range ] * var1 ) / 512
267
318
calc_gas_res = (var3 + (var2 / 2 )) / var2
@@ -276,8 +327,10 @@ def _perform_reading(self):
276
327
# set filter
277
328
self ._write (_BME680_REG_CONFIG , [self ._filter << 2 ])
278
329
# turn on temp oversample & pressure oversample
279
- self ._write (_BME680_REG_CTRL_MEAS ,
280
- [(self ._temp_oversample << 5 )| (self ._pressure_oversample << 2 )])
330
+ self ._write (
331
+ _BME680_REG_CTRL_MEAS ,
332
+ [(self ._temp_oversample << 5 ) | (self ._pressure_oversample << 2 )],
333
+ )
281
334
# turn on humidity oversample
282
335
self ._write (_BME680_REG_CTRL_HUM , [self ._humidity_oversample ])
283
336
# gas measurements enabled
@@ -295,8 +348,8 @@ def _perform_reading(self):
295
348
296
349
self ._adc_pres = _read24 (data [2 :5 ]) / 16
297
350
self ._adc_temp = _read24 (data [5 :8 ]) / 16
298
- self ._adc_hum = struct .unpack ('>H' , bytes (data [8 :10 ]))[0 ]
299
- self ._adc_gas = int (struct .unpack ('>H' , bytes (data [13 :15 ]))[0 ] / 64 )
351
+ self ._adc_hum = struct .unpack (">H" , bytes (data [8 :10 ]))[0 ]
352
+ self ._adc_gas = int (struct .unpack (">H" , bytes (data [13 :15 ]))[0 ] / 64 )
300
353
self ._gas_range = data [14 ] & 0x0F
301
354
302
355
var1 = (self ._adc_temp / 8 ) - (self ._temp_calibration [0 ] * 2 )
@@ -310,11 +363,13 @@ def _read_calibration(self):
310
363
coeff = self ._read (_BME680_BME680_COEFF_ADDR1 , 25 )
311
364
coeff += self ._read (_BME680_BME680_COEFF_ADDR2 , 16 )
312
365
313
- coeff = list (struct .unpack (' <hbBHhbBhhbbHhhBBBHbbbBbHhbb' , bytes (coeff [1 :39 ])))
314
- #print("\n\n",coeff)
366
+ coeff = list (struct .unpack (" <hbBHhbBhhbbHhhBBBHbbbBbHhbb" , bytes (coeff [1 :39 ])))
367
+ # print("\n\n",coeff)
315
368
coeff = [float (i ) for i in coeff ]
316
369
self ._temp_calibration = [coeff [x ] for x in [23 , 0 , 1 ]]
317
- self ._pressure_calibration = [coeff [x ] for x in [3 , 4 , 5 , 7 , 8 , 10 , 9 , 12 , 13 , 14 ]]
370
+ self ._pressure_calibration = [
371
+ coeff [x ] for x in [3 , 4 , 5 , 7 , 8 , 10 , 9 , 12 , 13 , 14 ]
372
+ ]
318
373
self ._humidity_calibration = [coeff [x ] for x in [17 , 16 , 18 , 19 , 20 , 21 , 22 ]]
319
374
self ._gas_calibration = [coeff [x ] for x in [25 , 24 , 26 ]]
320
375
@@ -345,9 +400,13 @@ class Adafruit_BME680_I2C(Adafruit_BME680):
345
400
:param bool debug: Print debug statements when True.
346
401
:param int refresh_rate: Maximum number of readings per second. Faster property reads
347
402
will be from the previous reading."""
403
+
348
404
def __init__ (self , i2c , address = 0x77 , debug = False , * , refresh_rate = 10 ):
349
405
"""Initialize the I2C device at the 'address' given"""
350
- from adafruit_bus_device import i2c_device
406
+ from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel
407
+ i2c_device ,
408
+ )
409
+
351
410
self ._i2c = i2c_device .I2CDevice (i2c , address )
352
411
self ._debug = debug
353
412
super ().__init__ (refresh_rate = refresh_rate )
@@ -386,38 +445,41 @@ class Adafruit_BME680_SPI(Adafruit_BME680):
386
445
"""
387
446
388
447
def __init__ (self , spi , cs , baudrate = 100000 , debug = False , * , refresh_rate = 10 ):
389
- from adafruit_bus_device import spi_device
448
+ from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel
449
+ spi_device ,
450
+ )
451
+
390
452
self ._spi = spi_device .SPIDevice (spi , cs , baudrate = baudrate )
391
453
self ._debug = debug
392
454
super ().__init__ (refresh_rate = refresh_rate )
393
455
394
456
def _read (self , register , length ):
395
457
if register != _BME680_REG_STATUS :
396
- #_BME680_REG_STATUS exists in both SPI memory pages
397
- #For all other registers, we must set the correct memory page
458
+ # _BME680_REG_STATUS exists in both SPI memory pages
459
+ # For all other registers, we must set the correct memory page
398
460
self ._set_spi_mem_page (register )
399
461
400
462
register = (register | 0x80 ) & 0xFF # Read single, bit 7 high.
401
463
with self ._spi as spi :
402
- spi .write (bytearray ([register ])) #pylint: disable=no-member
464
+ spi .write (bytearray ([register ])) # pylint: disable=no-member
403
465
result = bytearray (length )
404
- spi .readinto (result ) # pylint: disable=no-member
466
+ spi .readinto (result ) # pylint: disable=no-member
405
467
if self ._debug :
406
468
print ("\t $%02X => %s" % (register , [hex (i ) for i in result ]))
407
469
return result
408
470
409
471
def _write (self , register , values ):
410
472
if register != _BME680_REG_STATUS :
411
- #_BME680_REG_STATUS exists in both SPI memory pages
412
- #For all other registers, we must set the correct memory page
473
+ # _BME680_REG_STATUS exists in both SPI memory pages
474
+ # For all other registers, we must set the correct memory page
413
475
self ._set_spi_mem_page (register )
414
476
register &= 0x7F # Write, bit 7 low.
415
477
with self ._spi as spi :
416
478
buffer = bytearray (2 * len (values ))
417
479
for i , value in enumerate (values ):
418
480
buffer [2 * i ] = register + i
419
481
buffer [2 * i + 1 ] = value & 0xFF
420
- spi .write (buffer ) # pylint: disable=no-member
482
+ spi .write (buffer ) # pylint: disable=no-member
421
483
if self ._debug :
422
484
print ("\t $%02X <= %s" % (values [0 ], [hex (i ) for i in values [1 :]]))
423
485
0 commit comments