Untitled
Anonymous
plain_text
02/25/2026 12:20 AM
6.1 KB
12
Indexable
import serial
import time
import sys
import signal
# ------------------------------
# Configuration
# ------------------------------
PORT = 'COM3'
BAUD = 115200
TIMEOUT = 8
#---------------
# THIS IS YOURS HUYEN
# -------------
BASE_TEMP = 25
MAX_TEMP = 60
INCREMENT = 5
HOLD_TIME = 5 * 60
POLL_INTERVAL = 5
SAFE_BASELINE = 0
COOL_MIN = 20 # cooldown stops here
# ------------------------------
# Serial connection
# ------------------------------
ser = serial.Serial(PORT, BAUD, timeout=TIMEOUT)
time.sleep(2)
while ser.in_waiting:
print("Startup echo:", ser.readline().decode().strip())
# ------------------------------
# Fail-safe handler
# ------------------------------
def safe_baseline():
print(f"\nFail-safe activated: returning bed to baseline {SAFE_BASELINE}°C.")
try:
ser.write(f"M140 S{SAFE_BASELINE}\n".encode())
ser.close()
except:
pass
sys.exit(0)
signal.signal(signal.SIGINT, lambda sig, frame: safe_baseline())
signal.signal(signal.SIGTERM, lambda sig, frame: safe_baseline())
# ------------------------------
# Helper functions
# ------------------------------
def send_gcode(cmd):
ser.reset_input_buffer()
ser.write(f"{cmd}\n".encode())
def read_bed_temp():
send_gcode("M105")
start_time = time.time()
while True:
line = ser.readline().decode().strip()
if "B:" in line:
try:
b_index = line.find("B:")
temp_str = line[b_index:].split()[0].split(":")[1]
return float(temp_str)
except:
print(line)
return None
print(line)
if time.time() - start_time > TIMEOUT:
print('TIMEOUT DUMBASS')
return None
def hold_for(label, duration):
"""Hold and display a countdown for `duration` seconds."""
hold_start = time.time()
while time.time() - hold_start < duration:
temp = read_bed_temp()
if temp is None:
print("Error reading temperature during hold! Activating fail-safe.")
safe_baseline()
elapsed = time.time() - hold_start
remaining = duration - elapsed
mins, secs = divmod(int(remaining), 60)
print(f"{label} Bed: {temp:.1f}°C | Time remaining: {mins:02d}:{secs:02d}", end='\r', flush=True)
time.sleep(POLL_INTERVAL)
print()
# ------------------------------
# Temperature ramp UP loop
# ------------------------------
current_target = BASE_TEMP
try:
while current_target <= MAX_TEMP:
print(f"\nSetting bed temperature to {current_target}°C")
send_gcode(f" M140 S{current_target}")
# Wait until target is reached
while True:
temp = read_bed_temp()
if temp is None:
print("Error reading temperature! Activating fail-safe.")
safe_baseline()
print(f"Current bed temp: {temp:.1f}°C")
if temp >= current_target:
print(f"Target {current_target}°C reached. Holding for {HOLD_TIME/60:.0f} min.")
break
time.sleep(POLL_INTERVAL)
hold_for("Holding...", HOLD_TIME)
current_target += INCREMENT
# ------------------------------
# Temperature ramp DOWN loop
# ------------------------------
print("\nRamp-up complete. Beginning cooldown phase.")
current_target = MAX_TEMP - INCREMENT # start at 55
while current_target >= COOL_MIN:
print(f"\nCooling to {current_target}°C — setting bed target.")
send_gcode(f"M140 S{current_target}")
# Wait until bed drops to or below current_target
while True:
temp = read_bed_temp()
if temp is None:
print("Error reading temperature during cooldown! Activating fail-safe.")
safe_baseline()
print(f"Cooling... Current bed temp: {temp:.1f}°C", end='\r', flush=True)
if temp <= current_target:
print()
print(f"Reached {current_target}°C. Holding for {HOLD_TIME/60:.0f} min.")
break
time.sleep(POLL_INTERVAL)
hold_for("Holding...", HOLD_TIME)
current_target -= INCREMENT
# Final hold at COOL_MIN
print(f"\nCooldown complete. Final hold at {COOL_MIN}°C for {HOLD_TIME/60:.0f} min.")
hold_for("Final hold...", HOLD_TIME)
print("\nAll done. Activating safe baseline.")
except Exception as e:
print(f"Exception occurred: {e}")
safe_baseline()
finally:
safe_baseline()Editor is loading...
Leave a Comment