@@ -160,6 +160,11 @@ class DS18X20(object):
160160 def __init__ (self , onewire ):
161161 self .ow = onewire
162162 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
163168
164169 def isbusy (self ):
165170 """
@@ -174,11 +179,14 @@ def start_convertion(self, rom=None):
174179 Pass the 8-byte bytes object with the ROM of the specific device you want to read.
175180 If only one DS18x20 device is attached to the bus you may omit the rom parameter.
176181 """
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
182190
183191 def read_temp_async (self , rom = None ):
184192 """
@@ -187,13 +195,17 @@ def read_temp_async(self, rom=None):
187195 """
188196 if self .isbusy ():
189197 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 )
197209
198210 def convert_temp (self , rom0 , data ):
199211 """
@@ -210,9 +222,18 @@ def convert_temp(self, rom0, data):
210222 temp_read = temp_lsb >> 1 # truncate bit 0 by shifting
211223 count_remain = data [6 ]
212224 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
215229 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
217238 else :
218239 assert False
0 commit comments