class TemperatureSensor: class _Const: CONVERT = const(0x44) RD_SCRATCH = const(0xbe) def __init__(self, pin): self._onewire = OneWire(pin) self._buffer = bytearray(9) self._rom = [rom for rom in self._onewire.scan() if rom[0] in (0x10, 0x22, 0x28)][0] self._convert_temp() def _convert_temp(self): self._onewire.reset(True) self._onewire.writebyte(self._onewire.SKIP_ROM) self._onewire.writebyte(self._Const.CONVERT) def _read_scratch(self): self._onewire.reset(True) self._onewire.select_rom(self._rom) self._onewire.writebyte(TemperatureSensor._Const.RD_SCRATCH) self._onewire.readinto(self._buffer) if self._onewire.crc8(self._buffer): raise Exception('Temperature sensor::CRC error') return self._buffer def read(self): buffer = self._read_scratch() if self._rom[0] == 0x10: if self._buffer[1]: t = self._buffer[0] >> 1 | 0x80 t = -((~t + 1) & 0xff) else: t = self._buffer[0] >> 1 return t - 0.25 + (self._buffer[7] - self._buffer[6]) / self._buffer[7] else: t = self._buffer[1] << 8 | self._buffer[0] if t & 0x8000: t = -((t ^ 0xffff) + 1) return t / 16
def _request(self, addr): _res(self, addr) ow = OneWire(Pin(self.pin)) ow.reset() ow.select_rom(addr) ow.writebyte(0x44) # command to take reading if self.res == 12: # the resolution determines the amount of time needed time.sleep_ms(1000) if self.res == 11: time.sleep_ms(400) if self.res == 10: time.sleep_ms(200) if self.res == 9: time.sleep_ms(100) ow.reset() # reset required for data ow.select_rom(addr) ow.writebyte(0xBE) # command to send temperature data # all nine bytes must be read LSB = ow.readbyte() # least significant byte MSB = ow.readbyte() # most significant byte ow.readbyte() ow.readbyte() ow.readbyte() # this is the configuration byte for resolution ow.readbyte() ow.readbyte() ow.readbyte() ow.readbyte() ow.reset() # reset at end of data transmission # convert response to binary, format the binary string, and perform math d_LSB = float(0) d_MSB = float(0) count = 0 b = bin(LSB) b2 = bin(MSB) b3 = "" l = 10 - len(b2) for i in range(l): if len(b2) < 10: b3 += "0" b2 = b3 + b2 b4 = "" l = 10 - len(b) for i in range(l): if len(b) < 10: b4 += "0" b5 = b4 + b for i in b5: if count == 2: if i == '1': d_LSB += 2**3 if count == 3: if i == '1': d_LSB += 2**2 if count == 4: if i == '1': d_LSB += 2**1 if count == 5: if i == '1': d_LSB += 2**0 if count == 6: if i == '1': d_LSB += 2**-1 if count == 7: if i == '1': d_LSB += 2**-2 if count == 8: if i == '1': d_LSB += 2**-3 if count == 9: if i == '1': d_LSB += 2**-4 count += 1 count = 0 sign = 1 for i in b2: if count == 6: if i == '1': sign = -1 if count == 7: if i == '1': d_MSB += 2**6 if count == 8: if i == '1': d_MSB += 2**5 if count == 9: if i == '1': d_MSB += 2**4 count += 1 temp = (d_LSB + d_MSB) * sign if self.unit == 'c' or self.unit == 'C': print("TEMP is: " + str(temp) + " degrees C") if self.unit == 'f' or self.unit == 'F': temp = (temp * 9 / 5) + 32 print("TEMP F is: " + str(temp)) return temp
def _res(self, addr): ow = OneWire(Pin(self.pin)) ow.reset() ow.select_rom(addr) ow.writebyte(0x4E) if self.res == 12: ow.writebyte(0x7F) ow.writebyte(0x7F) ow.writebyte(0x7F) print("12 bit mode") if self.res == 11: ow.writebyte(0x5F) ow.writebyte(0x5F) ow.writebyte(0x5F) print("11 bit mode") if self.res == 10: ow.writebyte(0x3F) ow.writebyte(0x3F) ow.writebyte(0x3F) print("10 bit mode") if self.res == 9: ow.writebyte(0x1F) ow.writebyte(0x1F) ow.writebyte(0x1F) print("9 bit mode") ow.reset()