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