Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # HEAT_SOAK _HEATER="heater_bed" TARGET_TEMP=[bed_temperature_initial_layer_single] DURATION=5
- # HEAT_SOAK _HEATER="heater_bed" TARGET_TEMP=30 DURATION=5
- # HEAT_SOAK _HEATER="extruder" TARGET_TEMP=[nozzle_temperature_initial_layer] DURATION=0
- # ToDo
- # disable a print starting if heat soak running, also disable heat soak if print running
- [gcode_macro HEAT_SOAK]
- description: heats and soaks
- variable_heaty: None
- variable_target_temp: 0
- variable_current_temp: 0
- variable_stage: None ## heating -> soaking -> done -> None
- ## in seconds
- variable_check_interval: 10
- variable_soak_time_remaining: 0
- variable_total_time_elapsed: 0
- # {% set pa = (printer.save_variables.variables.is_printing) %}
- gcode:
- {% set isP = (printer.save_variables.variables.is_printing) %}
- {% if isP %}
- M117 possible print ongoing {params._HEATER}
- {% else %}
- SAVE_VARIABLE VARIABLE=is_printing VALUE=True
- {% if params._HEATER == "extruder" %}
- {% set _HEATER = "extruder" %}
- {% set TARGET_TEMP = params.TARGET_TEMP | default(printer.save_variables.variables.my_nozzle_temp) | float %}
- {% set DURATION = params.DURATION | default(0) %} ## no soak for nozzle
- {% set CURRENT_TEMP = printer.extruder.temperature %}
- {% else %}
- {% set _HEATER = ("heater_bed" | string) %}
- {% set TARGET_TEMP = params.TARGET_TEMP | default(printer.save_variables.variables.my_bed_temp) | float %}
- {% set DURATION = (params.DURATION | default(printer.save_variables.variables.my_bed_soak) | int) * 60 %} ## minutes to seconds
- {% set CURRENT_TEMP = printer.heater_bed.temperature %}
- {% endif %}
- {% if CURRENT_TEMP < TARGET_TEMP - (TARGET_TEMP * 0.50) %}
- {% set DURATION = DURATION|int %}
- {% elif CURRENT_TEMP < (TARGET_TEMP * 0.75) %}
- {% set DURATION = DURATION / 2|int %}
- {% else %}
- {% set DURATION = DURATION * 0.75|int %}
- {% endif %}
- SET_GCODE_VARIABLE MACRO=HEAT_SOAK VARIABLE=heaty VALUE="'{ _HEATER }'"
- SET_GCODE_VARIABLE MACRO=HEAT_SOAK VARIABLE=target_temp VALUE={ TARGET_TEMP }
- SET_GCODE_VARIABLE MACRO=HEAT_SOAK VARIABLE=stage VALUE="'heating'"
- SET_GCODE_VARIABLE MACRO=HEAT_SOAK VARIABLE=soak_time_remaining VALUE={ DURATION }
- SET_GCODE_VARIABLE MACRO=HEAT_SOAK VARIABLE=total_time_elapsed VALUE=0
- ;; fire up the heater
- SET_HEATER_TEMPERATURE HEATER={ _HEATER } TARGET={ TARGET_TEMP }
- M117 Heating {_HEATER} {TARGET_TEMP} then {DURATION/60}m soak time, currrent temp {CURRENT_TEMP}
- ;; run the fan at 50% to circulate air
- M106 S{ 50 * 255 / 100 }
- ;; put the bed and nozzle where they're a safe distance apart
- {% if params._HEATER == "heater_bed" %}
- G32
- ADAPTIVE_BED_MESH
- CENTER
- SET_IDLE_TIMEOUT TIMEOUT=3600
- {% if not printer.save_variables.variables.is_voron_new %}
- M84 ;; turn off steppers
- {% endif %}
- {% else %}
- G32
- G1 X160 Y0 Z0
- {% endif %}
- UPDATE_DELAYED_GCODE ID=heat_soaker DURATION={ check_interval }
- ;; pause the print during heat soak
- BASE_PAUSE
- {% endif %}
- [gcode_macro CANCEL_HEAT_SOAK]
- description: cancels an in-progress HEAT_SOAK cycle
- gcode:
- SET_GCODE_VARIABLE MACRO=HEAT_SOAK VARIABLE=stage VALUE="'cancel'"
- UPDATE_DELAYED_GCODE ID=heat_soaker DURATION=1
- [delayed_gcode heat_soaker]
- ; ## debug
- ; { action_respond_info( printer['gcode_macro HEAT_SOAK'] | tojson )}
- gcode:
- {% set heat_soak = printer['gcode_macro HEAT_SOAK'] %}
- ## update total time elapsed
- {% set total_time_elapsed = heat_soak.total_time_elapsed + heat_soak.check_interval %}
- SET_GCODE_VARIABLE MACRO=HEAT_SOAK VARIABLE=total_time_elapsed VALUE={ total_time_elapsed }
- {% set stage = heat_soak.stage %}
- {% if heat_soak.heaty == "heater_bed" %}
- {% if stage == "heating" and printer.heater_bed.temperature >= (heat_soak.target_temp - 1) %}
- {% set stage = "soaking" %}
- {% endif %}
- {% else %}
- {% if stage == "heating" and printer.extruder.temperature >= (heat_soak.target_temp - 1) %}
- {% set stage = "soaking" %}
- {% endif %}
- {% endif %}
- {% if stage == "soaking" %}
- ## update soak countdown
- {% set soak_time_remaining = [heat_soak.soak_time_remaining - heat_soak.check_interval, 0] | max %}
- SET_GCODE_VARIABLE MACRO=HEAT_SOAK VARIABLE=soak_time_remaining VALUE={ soak_time_remaining }
- {% if soak_time_remaining == 0 %}
- {% set stage = "done" %}
- {% endif %}
- {% endif %}
- SET_GCODE_VARIABLE MACRO=HEAT_SOAK VARIABLE=stage VALUE="'{ stage }'"
- {% if stage in ("done", "cancel") %}
- {% if stage == "cancel" %}
- {% set stage = "done" %}
- TURN_OFF_HEATERS
- M107 ; turn off fan
- ;; heat soak was cancelled -- also cancel the print
- CANCEL_PRINT
- {% else %}
- M117 { "soak complete after %.1fm" | format(total_time_elapsed / 60.0) }
- ;; heat soak is complete. resume / start the print
- BASE_RESUME
- {% endif %}
- ## reset all state vars, except stage, which may be queried via the api
- SET_GCODE_VARIABLE MACRO=HEAT_SOAK VARIABLE=heaty VALUE=None
- SET_GCODE_VARIABLE MACRO=HEAT_SOAK VARIABLE=target_temp VALUE=0
- SET_GCODE_VARIABLE MACRO=HEAT_SOAK VARIABLE=soak_time_remaining VALUE=0
- SET_GCODE_VARIABLE MACRO=HEAT_SOAK VARIABLE=total_time_elapsed VALUE=0
- SET_IDLE_TIMEOUT TIMEOUT={ printer.configfile.config.idle_timeout.timeout }
- SAVE_VARIABLE VARIABLE=is_printing VALUE=False
- {% else %}
- {% if total_time_elapsed % 30 == 0 %}
- ## output status periodically
- {% if stage == "heating" %}
- M117 { "heating -- %.1fm elapsed" | format(total_time_elapsed / 60.0) }
- {% elif stage == "soaking" %}
- M117 { "soaking -- %.1fm remaining" | format(soak_time_remaining / 60.0) }
- {% endif %}
- {% endif %}
- ## trigger ourselves again
- UPDATE_DELAYED_GCODE ID=heat_soaker DURATION={ heat_soak.check_interval }
- ## dwell for 1ms to prevent from going idle
- G4 P1
- {% endif %}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement