33
33
import math
34
34
from micropython import const
35
35
36
+ try :
37
+ # Used only for type annotations.
38
+
39
+ import typing # pylint: disable=unused-import
40
+
41
+ from circuitpython_typing import ReadableBuffer
42
+ from busio import I2C , SPI
43
+ from digitalio import DigitalInOut
44
+
45
+ except ImportError :
46
+ pass
47
+
36
48
__version__ = "0.0.0-auto.0"
37
49
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BME680.git"
38
50
104
116
)
105
117
106
118
107
- def _read24 (arr ) :
119
+ def _read24 (arr : ReadableBuffer ) -> float :
108
120
"""Parse an unsigned 24-bit value as a floating point and return it."""
109
121
ret = 0.0
110
122
# print([hex(i) for i in arr])
@@ -120,7 +132,7 @@ class Adafruit_BME680:
120
132
:param int refresh_rate: Maximum number of readings per second. Faster property reads
121
133
will be from the previous reading."""
122
134
123
- def __init__ (self , * , refresh_rate = 10 ):
135
+ def __init__ (self , * , refresh_rate : int = 10 ) -> None :
124
136
"""Check the BME680 was found, read the coefficients and enable the sensor for continuous
125
137
reads."""
126
138
self ._write (_BME680_REG_SOFTRESET , [0xB6 ])
@@ -160,62 +172,62 @@ def __init__(self, *, refresh_rate=10):
160
172
self ._min_refresh_time = 1 / refresh_rate
161
173
162
174
@property
163
- def pressure_oversample (self ):
175
+ def pressure_oversample (self ) -> int :
164
176
"""The oversampling for pressure sensor"""
165
177
return _BME680_SAMPLERATES [self ._pressure_oversample ]
166
178
167
179
@pressure_oversample .setter
168
- def pressure_oversample (self , sample_rate ) :
180
+ def pressure_oversample (self , sample_rate : int ) -> None :
169
181
if sample_rate in _BME680_SAMPLERATES :
170
182
self ._pressure_oversample = _BME680_SAMPLERATES .index (sample_rate )
171
183
else :
172
184
raise RuntimeError ("Invalid oversample" )
173
185
174
186
@property
175
- def humidity_oversample (self ):
187
+ def humidity_oversample (self ) -> int :
176
188
"""The oversampling for humidity sensor"""
177
189
return _BME680_SAMPLERATES [self ._humidity_oversample ]
178
190
179
191
@humidity_oversample .setter
180
- def humidity_oversample (self , sample_rate ) :
192
+ def humidity_oversample (self , sample_rate : int ) -> None :
181
193
if sample_rate in _BME680_SAMPLERATES :
182
194
self ._humidity_oversample = _BME680_SAMPLERATES .index (sample_rate )
183
195
else :
184
196
raise RuntimeError ("Invalid oversample" )
185
197
186
198
@property
187
- def temperature_oversample (self ):
199
+ def temperature_oversample (self ) -> int :
188
200
"""The oversampling for temperature sensor"""
189
201
return _BME680_SAMPLERATES [self ._temp_oversample ]
190
202
191
203
@temperature_oversample .setter
192
- def temperature_oversample (self , sample_rate ) :
204
+ def temperature_oversample (self , sample_rate : int ) -> None :
193
205
if sample_rate in _BME680_SAMPLERATES :
194
206
self ._temp_oversample = _BME680_SAMPLERATES .index (sample_rate )
195
207
else :
196
208
raise RuntimeError ("Invalid oversample" )
197
209
198
210
@property
199
- def filter_size (self ):
211
+ def filter_size (self ) -> int :
200
212
"""The filter size for the built in IIR filter"""
201
213
return _BME680_FILTERSIZES [self ._filter ]
202
214
203
215
@filter_size .setter
204
- def filter_size (self , size ) :
216
+ def filter_size (self , size : int ) -> None :
205
217
if size in _BME680_FILTERSIZES :
206
218
self ._filter = _BME680_FILTERSIZES .index (size )
207
219
else :
208
220
raise RuntimeError ("Invalid size" )
209
221
210
222
@property
211
- def temperature (self ):
223
+ def temperature (self ) -> float :
212
224
"""The compensated temperature in degrees Celsius."""
213
225
self ._perform_reading ()
214
226
calc_temp = ((self ._t_fine * 5 ) + 128 ) / 256
215
227
return calc_temp / 100
216
228
217
229
@property
218
- def pressure (self ):
230
+ def pressure (self ) -> float :
219
231
"""The barometric pressure in hectoPascals"""
220
232
self ._perform_reading ()
221
233
var1 = (self ._t_fine / 2 ) - 64000
@@ -242,12 +254,12 @@ def pressure(self):
242
254
return calc_pres / 100
243
255
244
256
@property
245
- def relative_humidity (self ):
257
+ def relative_humidity (self ) -> float :
246
258
"""The relative humidity in RH %"""
247
259
return self .humidity
248
260
249
261
@property
250
- def humidity (self ):
262
+ def humidity (self ) -> float :
251
263
"""The relative humidity in RH %"""
252
264
self ._perform_reading ()
253
265
temp_scaled = ((self ._t_fine * 5 ) + 128 ) / 256
@@ -284,14 +296,14 @@ def humidity(self):
284
296
return calc_hum
285
297
286
298
@property
287
- def altitude (self ):
299
+ def altitude (self ) -> float :
288
300
"""The altitude based on current :attr:`pressure` vs the sea level pressure
289
301
(:attr:`sea_level_pressure`) - which you must enter ahead of time)"""
290
302
pressure = self .pressure # in Si units for hPascal
291
303
return 44330 * (1.0 - math .pow (pressure / self .sea_level_pressure , 0.1903 ))
292
304
293
305
@property
294
- def gas (self ):
306
+ def gas (self ) -> int :
295
307
"""The gas resistance in ohms"""
296
308
self ._perform_reading ()
297
309
if self ._chip_variant == 0x01 :
@@ -311,7 +323,7 @@ def gas(self):
311
323
calc_gas_res = (var3 + (var2 / 2 )) / var2
312
324
return int (calc_gas_res )
313
325
314
- def _perform_reading (self ):
326
+ def _perform_reading (self ) -> None :
315
327
"""Perform a single-shot reading from the sensor and fill internal data structure for
316
328
calculations"""
317
329
if time .monotonic () - self ._last_reading < self ._min_refresh_time :
@@ -357,7 +369,7 @@ def _perform_reading(self):
357
369
var3 = (var3 * self ._temp_calibration [2 ] * 16 ) / 16384
358
370
self ._t_fine = int (var2 + var3 )
359
371
360
- def _read_calibration (self ):
372
+ def _read_calibration (self ) -> None :
361
373
"""Read & save the calibration coefficients"""
362
374
coeff = self ._read (_BME680_BME680_COEFF_ADDR1 , 25 )
363
375
coeff += self ._read (_BME680_BME680_COEFF_ADDR2 , 16 )
@@ -381,14 +393,14 @@ def _read_calibration(self):
381
393
self ._heat_val = self ._read_byte (0x00 )
382
394
self ._sw_err = (self ._read_byte (0x04 ) & 0xF0 ) / 16
383
395
384
- def _read_byte (self , register ) :
396
+ def _read_byte (self , register : int ) -> int :
385
397
"""Read a byte register value and return it"""
386
398
return self ._read (register , 1 )[0 ]
387
399
388
- def _read (self , register , length ) :
400
+ def _read (self , register : int , length : int ) -> bytearray :
389
401
raise NotImplementedError ()
390
402
391
- def _write (self , register , values ) :
403
+ def _write (self , register : int , values : bytearray ) -> None :
392
404
raise NotImplementedError ()
393
405
394
406
@@ -437,7 +449,14 @@ class Adafruit_BME680_I2C(Adafruit_BME680):
437
449
438
450
"""
439
451
440
- def __init__ (self , i2c , address = 0x77 , debug = False , * , refresh_rate = 10 ):
452
+ def __init__ (
453
+ self ,
454
+ i2c : I2C ,
455
+ address : int = 0x77 ,
456
+ debug : bool = False ,
457
+ * ,
458
+ refresh_rate : int = 10
459
+ ) -> None :
441
460
"""Initialize the I2C device at the 'address' given"""
442
461
from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel
443
462
i2c_device ,
@@ -447,7 +466,7 @@ def __init__(self, i2c, address=0x77, debug=False, *, refresh_rate=10):
447
466
self ._debug = debug
448
467
super ().__init__ (refresh_rate = refresh_rate )
449
468
450
- def _read (self , register , length ) :
469
+ def _read (self , register : int , length : int ) -> bytearray :
451
470
"""Returns an array of 'length' bytes from the 'register'"""
452
471
with self ._i2c as i2c :
453
472
i2c .write (bytes ([register & 0xFF ]))
@@ -457,7 +476,7 @@ def _read(self, register, length):
457
476
print ("\t $%02X => %s" % (register , [hex (i ) for i in result ]))
458
477
return result
459
478
460
- def _write (self , register , values ) :
479
+ def _write (self , register : int , values : ReadableBuffer ) -> None :
461
480
"""Writes an array of 'length' bytes to the 'register'"""
462
481
with self ._i2c as i2c :
463
482
buffer = bytearray (2 * len (values ))
@@ -518,7 +537,15 @@ class Adafruit_BME680_SPI(Adafruit_BME680):
518
537
519
538
"""
520
539
521
- def __init__ (self , spi , cs , baudrate = 100000 , debug = False , * , refresh_rate = 10 ):
540
+ def __init__ (
541
+ self ,
542
+ spi : SPI ,
543
+ cs : DigitalInOut ,
544
+ baudrate : int = 100000 ,
545
+ debug : bool = False ,
546
+ * ,
547
+ refresh_rate : int = 10
548
+ ) -> None :
522
549
from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel
523
550
spi_device ,
524
551
)
@@ -527,7 +554,7 @@ def __init__(self, spi, cs, baudrate=100000, debug=False, *, refresh_rate=10):
527
554
self ._debug = debug
528
555
super ().__init__ (refresh_rate = refresh_rate )
529
556
530
- def _read (self , register , length ) :
557
+ def _read (self , register : int , length : int ) -> bytearray :
531
558
if register != _BME680_REG_STATUS :
532
559
# _BME680_REG_STATUS exists in both SPI memory pages
533
560
# For all other registers, we must set the correct memory page
@@ -542,7 +569,7 @@ def _read(self, register, length):
542
569
print ("\t $%02X => %s" % (register , [hex (i ) for i in result ]))
543
570
return result
544
571
545
- def _write (self , register , values ) :
572
+ def _write (self , register : int , values : ReadableBuffer ) -> None :
546
573
if register != _BME680_REG_STATUS :
547
574
# _BME680_REG_STATUS exists in both SPI memory pages
548
575
# For all other registers, we must set the correct memory page
@@ -557,7 +584,7 @@ def _write(self, register, values):
557
584
if self ._debug :
558
585
print ("\t $%02X <= %s" % (values [0 ], [hex (i ) for i in values [1 :]]))
559
586
560
- def _set_spi_mem_page (self , register ) :
587
+ def _set_spi_mem_page (self , register : int ) -> None :
561
588
spi_mem_page = 0x00
562
589
if register < 0x80 :
563
590
spi_mem_page = 0x10
0 commit comments