Skip to content

Commit 983394e

Browse files
committed
cleanup
1 parent 36009c2 commit 983394e

File tree

3 files changed

+69
-45
lines changed

3 files changed

+69
-45
lines changed

adafruit_scd30.py

Lines changed: 58 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,14 @@ def reset(self):
8080

8181
@property
8282
def measurement_interval(self):
83-
"""Sets the interval between readings"""
84-
# raise RuntimeError("NOT WORKING")
83+
"""Sets the interval between readings in seconds. The interval value must be from 2-1800"""
84+
8585
return self._read_register(_CMD_SET_MEASUREMENT_INTERVAL)
8686

8787
@measurement_interval.setter
8888
def measurement_interval(self, value):
89+
if value < 2 or value > 1800:
90+
raise AttributeError("measurement_interval must be from 2-1800 seconds")
8991
self._send_command(_CMD_SET_MEASUREMENT_INTERVAL, value)
9092

9193
@property
@@ -102,30 +104,9 @@ def self_calibration_enabled(self):
102104
def self_calibration_enabled(self, enabled):
103105
self._send_command(_CMD_AUTOMATIC_SELF_CALIBRATION, enabled)
104106

105-
def _send_command(self, command, arguments=None):
106-
if arguments is not None:
107-
self._crc_buffer[0] = arguments >> 8
108-
self._crc_buffer[1] = arguments & 0xFF
109-
self._buffer[2] = arguments >> 8
110-
self._buffer[3] = arguments & 0xFF
111-
crc = self._crc8(self._crc_buffer)
112-
self._buffer[4] = crc
113-
end_byte = 5
114-
else:
115-
end_byte = 2
116-
117-
self._buffer[0] = command >> 8
118-
self._buffer[1] = command & 0xFF
119-
120-
with self.i2c_device as i2c:
121-
i2c.write(self._buffer, end=end_byte)
122-
123107
@property
124-
def _data_available(self):
125-
"""
126-
Check the sensor to see if new data is available
127-
"""
128-
108+
def data_available(self):
109+
"""Check the sensor to see if new data is available"""
129110
return self._read_register(_CMD_GET_DATA_READY)
130111

