diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2017-07-04 12:24:11 -0400 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2017-07-17 11:35:52 -0400 |
commit | 969485c754731183f357e6fef23c6180f59d4cb6 (patch) | |
tree | f152a57906579fca334035e77d733f990912a32b /klippy | |
parent | 519e81d0faf7be36ec94c865a1e0c97d78b6774c (diff) | |
download | kutter-969485c754731183f357e6fef23c6180f59d4cb6.tar.gz kutter-969485c754731183f357e6fef23c6180f59d4cb6.tar.xz kutter-969485c754731183f357e6fef23c6180f59d4cb6.zip |
fan: Add support for heater_fan objects
Add support for fans designed to cool the components of an extruder or
heater.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy')
-rw-r--r-- | klippy/extruder.py | 10 | ||||
-rw-r--r-- | klippy/fan.py | 35 | ||||
-rw-r--r-- | klippy/klippy.py | 3 |
3 files changed, 44 insertions, 4 deletions
diff --git a/klippy/extruder.py b/klippy/extruder.py index ce8f3366..012f6290 100644 --- a/klippy/extruder.py +++ b/klippy/extruder.py @@ -243,3 +243,13 @@ def get_printer_extruders(printer): break out.append(extruder) return out + +def get_printer_heater(printer, name): + if name == 'heater_bed': + return printer.objects.get(name) + if name == 'extruder': + name = 'extruder0' + extruder = printer.objects.get(name) + if extruder is None: + return None + return extruder.get_heater() diff --git a/klippy/fan.py b/klippy/fan.py index 54cace6c..6a5766ef 100644 --- a/klippy/fan.py +++ b/klippy/fan.py @@ -1,9 +1,11 @@ # Printer fan support # -# Copyright (C) 2016 Kevin O'Connor <kevin@koconnor.net> +# Copyright (C) 2016,2017 Kevin O'Connor <kevin@koconnor.net> # # This file may be distributed under the terms of the GNU GPLv3 license. +import extruder + FAN_MIN_TIME = 0.1 PWM_CYCLE_TIME = 0.010 @@ -16,12 +18,10 @@ class PrinterFan: pin = config.get('pin') hard_pwm = config.getint('hard_pwm', 0) self.mcu_fan = printer.mcu.create_pwm(pin, PWM_CYCLE_TIME, hard_pwm, 0.) - # External commands - def set_speed(self, print_time, value): + def set_pwm(self, mcu_time, value): value = max(0., min(self.max_power, value)) if value == self.last_fan_value: return - mcu_time = self.mcu_fan.print_to_mcu_time(print_time) mcu_time = max(self.last_fan_time + FAN_MIN_TIME, mcu_time) if (value and value < self.max_power and not self.last_fan_value and self.kick_start_time): @@ -31,7 +31,34 @@ class PrinterFan: self.mcu_fan.set_pwm(mcu_time, value) self.last_fan_time = mcu_time self.last_fan_value = value + # External commands + def set_speed(self, print_time, value): + mcu_time = self.mcu_fan.print_to_mcu_time(print_time) + self.set_pwm(mcu_time, value) + +class PrinterHeaterFan: + def __init__(self, printer, config): + self.fan = PrinterFan(printer, config) + heater = config.get("heater", "extruder0") + self.heater = extruder.get_printer_heater(printer, heater) + if self.heater is None: + raise config.error("Unknown heater '%s'" % (heater,)) + self.heater_temp = config.getfloat("heater_temp", 50.0) + printer.reactor.register_timer(self.callback, printer.reactor.NOW) + def callback(self, eventtime): + current_temp, target_temp = self.heater.get_temp() + if not current_temp and not target_temp and not self.fan.last_fan_time: + # Printer still starting + return eventtime + 1. + power = 0. + if target_temp or current_temp > self.heater_temp: + power = 1. + mcu_time = self.fan.mcu_fan.system_to_mcu_time(eventtime + FAN_MIN_TIME) + self.fan.set_pwm(mcu_time, power) + return eventtime + 1. def add_printer_objects(printer, config): if config.has_section('fan'): printer.add_object('fan', PrinterFan(printer, config.getsection('fan'))) + for s in config.get_prefix_sections('heater_fan '): + printer.add_object(s.section, PrinterHeaterFan(printer, s)) diff --git a/klippy/klippy.py b/klippy/klippy.py index 16c864e0..7e9bf6d8 100644 --- a/klippy/klippy.py +++ b/klippy/klippy.py @@ -107,6 +107,9 @@ class ConfigWrapper: return ConfigWrapper(self.printer, section) def has_section(self, section): return self.printer.fileconfig.has_section(section) + def get_prefix_sections(self, prefix): + return [self.getsection(s) for s in self.printer.fileconfig.sections() + if s.startswith(prefix)] class ConfigLogger(): def __init__(self, cfg, bglogger): |