33
33
from adafruit_bus_device import i2c_device
34
34
from micropython import const
35
35
36
+ try :
37
+ from typing import Union , Optional # pylint: disable=unused-import
38
+ from busio import I2C
39
+ except ImportError :
40
+ pass
36
41
37
42
__version__ = "0.0.0+auto.0"
38
43
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_SCD30.git"
@@ -85,7 +90,9 @@ class SCD30:
85
90
86
91
"""
87
92
88
- def __init__ (self , i2c_bus , ambient_pressure = 0 , address = SCD30_DEFAULT_ADDR ):
93
+ def __init__ (
94
+ self , i2c_bus : I2C , ambient_pressure : int = 0 , address : int = SCD30_DEFAULT_ADDR
95
+ ) -> None :
89
96
if ambient_pressure != 0 :
90
97
if ambient_pressure < 700 or ambient_pressure > 1400 :
91
98
raise AttributeError ("`ambient_pressure` must be from 700-1400 mBar" )
@@ -104,13 +111,13 @@ def __init__(self, i2c_bus, ambient_pressure=0, address=SCD30_DEFAULT_ADDR):
104
111
self ._relative_humidity = None
105
112
self ._co2 = None
106
113
107
- def reset (self ):
114
+ def reset (self ) -> None :
108
115
"""Perform a soft reset on the sensor, restoring default values"""
109
116
self ._send_command (_CMD_SOFT_RESET )
110
117
time .sleep (0.1 ) # not mentioned by datasheet, but required to avoid IO error
111
118
112
119
@property
113
- def measurement_interval (self ):
120
+ def measurement_interval (self ) -> int :
114
121
"""Sets the interval between readings in seconds. The interval value must be from 2-1800
115
122
116
123
.. note::
@@ -121,13 +128,13 @@ def measurement_interval(self):
121
128
return self ._read_register (_CMD_SET_MEASUREMENT_INTERVAL )
122
129
123
130
@measurement_interval .setter
124
- def measurement_interval (self , value ) :
131
+ def measurement_interval (self , value : int ) -> None :
125
132
if value < 2 or value > 1800 :
126
133
raise AttributeError ("measurement_interval must be from 2-1800 seconds" )
127
134
self ._send_command (_CMD_SET_MEASUREMENT_INTERVAL , value )
128
135
129
136
@property
130
- def self_calibration_enabled (self ):
137
+ def self_calibration_enabled (self ) -> bool :
131
138
"""Enables or disables automatic self calibration (ASC). To work correctly, the sensor must
132
139
be on and active for 7 days after enabling ASC, and exposed to fresh air for at least 1 hour
133
140
per day. Consult the manufacturer's documentation for more information.
@@ -144,32 +151,32 @@ def self_calibration_enabled(self):
144
151
return self ._read_register (_CMD_AUTOMATIC_SELF_CALIBRATION ) == 1
145
152
146
153
@self_calibration_enabled .setter
147
- def self_calibration_enabled (self , enabled ) :
154
+ def self_calibration_enabled (self , enabled : bool ) -> None :
148
155
self ._send_command (_CMD_AUTOMATIC_SELF_CALIBRATION , enabled )
149
156
if enabled :
150
157
time .sleep (0.01 )
151
158
152
159
@property
153
- def data_available (self ):
160
+ def data_available (self ) -> bool :
154
161
"""Check the sensor to see if new data is available"""
155
162
return self ._read_register (_CMD_GET_DATA_READY )
156
163
157
164
@property
158
- def ambient_pressure (self ):
165
+ def ambient_pressure (self ) -> int :
159
166
"""Specifies the ambient air pressure at the measurement location in mBar. Setting this
160
167
value adjusts the CO2 measurement calculations to account for the air pressure's effect on
161
168
readings. Values must be in mBar, from 700 to 1400 mBar"""
162
169
return self ._read_register (_CMD_CONTINUOUS_MEASUREMENT )
163
170
164
171
@ambient_pressure .setter
165
- def ambient_pressure (self , pressure_mbar ) :
172
+ def ambient_pressure (self , pressure_mbar : int ) -> None :
166
173
pressure_mbar = int (pressure_mbar )
167
174
if pressure_mbar != 0 and (pressure_mbar > 1400 or pressure_mbar < 700 ):
168
175
raise AttributeError ("ambient_pressure must be from 700 to 1400 mBar" )
169
176
self ._send_command (_CMD_CONTINUOUS_MEASUREMENT , pressure_mbar )
170
177
171
178
@property
172
- def altitude (self ):
179
+ def altitude (self ) -> int :
173
180
"""Specifies the altitude at the measurement location in meters above sea level. Setting
174
181
this value adjusts the CO2 measurement calculations to account for the air pressure's effect
175
182
on readings.
@@ -182,11 +189,11 @@ def altitude(self):
182
189
return self ._read_register (_CMD_SET_ALTITUDE_COMPENSATION )
183
190
184
191
@altitude .setter
185
- def altitude (self , altitude ) :
192
+ def altitude (self , altitude : int ) -> None :
186
193
self ._send_command (_CMD_SET_ALTITUDE_COMPENSATION , int (altitude ))
187
194
188
195
@property
189
- def temperature_offset (self ):
196
+ def temperature_offset (self ) -> float :
190
197
"""Specifies the offset to be added to the reported measurements to account for a bias in
191
198
the measured signal. Value is in degrees Celsius with a resolution of 0.01 degrees and a
192
199
maximum value of 655.35 C
@@ -200,7 +207,7 @@ def temperature_offset(self):
200
207
return raw_offset / 100.0
201
208
202
209
@temperature_offset .setter
203
- def temperature_offset (self , offset ) :
210
+ def temperature_offset (self , offset : Union [ float , int ]) -> None :
204
211
if offset > 655.35 :
205
212
raise AttributeError (
206
213
"Offset value must be less than or equal to 655.35 degrees Celsius"
@@ -209,7 +216,7 @@ def temperature_offset(self, offset):
209
216
self ._send_command (_CMD_SET_TEMPERATURE_OFFSET , int (offset * 100 ))
210
217
211
218
@property
212
- def forced_recalibration_reference (self ):
219
+ def forced_recalibration_reference (self ) -> int :
213
220
"""Specifies the concentration of a reference source of CO2 placed in close proximity to the
214
221
sensor. The value must be from 400 to 2000 ppm.
215
222
@@ -221,11 +228,11 @@ def forced_recalibration_reference(self):
221
228
return self ._read_register (_CMD_SET_FORCED_RECALIBRATION_FACTOR )
222
229
223
230
@forced_recalibration_reference .setter
224
- def forced_recalibration_reference (self , reference_value ) :
231
+ def forced_recalibration_reference (self , reference_value : int ) -> None :
225
232
self ._send_command (_CMD_SET_FORCED_RECALIBRATION_FACTOR , reference_value )
226
233
227
234
@property
228
- def CO2 (self ): # pylint:disable=invalid-name
235
+ def CO2 (self ) -> float : # pylint:disable=invalid-name
229
236
"""Returns the CO2 concentration in PPM (parts per million)
230
237
231
238
.. note::
@@ -237,7 +244,7 @@ def CO2(self): # pylint:disable=invalid-name
237
244
return self ._co2
238
245
239
246
@property
240
- def temperature (self ):
247
+ def temperature (self ) -> float :
241
248
"""Returns the current temperature in degrees Celsius
242
249
243
250
.. note::
@@ -249,7 +256,7 @@ def temperature(self):
249
256
return self ._temperature
250
257
251
258
@property
252
- def relative_humidity (self ):
259
+ def relative_humidity (self ) -> float :
253
260
"""Returns the current relative humidity in %rH.
254
261
255
262
.. note::
@@ -260,7 +267,7 @@ def relative_humidity(self):
260
267
self ._read_data ()
261
268
return self ._relative_humidity
262
269
263
- def _send_command (self , command , arguments = None ):
270
+ def _send_command (self , command : int , arguments : Optional [ int ] = None ) -> None :
264
271
# if there is an argument, calculate the CRC and include it as well.
265
272
if arguments is not None :
266
273
self ._crc_buffer [0 ] = arguments >> 8
@@ -280,7 +287,7 @@ def _send_command(self, command, arguments=None):
280
287
i2c .write (self ._buffer , end = end_byte )
281
288
time .sleep (0.05 ) # 3ms min delay
282
289
283
- def _read_register (self , reg_addr ) :
290
+ def _read_register (self , reg_addr : int ) -> int :
284
291
self ._buffer [0 ] = reg_addr >> 8
285
292
self ._buffer [1 ] = reg_addr & 0xFF
286
293
with self .i2c_device as i2c :
@@ -293,7 +300,7 @@ def _read_register(self, reg_addr):
293
300
raise RuntimeError ("CRC check failed while reading data" )
294
301
return unpack_from (">H" , self ._buffer [0 :2 ])[0 ]
295
302
296
- def _read_data (self ):
303
+ def _read_data (self ) -> None :
297
304
self ._send_command (_CMD_READ_MEASUREMENT )
298
305
with self .i2c_device as i2c :
299
306
i2c .readinto (self ._buffer )
@@ -314,11 +321,11 @@ def _read_data(self):
314
321
">f" , self ._buffer [12 :14 ] + self ._buffer [15 :17 ]
315
322
)[0 ]
316
323
317
- def _check_crc (self , data_bytes , crc ) :
324
+ def _check_crc (self , data_bytes : bytearray , crc : int ) -> bool :
318
325
return crc == self ._crc8 (bytearray (data_bytes ))
319
326
320
327
@staticmethod
321
- def _crc8 (buffer ) :
328
+ def _crc8 (buffer : bytearray ) -> int :
322
329
crc = 0xFF
323
330
for byte in buffer :
324
331
crc ^= byte
0 commit comments