131112
@property
@@ -155,13 +136,17 @@ def altitude(self, altitude):
155136
@property
156137
def temperature_offset(self):
157138
"""Specifies the offset to be added to the reported measurements to account for a bias in
158-
the measured signal."""
139+
the measured signal. Value is in degrees C with a resolution of 0.01 degrees and a maximum
140+
value of 655.35"""
159141
raw_offset = self._read_register(_CMD_SET_TEMPERATURE_OFFSET)
160142
return raw_offset / 100.0
161143

162144
@temperature_offset.setter
163145
def temperature_offset(self, offset):
164-
# TODO: check value before set
146+
if offset > 655.35:
147+
raise AttributeError(
148+
"Offset value must be less than or equal to 655.35 degrees C"
149+
)
165150

166151
self._send_command(_CMD_SET_TEMPERATURE_OFFSET, int(offset * 100))
167152

@@ -178,20 +163,59 @@ def forced_recalibration_reference(self):
178163
def forced_recalibration_reference(self, reference_value):
179164
self._send_command(_CMD_SET_FORCED_RECALIBRATION_FACTOR, reference_value)
180165

166+
@property
167+
def co2(self):
168+
"""Returns the CO2 concentration in PPM (parts per million)
169+
170+
Between measurements, the most recent reading will be cached and returned."""
171+
if self.data_available:
172+
self._read_data()
173+
return self._co2
174+
175+
@property
176+
def temperature(self):
177+
"""Returns the current temperature in degrees celcius
178+
179+
Between measurements, the most recent reading will be cached and returned."""
180+
if self.data_available:
181+
self._read_data()
182+
return self._temperature
183+
184+
@property
185+
def relative_humidity(self):
186+
"""Returns the current relative humidity in %rH.
187+
188+
Between measurements, the most recent reading will be cached and returned. """
189+
if self.data_available:
190+
self._read_data()
191+
return self._relative_humitidy
192+
193+
def _send_command(self, command, arguments=None):
194+
# if there is an argument, calculate the CRC and include it as well.
195+
if arguments is not None:
196+
self._crc_buffer[0] = arguments >> 8
197+
self._crc_buffer[1] = arguments & 0xFF
198+
self._buffer[2] = arguments >> 8
199+
self._buffer[3] = arguments & 0xFF
200+
crc = self._crc8(self._crc_buffer)
201+
self._buffer[4] = crc
202+
end_byte = 5
203+
else:
204+
end_byte = 2
205+
206+
self._buffer[0] = command >> 8
207+
self._buffer[1] = command & 0xFF
208+
209+
with self.i2c_device as i2c:
210+
i2c.write(self._buffer, end=end_byte)
211+
181212
def _read_register(self, reg_addr):
182213
self._buffer[0] = reg_addr >> 8
183214
self._buffer[1] = reg_addr & 0xFF
184215
with self.i2c_device as i2c:
185216
i2c.write_then_readinto(self._buffer, self._buffer, out_end=2, in_end=2)
186217
return unpack_from(">H", self._buffer)[0]
187218

188-
@property
189-
def co2(self):
190-
"""Returns the CO2 concentration in PPM (parts per million)"""
191-
if self._data_available:
192-
self._read_data()
193-
return self._co2
194-
195219
def _read_data(self):
196220
self._send_command(_CMD_READ_MEASUREMENT)
197221
with self.i2c_device as i2c:

examples/scd30_simpletest.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# SPDX-FileCopyrightText: 2020 by Bryan Siepert, written for Adafruit Industries
22
#
33
# SPDX-License-Identifier: Unlicense
4-
# pylint:disable=protected-access
54
import time
65
import board
76
import busio
@@ -11,12 +10,13 @@
1110
scd = adafruit_scd30.SCD30(i2c)
1211

1312
while True:
14-
data = scd._data_available
15-
if data:
13+
# since the measurement interval is long (2+ seconds) we check for new data before reading
14+
# the values, to ensure current readings.
15+
if scd.data_available:
1616
print("Data Available!")
1717
print("CO2:", scd.co2, "PPM")
18-
print("Temperature:", scd._temperature, "degrees C")
19-
print("Humidity::", scd._relative_humitidy, "%%rH")
18+
print("Temperature:", scd.temperature, "degrees C")
19+
print("Humidity:", scd.relative_humidity, "%%rH")
2020
print("")
2121
print("Waiting for new data...")
2222
print("")

examples/scd30_tuning_knobs.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
# SPDX-FileCopyrightText: 2020 by Bryan Siepert, written for Adafruit Industries
22
#
33
# SPDX-License-Identifier: Unlicense
4-
# pylint:disable=protected-access
54
import time
65
import board
76
import busio
87
import adafruit_scd30
98

109
i2c = busio.I2C(board.SCL, board.SDA)
1110
scd = adafruit_scd30.SCD30(i2c)
12-
# scd.temperature_offset = 5.5
11+
# scd.temperature_offset = 10
1312
print("Temperature offset:", scd.temperature_offset)
1413

1514
# scd.measurement_interval = 4
@@ -21,19 +20,20 @@
2120
# scd.ambient_pressure = 1100
2221
print("Ambient Pressure:", scd.ambient_pressure)
2322

24-
# scd.altitude = 1600
23+
# scd.altitude = 100
2524
print("Altitude:", scd.altitude, "meters above sea level")
2625

2726
# scd.forced_recalibration_reference = 409
2827
print("Forced recalibration reference:", scd.forced_recalibration_reference)
2928
print("")
29+
3030
while True:
31-
data = scd._data_available
31+
data = scd.data_available
3232
if data:
3333
print("Data Available!")
3434
print("CO2:", scd.co2, "PPM")
35-
print("Temperature:", scd._temperature, "degrees C")
36-
print("Humidity::", scd._relative_humitidy, "%%rH")
35+
print("Temperature:", scd.temperature, "degrees C")
36+
print("Humidity::", scd.relative_humidity, "%%rH")
3737
print("")
3838
print("Waiting for new data...")
3939
print("")

0 commit comments

Comments
 (0)