2017-06-22 07:28:07 +01:00
|
|
|
# DS18x20 temperature sensor driver for MicroPython.
|
|
|
|
# MIT license; Copyright (c) 2016 Damien P. George
|
|
|
|
|
|
|
|
from micropython import const
|
|
|
|
|
|
|
|
_CONVERT = const(0x44)
|
2020-02-27 04:36:53 +00:00
|
|
|
_RD_SCRATCH = const(0xBE)
|
|
|
|
_WR_SCRATCH = const(0x4E)
|
|
|
|
|
2017-06-22 07:28:07 +01:00
|
|
|
|
|
|
|
class DS18X20:
|
|
|
|
def __init__(self, onewire):
|
|
|
|
self.ow = onewire
|
|
|
|
self.buf = bytearray(9)
|
|
|
|
|
|
|
|
def scan(self):
|
2019-10-16 04:27:01 +01:00
|
|
|
return [rom for rom in self.ow.scan() if rom[0] in (0x10, 0x22, 0x28)]
|
2017-06-22 07:28:07 +01:00
|
|
|
|
|
|
|
def convert_temp(self):
|
|
|
|
self.ow.reset(True)
|
|
|
|
self.ow.writebyte(self.ow.SKIP_ROM)
|
|
|
|
self.ow.writebyte(_CONVERT)
|
|
|
|
|
|
|
|
def read_scratch(self, rom):
|
|
|
|
self.ow.reset(True)
|
|
|
|
self.ow.select_rom(rom)
|
|
|
|
self.ow.writebyte(_RD_SCRATCH)
|
|
|
|
self.ow.readinto(self.buf)
|
|
|
|
if self.ow.crc8(self.buf):
|
2020-02-27 04:36:53 +00:00
|
|
|
raise Exception("CRC error")
|
2017-06-22 07:28:07 +01:00
|
|
|
return self.buf
|
|
|
|
|
|
|
|
def write_scratch(self, rom, buf):
|
|
|
|
self.ow.reset(True)
|
|
|
|
self.ow.select_rom(rom)
|
|
|
|
self.ow.writebyte(_WR_SCRATCH)
|
|
|
|
self.ow.write(buf)
|
|
|
|
|
|
|
|
def read_temp(self, rom):
|
|
|
|
buf = self.read_scratch(rom)
|
|
|
|
if rom[0] == 0x10:
|
|
|
|
if buf[1]:
|
|
|
|
t = buf[0] >> 1 | 0x80
|
2020-02-27 04:36:53 +00:00
|
|
|
t = -((~t + 1) & 0xFF)
|
2015-03-03 01:29:52 +00:00
|
|
|
else:
|
2017-06-22 07:28:07 +01:00
|
|
|
t = buf[0] >> 1
|
|
|
|
return t - 0.25 + (buf[7] - buf[6]) / buf[7]
|
2015-03-03 01:29:52 +00:00
|
|
|
else:
|
2017-06-22 07:28:07 +01:00
|
|
|
t = buf[1] << 8 | buf[0]
|
2020-02-27 04:36:53 +00:00
|
|
|
if t & 0x8000: # sign bit set
|
|
|
|
t = -((t ^ 0xFFFF) + 1)
|
2017-06-22 07:28:07 +01:00
|
|
|
return t / 16
|