############### Config options ################## [gcode_macro bedfanvars] variable_threshold: 100 # If bed temp target is above this threshold, fans will be enabled. If temp is set to below this threshold, fans will be disabled. variable_innerfast: 0.5 # Fan speed once bed temp is reached variable_outerfast: 0.6 variable_innerslow: 0.2 # Fan speed while bed is heating variable_outerslow: 0.2 gcode: ########## Bed Fans ######### [fan_generic BedInner] pin: # Change me #cycle_time: 0.05 kick_start_time: 0.5 [fan_generic BedOuter] pin: # Change me #cycle_time: 0.05 kick_start_time: 0.5 ########## Aliases ######### [gcode_macro BedFansSlow] gcode: # Vars {% set INNERSLOW = printer["gcode_macro bedfanvars"].innerslow|float %} {% set OUTERSLOW = printer["gcode_macro bedfanvars"].outerslow|float %} SET_FAN_SPEED FAN=BedInner SPEED={INNERSLOW} SET_FAN_SPEED FAN=BedOuter SPEED={OUTERSLOW} [gcode_macro BedFansFast] gcode: # Vars {% set INNERFAST = printer["gcode_macro bedfanvars"].innerfast|float %} {% set OUTERFAST = printer["gcode_macro bedfanvars"].outerfast|float %} SET_FAN_SPEED FAN=BedInner SPEED={INNERFAST} SET_FAN_SPEED FAN=BedOuter SPEED={OUTERFAST} [gcode_macro BedFansOff] gcode: SET_FAN_SPEED FAN=BedInner SPEED=0 SET_FAN_SPEED FAN=BedOuter SPEED=0 ############ Command overrides ############ # Override, set fan speeds to low and start monitoring loop. [gcode_macro SET_HEATER_TEMPERATURE] rename_existing: _SET_HEATER_TEMPERATURE gcode: # Parameters {% set HEATER = params.HEATER|default("None") %} {% set TARGET = params.TARGET|default(0)|int %} # Vars {% set THRESHOLD = printer["gcode_macro bedfanvars"].threshold|int %} {% if HEATER|lower == "extruder" %} M104 S{TARGET} {% elif HEATER|lower == "heater_bed" %} M99140 S{TARGET} {% else %} {action_respond_info("Heater %s not supported" % HEATER)} {% endif %} # Set fans to low if heater_bed temp is requested above threshold temp, and kick off monitoring loop. {% if HEATER|lower == "heater_bed" %} {% if TARGET >= THRESHOLD %} BedFansSlow UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=1 {% else %} BedFansOff UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=0 # Cancel bed fan loop if it's running {% endif %} {% endif %} # Override M190 (Wait for Bed Temperature) # As a bonus, use TEMPERATURE_WAIT so we don't have to wait for PID to level off. [gcode_macro M190] rename_existing: M99190 gcode: # Parameters {% set S = params.S|int %} # Vars {% set THRESHOLD = printer["gcode_macro bedfanvars"].threshold|int %} {% if S >= THRESHOLD %} BedFansSlow # >= Threshold temp: Low speed fans while heating {% else %} BedFansOff # < Threshold temp: Turn bed fans off {% endif %} M140 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} # Set bed temp {% if S != 0 %} TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={S|int} MAXIMUM={S|int + 5} # Wait for bed temp within 5 degrees {% endif %} # Post-heating fan speeds {% if S >= THRESHOLD %} BedFansFast # >= Threshold temp: Higher speed fans after heating finished {% endif %} # Replace M140 (Set Bed Temperature) to just be an alias of SET_HEATER_TEMPERATURE (which has associated bed fan logic if enabled) [gcode_macro M140] rename_existing: M99140 gcode: # Parameters {% set S = params.S|float %} SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={S} # Replace TURN_OFF_HEATERS [gcode_macro TURN_OFF_HEATERS] rename_existing: _TURN_OFF_HEATERS gcode: BedFansOff _TURN_OFF_HEATERS ################ Monitoring loop ##################### # Turns bed fans to "fast" speed once target bed temp is reached. [delayed_gcode bedfanloop] gcode: # Vars {% set THRESHOLD = printer["gcode_macro bedfanvars"].threshold|int %} {% if printer.heater_bed.target >= THRESHOLD %} # Continue only if target temp greater than threshold. {% if printer.heater_bed.temperature|int >= (printer.heater_bed.target|int - 1) %} BedFansFast # If within 1 degree of target temp: Higher speed fans {% else %} UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=5 # If temp not reached yet: loop again {% endif %} {% endif %}