@@ -160,6 +160,11 @@ class DS18X20(object):
160
160
def __init__ (self , onewire ):
161
161
self .ow = onewire
162
162
self .roms = [rom for rom in self .ow .scan () if rom [0 ] == 0x10 or rom [0 ] == 0x28 ]
163
+ self .fp = True
164
+ try :
165
+ 1 / 1
166
+ except TypeError :
167
+ self .fp = False # floatingpoint not supported
163
168
164
169
def isbusy (self ):
165
170
"""
@@ -174,11 +179,14 @@ def start_convertion(self, rom=None):
174
179
Pass the 8-byte bytes object with the ROM of the specific device you want to read.
175
180
If only one DS18x20 device is attached to the bus you may omit the rom parameter.
176
181
"""
177
- rom = rom or self .roms [0 ]
178
- ow = self .ow
179
- ow .reset ()
180
- ow .select_rom (rom )
181
- ow .write_byte (0x44 ) # Convert Temp
182
+ if (rom == None ) and (len (self .roms )> 0 ):
183
+ rom = self .roms [0 ]
184
+ if rom != None :
185
+ rom = rom or self .roms [0 ]
186
+ ow = self .ow
187
+ ow .reset ()
188
+ ow .select_rom (rom )
189
+ ow .write_byte (0x44 ) # Convert Temp
182
190
183
191
def read_temp_async (self , rom = None ):
184
192
"""
@@ -187,13 +195,17 @@ def read_temp_async(self, rom=None):
187
195
"""
188
196
if self .isbusy ():
189
197
return None
190
- rom = rom or self .roms [0 ]
191
- ow = self .ow
192
- ow .reset ()
193
- ow .select_rom (rom )
194
- ow .write_byte (0xbe ) # Read scratch
195
- data = ow .read_bytes (9 )
196
- return self .convert_temp (rom [0 ], data )
198
+ if (rom == None ) and (len (self .roms )> 0 ):
199
+ rom = self .roms [0 ]
200
+ if rom == None :
201
+ return None
202
+ else :
203
+ ow = self .ow
204
+ ow .reset ()
205
+ ow .select_rom (rom )
206
+ ow .write_byte (0xbe ) # Read scratch
207
+ data = ow .read_bytes (9 )
208
+ return self .convert_temp (rom [0 ], data )
197
209
198
210
def convert_temp (self , rom0 , data ):
199
211
"""
@@ -210,9 +222,18 @@ def convert_temp(self, rom0, data):
210
222
temp_read = temp_lsb >> 1 # truncate bit 0 by shifting
211
223
count_remain = data [6 ]
212
224
count_per_c = data [7 ]
213
- temp = 100 * temp_read - 25 + (count_per_c - count_remain ) // count_per_c
214
- return temp
225
+ if self .fp :
226
+ return temp_read - 25 + (count_per_c - count_remain ) / count_per_c
227
+ else :
228
+ return 100 * temp_read - 25 + (count_per_c - count_remain ) // count_per_c
215
229
elif rom0 == 0x28 :
216
- return (temp_msb << 8 | temp_lsb ) * 100 // 16
230
+ temp = None
231
+ if self .fp :
232
+ temp = (temp_msb << 8 | temp_lsb ) / 16
233
+ else :
234
+ temp = (temp_msb << 8 | temp_lsb ) * 100 // 16
235
+ if (temp_msb & 0xf8 ) == 0xf8 : # for negative temperature
236
+ temp -= 0x1000
237
+ return temp
217
238
else :
218
239
assert False
0 commit comments