32
32
33
33
from micropython import const
34
34
35
+ try :
36
+ from typing import Tuple
37
+ from digitalio import DigitalInOut
38
+ from busio import I2C , SPI
39
+ except ImportError :
40
+ pass
41
+
35
42
__version__ = "0.0.0+auto.0"
36
43
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BMP3XX.git"
37
44
57
64
class BMP3XX :
58
65
"""Base class for BMP3XX sensor."""
59
66
60
- def __init__ (self ):
67
+ def __init__ (self ) -> None :
61
68
chip_id = self ._read_byte (_REGISTER_CHIPID )
62
69
if chip_id not in (_BMP388_CHIP_ID , _BMP390_CHIP_ID ):
63
- raise RuntimeError ("Failed to find BMP3XX! Chip ID 0x%x" % chip_id )
70
+ raise RuntimeError (f "Failed to find BMP3XX! Chip ID { hex ( chip_id ) } " )
64
71
self ._read_coefficients ()
65
72
self .reset ()
66
73
self .sea_level_pressure = 1013.25
67
74
self ._wait_time = 0.002 # change this value to have faster reads if needed
68
75
"""Sea level pressure in hPa."""
69
76
70
77
@property
71
- def pressure (self ):
78
+ def pressure (self ) -> float :
72
79
"""The pressure in hPa."""
73
80
return self ._read ()[0 ] / 100
74
81
75
82
@property
76
- def temperature (self ):
83
+ def temperature (self ) -> float :
77
84
"""The temperature in degrees Celsius"""
78
85
return self ._read ()[1 ]
79
86
80
87
@property
81
- def altitude (self ):
88
+ def altitude (self ) -> float :
82
89
"""The altitude in meters based on the currently set sea level pressure."""
83
90
# see https://www.weather.gov/media/epz/wxcalc/pressureAltitude.pdf
84
91
return 44307.7 * (1 - (self .pressure / self .sea_level_pressure ) ** 0.190284 )
85
92
86
93
@property
87
- def pressure_oversampling (self ):
94
+ def pressure_oversampling (self ) -> int :
88
95
"""The pressure oversampling setting."""
89
96
return _OSR_SETTINGS [self ._read_byte (_REGISTER_OSR ) & 0x07 ]
90
97
91
98
@pressure_oversampling .setter
92
- def pressure_oversampling (self , oversample ) :
99
+ def pressure_oversampling (self , oversample : int ) -> None :
93
100
if oversample not in _OSR_SETTINGS :
94
- raise ValueError ("Oversampling must be one of: {}" . format ( _OSR_SETTINGS ) )
101
+ raise ValueError (f "Oversampling must be one of: { _OSR_SETTINGS } " )
95
102
new_setting = self ._read_byte (_REGISTER_OSR ) & 0xF8 | _OSR_SETTINGS .index (
96
103
oversample
97
104
)
98
105
self ._write_register_byte (_REGISTER_OSR , new_setting )
99
106
100
107
@property
101
- def temperature_oversampling (self ):
108
+ def temperature_oversampling (self ) -> int :
102
109
"""The temperature oversampling setting."""
103
110
return _OSR_SETTINGS [self ._read_byte (_REGISTER_OSR ) >> 3 & 0x07 ]
104
111
105
112
@temperature_oversampling .setter
106
- def temperature_oversampling (self , oversample ) :
113
+ def temperature_oversampling (self , oversample : int ) -> None :
107
114
if oversample not in _OSR_SETTINGS :
108
- raise ValueError ("Oversampling must be one of: {}" . format ( _OSR_SETTINGS ) )
115
+ raise ValueError (f "Oversampling must be one of: { _OSR_SETTINGS } " )
109
116
new_setting = (
110
117
self ._read_byte (_REGISTER_OSR ) & 0xC7 | _OSR_SETTINGS .index (oversample ) << 3
111
118
)
112
119
self ._write_register_byte (_REGISTER_OSR , new_setting )
113
120
114
121
@property
115
- def filter_coefficient (self ):
122
+ def filter_coefficient (self ) -> int :
116
123
"""The IIR filter coefficient."""
117
124
return _IIR_SETTINGS [self ._read_byte (_REGISTER_CONFIG ) >> 1 & 0x07 ]
118
125
119
126
@filter_coefficient .setter
120
- def filter_coefficient (self , coef ) :
127
+ def filter_coefficient (self , coef : int ) -> None :
121
128
if coef not in _IIR_SETTINGS :
122
- raise ValueError (
123
- "Filter coefficient must be one of: {}" .format (_IIR_SETTINGS )
124
- )
129
+ raise ValueError (f"Filter coefficient must be one of: { _IIR_SETTINGS } " )
125
130
self ._write_register_byte (_REGISTER_CONFIG , _IIR_SETTINGS .index (coef ) << 1 )
126
131
127
- def reset (self ):
132
+ def reset (self ) -> None :
128
133
"""Perform a power on reset. All user configuration settings are overwritten
129
134
with their default state.
130
135
"""
131
136
self ._write_register_byte (_REGISTER_CMD , 0xB6 )
132
137
133
- def _read (self ):
138
+ def _read (self ) -> Tuple [ float , float ] :
134
139
"""Returns a tuple for temperature and pressure."""
135
140
# OK, pylint. This one is all kinds of stuff you shouldn't worry about.
136
141
# pylint: disable=invalid-name, too-many-locals
@@ -178,7 +183,7 @@ def _read(self):
178
183
# pressure in hPa, temperature in deg C
179
184
return pressure , temperature
180
185
181
- def _read_coefficients (self ):
186
+ def _read_coefficients (self ) -> None :
182
187
"""Read & save the calibration coefficients"""
183
188
coeff = self ._read_register (_REGISTER_CAL_DATA , 21 )
184
189
# See datasheet, pg. 27, table 22
@@ -205,15 +210,15 @@ def _read_coefficients(self):
205
210
coeff [13 ] / 2 ** 65.0 ,
206
211
) # P11
207
212
208
- def _read_byte (self , register ) :
213
+ def _read_byte (self , register : int ) -> int :
209
214
"""Read a byte register value and return it"""
210
215
return self ._read_register (register , 1 )[0 ]
211
216
212
- def _read_register (self , register , length ) :
217
+ def _read_register (self , register : int , length : int ) -> bytearray :
213
218
"""Low level register reading, not implemented in base class"""
214
219
raise NotImplementedError ()
215
220
216
- def _write_register_byte (self , register , value ) :
221
+ def _write_register_byte (self , register : int , value : int ) -> None :
217
222
"""Low level register writing, not implemented in base class"""
218
223
raise NotImplementedError ()
219
224
@@ -252,21 +257,21 @@ class BMP3XX_I2C(BMP3XX):
252
257
253
258
"""
254
259
255
- def __init__ (self , i2c , address = 0x77 ):
260
+ def __init__ (self , i2c : I2C , address : int = 0x77 ) -> None :
256
261
from adafruit_bus_device import i2c_device
257
262
258
263
self ._i2c = i2c_device .I2CDevice (i2c , address )
259
264
super ().__init__ ()
260
265
261
- def _read_register (self , register , length ) :
266
+ def _read_register (self , register : int , length : int ) -> bytearray :
262
267
"""Low level register reading over I2C, returns a list of values"""
263
268
result = bytearray (length )
264
269
with self ._i2c as i2c :
265
270
i2c .write (bytes ([register & 0xFF ]))
266
271
i2c .readinto (result )
267
272
return result
268
273
269
- def _write_register_byte (self , register , value ) :
274
+ def _write_register_byte (self , register : int , value : int ) -> None :
270
275
"""Low level register writing over I2C, writes one 8-bit value"""
271
276
with self ._i2c as i2c :
272
277
i2c .write (bytes ((register & 0xFF , value & 0xFF )))
@@ -308,7 +313,7 @@ class BMP3XX_SPI(BMP3XX):
308
313
309
314
"""
310
315
311
- def __init__ (self , spi , cs ) :
316
+ def __init__ (self , spi : SPI , cs : DigitalInOut ) -> None :
312
317
from adafruit_bus_device import spi_device
313
318
314
319
self ._spi = spi_device .SPIDevice (spi , cs )
@@ -317,7 +322,7 @@ def __init__(self, spi, cs):
317
322
time .sleep (0.001 )
318
323
super ().__init__ ()
319
324
320
- def _read_register (self , register , length ) :
325
+ def _read_register (self , register : int , length : int ) -> bytearray :
321
326
"""Low level register reading over SPI, returns a list of values"""
322
327
result = bytearray (length )
323
328
with self ._spi as spi :
@@ -326,7 +331,7 @@ def _read_register(self, register, length):
326
331
spi .readinto (result )
327
332
return result
328
333
329
- def _write_register_byte (self , register , value ) :
334
+ def _write_register_byte (self , register : int , value : int ) -> None :
330
335
"""Low level register writing over SPI, writes one 8-bit value"""
331
336
with self ._spi as spi :
332
337
# pylint: disable=no-member
0 commit comments