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