aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/extras/ds18b20.py
diff options
context:
space:
mode:
authorAlan Lord <alanslists@gmail.com>2021-02-02 19:34:56 +0000
committerGitHub <noreply@github.com>2021-02-02 14:34:56 -0500
commit7d4df659203269452c722c6e029fbc71e2488db7 (patch)
treed302a7cb6aeea9b799c978d8916e283dbfc7ab40 /klippy/extras/ds18b20.py
parent19397a0a2b5997d74b8aada1596310a3f383c626 (diff)
downloadkutter-7d4df659203269452c722c6e029fbc71e2488db7.tar.gz
kutter-7d4df659203269452c722c6e029fbc71e2488db7.tar.xz
kutter-7d4df659203269452c722c6e029fbc71e2488db7.zip
ds18b20: new module for 1-wire temperature sensor (#3462)
Initial commit of code to support 1-wire (Dallas) sensors such as the DS18B20. Requires Linux kernel drivers to create a file in /sysfs which is read by this module, and temperature typically returned to a temperature_fan. Signed-off-by: Alan Lord <alanslists@gmail.com> Signed-off-by: Josh Headapohl <joshhead@gmail.com>
Diffstat (limited to 'klippy/extras/ds18b20.py')
-rw-r--r--klippy/extras/ds18b20.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/klippy/extras/ds18b20.py b/klippy/extras/ds18b20.py
new file mode 100644
index 00000000..49d658a1
--- /dev/null
+++ b/klippy/extras/ds18b20.py
@@ -0,0 +1,77 @@
+# Support for 1-wire based temperature sensors
+#
+# Copyright (C) 2020 Alan Lord <alanslists@gmail.com>
+#
+# This file may be distributed under the terms of the GNU GPLv3 license.
+import logging
+import mcu
+
+DS18_REPORT_TIME = 3.0
+# Temperature can be sampled at any time but conversion time is ~750ms, so
+# setting the time too low will not make the reports come faster.
+DS18_MIN_REPORT_TIME = 1.0
+
+class DS18B20:
+ def __init__(self, config):
+ self.printer = config.get_printer()
+ self.name = config.get_name().split()[-1]
+ self.sensor_id = config.get("serial_no")
+ self.temp = self.min_temp = self.max_temp = 0.0
+ self._report_clock = 0
+ self.report_time = config.getfloat(
+ 'ds18_report_time',
+ DS18_REPORT_TIME,
+ minval=DS18_MIN_REPORT_TIME
+ )
+ self._mcu = mcu.get_printer_mcu(self.printer, config.get('sensor_mcu'))
+ self.oid = self._mcu.create_oid()
+ self._mcu.register_response(self._handle_ds18b20_response,
+ "ds18b20_result", self.oid)
+ self._mcu.register_config_callback(self._build_config)
+
+ def _build_config(self):
+ self._mcu.add_config_cmd("config_ds18b20 oid=%d serial=%s" % (self.oid,
+ self.sensor_id.encode("hex")))
+
+ clock = self._mcu.get_query_slot(self.oid)
+ self._report_clock = self._mcu.seconds_to_clock(self.report_time)
+ self._mcu.add_config_cmd("query_ds18b20 oid=%d clock=%u rest_ticks=%u"
+ " min_value=%d max_value=%d" % (
+ self.oid, clock, self._report_clock,
+ self.min_temp * 1000, self.max_temp * 1000), is_init=True)
+
+ def _handle_ds18b20_response(self, params):
+ temp = params['value'] / 1000.0
+
+ if temp < self.min_temp or temp > self.max_temp:
+ self.printer.invoke_shutdown(
+ "DS18B20 temperature %0.1f outside range of %0.1f:%.01f"
+ % (temp, self.min_temp, self.max_temp))
+
+ next_clock = self._mcu.clock32_to_clock64(params['next_clock'])
+ last_read_clock = next_clock - self._report_clock
+ last_read_time = self._mcu.clock_to_print_time(last_read_clock)
+ self._callback(last_read_time, temp)
+
+ def setup_minmax(self, min_temp, max_temp):
+ self.min_temp = min_temp
+ self.max_temp = max_temp
+
+ def fault(self, msg):
+ self.printer.invoke_async_shutdown(msg)
+
+ def get_report_time_delta(self):
+ return self.report_time
+
+ def setup_callback(self, cb):
+ self._callback = cb
+
+ def get_status(self, eventtime):
+ return {
+ 'temperature': self.temp,
+ }
+
+def load_config(config):
+ # Register sensor
+ pheaters = config.get_printer().load_object(config, "heaters")
+ pheaters.add_sensor_factory("DS18B20", DS18B20)