summaryrefslogtreecommitdiffstatshomepage
path: root/esp8266/modules/ds18x20.py
diff options
context:
space:
mode:
Diffstat (limited to 'esp8266/modules/ds18x20.py')
-rw-r--r--esp8266/modules/ds18x20.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/esp8266/modules/ds18x20.py b/esp8266/modules/ds18x20.py
new file mode 100644
index 0000000000..eb22e2ae30
--- /dev/null
+++ b/esp8266/modules/ds18x20.py
@@ -0,0 +1,46 @@
+# DS18x20 temperature sensor driver for MicroPython.
+# MIT license; Copyright (c) 2016 Damien P. George
+
+_CONVERT = const(0x44)
+_RD_SCRATCH = const(0xbe)
+_WR_SCRATCH = const(0x4e)
+
+class DS18X20:
+ def __init__(self, onewire):
+ self.ow = onewire
+ self.buf = bytearray(9)
+
+ def scan(self):
+ return [rom for rom in self.ow.scan() if rom[0] == 0x10 or rom[0] == 0x28]
+
+ 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):
+ raise Exception('CRC error')
+ 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
+ t = -((~t + 1) & 0xff)
+ else:
+ t = buf[0] >> 1
+ return t - 0.25 + (buf[7] - buf[6]) / buf[7]
+ else:
+ return (buf[1] << 8 | buf[0]) / 16