63
63
_SHTC3_SLEEP = 0xB098 # Enter sleep mode
64
64
_SHTC3_WAKEUP = 0x3517 # Wakeup mode
65
65
_SHTC3_CHIP_ID = 0x807
66
+ def pb (buffer ):
67
+ print ("buf:" , [hex (i ) for i in buffer ])
66
68
67
69
class SHTC3 :
68
70
def __init__ (self , i2c_bus , address = _SHTC3_DEFAULT_ADDR ):
@@ -80,20 +82,25 @@ def _write_command(self, command):
80
82
self ._buffer [1 ] = command & 0xFF
81
83
82
84
with self .i2c_device as i2c :
83
- i2c .write (self ._buffer , start = 0 , end = 0 )
85
+ i2c .write (self ._buffer , start = 0 , end = 2 )
84
86
85
87
@property
86
88
def _chip_id (self ): # readCommand(SHTC3_READID, data, 3);
87
89
self ._buffer [0 ] = _SHTC3_READID >> 8
88
90
self ._buffer [1 ] = _SHTC3_READID & 0xFF
89
91
90
92
with self .i2c_device as i2c :
91
- i2c .write_then_readinto (self ._buffer , self ._buffer , out_start = 0 , out_end = 2 , in_start = 0 )
93
+ i2c .write_then_readinto (self ._buffer , self ._buffer , out_start = 0 , out_end = 2 , in_start = 0 , in_end = 2 )
92
94
93
95
return unpack_from (">H" , self ._buffer )[0 ]
94
96
95
97
def reset (self ):
96
- self ._write_command (_SHTC3_SOFTRESET )
98
+ try :
99
+ self ._write_command (_SHTC3_SOFTRESET )
100
+
101
+ except RuntimeError as run_err :
102
+ if run_err .args and run_err .args [0 ] != "I2C slave address was NACK'd" :
103
+ raise run_err
97
104
delay_seconds (0.001 )
98
105
99
106
@property
@@ -108,69 +115,56 @@ def sleep(self, sleep_enabled):
108
115
else :
109
116
self ._write_command (_SHTC3_WAKEUP )
110
117
delay_seconds (0.001 )
118
+ self ._cached_sleep = sleep_enabled
111
119
112
120
# lowPowerMode(bool readmode) { _lpMode = readmode
113
121
114
122
@property
115
- def humidity (self ):
123
+ def relative_humidity (self ):
116
124
"""Current relative humidity in % rH"""
117
- # sensors_event_t *humidity,
118
- # sensors_event_t *temp) {
119
- t = monotonic ()
120
- print ("reading hum/temp" )
121
- readbuffer = bytearray (6 )
125
+ self .measurements [1 ]
126
+ return self ._humidity
127
+
128
+ @property
129
+ def temperature (self ):
130
+ """Current temperature in degrees celcius"""
131
+ self .measurements [0 ]
132
+
133
+ @property
134
+ def measurements (self ):
135
+ """both `temperature` and `relative_humidity`, read simultaneously"""
122
136
123
137
self .sleep = False
124
- read_bytes = []
138
+ raw_readings = []
125
139
126
- # self._write_command(_SHTC3_LOWPOW_MEAS_TFIRST)
127
- if False : #lowPower
140
+ if False : # check for lowPower
128
141
self ._write_command (_SHTC3_LOWPOW_MEAS_TFIRST )
129
142
delay_seconds (0.001 )
130
143
else :
131
144
self ._write_command (_SHTC3_NORMAL_MEAS_TFIRST )
132
145
delay_seconds (0.013 )
133
146
134
- # while (!i2c_dev->read(readbuffer, sizeof(readbuffer))) {
135
- # delay(1)
136
- while True :
137
- with self .i2c_device as i2c :
138
- print ("reading" )
139
- i2c .readinto (self ._buffer )
140
- print ("buf:" , [hex (i ) for i in self ._buffer ])
141
- read_bytes = unpack_from (">hbh" , self ._buffer )
142
- print ("unpacked:" , read_bytes )
143
- if read_bytes [0 ] != 0 and read_bytes [1 ] != 0 and read_bytes [2 ] != 0 :
144
- print ("not all zeros, breaking" )
145
- break
146
- print ("all zeros, continuing" )
147
+ self ._buffer = bytearray (6 )
148
+ with self .i2c_device as i2c :
149
+ i2c .readinto (self ._buffer )
150
+ raw_readings = unpack_from (">hbh" , self ._buffer )
151
+
147
152
153
+ # check CRC of bytes
148
154
# if (self._buffer[2] != crc8(self._buffer, 2) or
149
155
# self._buffer[5] != crc8(self._buffer + 3, 2)):
150
156
# print("NOT CHECKING")
151
157
152
- stemp = read_bytes [0 ]
153
- stemp = ((4375 * stemp ) >> 14 ) - 4500
154
- temperature = stemp / 100.0
155
- print ("temp:" , temperature , "stemp:" , stemp )
158
+ raw_temp = raw_readings [0 ]
159
+ raw_temp = ((4375 * raw_temp ) >> 14 ) - 4500
160
+ temperature = raw_temp / 100.0
156
161
157
- shum = read_bytes [2 ]
158
- shum = (625 * shum ) >> 12
159
- humidity = shum / 100.0
162
+ raw_humidity = raw_readings [2 ]
163
+ raw_humidity = (625 * raw_humidity ) >> 12
164
+ humidity = raw_humidity / 100.0
160
165
161
166
self .sleep = True
162
-
163
- print ("shum:" , shum , "humidity:" , humidity )
164
167
return (temperature , humidity )
165
- # delay_seconds(true)
166
-
167
- # // use helpers to fill in the events
168
- # if (temp)
169
- # fillTempEvent(temp, t)
170
- # if (humidity)
171
- # fillHumidityEvent(humidity, t)
172
- # return true
173
- #
174
168
175
169
176
170
@@ -203,7 +197,7 @@ def humidity(self):
203
197
204
198
# for (int i = 8 i --i) {
205
199
# crc = (crc & 0x80) ? (crc << 1) ^ POLYNOMIAL : (crc << 1)
206
- #
207
- #
200
+ #
201
+ #
208
202
# return crc
209
203
#
0 commit comments