A lightweight control system for Klipper that uses an Eddy current probe (e.g. Eddy NG) to verify bed thermal stability and warp convergence before printing.
Instead of relying on fixed heat soak times, this system:
- Measures real bed deformation
- Tracks multi-point drift over time
- Detects true thermal equilibrium
- Exits early when stabilization is reached
- ✅ 5-point bed sampling (center + corners)
- ✅ Drift-based stability detection
- ✅ Smart early-exit (trend-aware)
- ✅ Non-blocking control loop (
delayed_gcode) - ✅ Clean integration into
START_PRINT
Start Macro
↓
Initial Probe (5 points)
↓
Store baseline
↓
Loop:
↓
Probe again
↓
Calculate drift + trend
↓
┌───────────────┬───────────────┐
│ Not Stable │ Stable │
│ │ │
↓ ↓ ↓
Repeat Loop Early Exit Final Exit
flowchart TD
A[Start VERIFY_BED_STABILITY_MULTI] --> B[Heat Bed]
B --> C[Initial 5-Point Probe]
C --> D[Store Baseline]
D --> E[Loop Start]
E --> F[Probe 5 Points Again]
F --> G[Compute Max Drift]
G --> H[Compute Trend]
H --> I{Stable?}
I -->|Yes| J[Increment Stable Count]
I -->|No| K[Reset Counter]
J --> L{Stable Count >= Required?}
L -->|Yes| M[Exit: Fully Stable]
L -->|No| N[Continue Loop]
K --> O{Early Exit Condition?}
O -->|Yes| P[Exit: Smart Stabilized]
O -->|No| N
N --> E
(Xmin,Ymax) (Xmax,Ymax)
● (Center)
(Xmin,Ymin) (Xmax,Ymin)
-
5-point sampling detects:
- Warp
- Improved Bed Stability Verification
- Uneven expansion
Download the config file and put in the config folder: https://github.com/wildBill83/bed_checker/blob/main/bed_check.cfg
~/printer_data/config/bed_check.cfg[include bed_check.cfg]Open the .cfg file and read through it to customize to you liking using the following parameters.
| Parameter | Default | Description |
|---|---|---|
BED_TEMP |
100 | Target bed temp |
WAIT |
30s | Time between measurements |
TOL |
0.004 | Stability threshold (mm) |
TREND_TOL |
0.001 | Trend flatness threshold |
REQUIRED |
3 | Stable cycles required |
Run manually in terminal:
VERIFY_BED_STABILITY_MULTI BED_TEMP=100 WAIT=30recommended usage pattern, do not copy it into your START_PRINT:
[gcode_macro START_PRINT]
gcode:
{% set BED_TEMP = params.BED_TEMP|default(100) %}
{% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(220) %}
# Start heating (non-blocking)
M140 S{BED_TEMP}
M104 S{EXTRUDER_TEMP}
HEAT_SOAK
# Verify bed thermal stability
VERIFY_BED_STABILITY_MULTI BED_TEMP={BED_TEMP}
# Generate mesh AFTER stabilization
BED_MESH_CALIBRATE
# Final nozzle heat
M109 S{EXTRUDER_TEMP}
# Prime / prep
G92 E0
G1 Z5 F3000- Requires a properly configured Eddy current probe
PROBEmust return consistentlast_z_result- Adjust probe margins to avoid clips / edges
- Increase
WAITfor thicker beds (45–60s recommended)
This implementation treats your printer as a feedback system, not a timer:
- Uses real measurements
- Reacts to physical behavior
- Stops when equilibrium is reached
MIT
Built for advanced Klipper users pushing beyond traditional heat soak workflows.