The real reason of first layer issues, and a solution

A huge proportion of the complaints about the K2 Plus (and probably other CREALITY models as well) revolve around first‑layer difficulties. Most users have ended up resigning themselves to babysitting the first layer every single time, manually adjusting the Z‑offset as soon as things start going wrong. What’s most frustrating is the lack of repeatability, especially for those who—following CREALITY’s rather strange advice—recalculate the mesh before every print.

The following experiment will point you toward the real reason behind these issues, and how to fix them while waiting for CREALITY to update their software properly.

WARNING: Everything that follows assumes you have not patched the machine’s configuration files in any other way.

In the file printer.cfg, temporarily replace the line (in the bed_mesh section, around line 360):

  probe_count: 9,9

with
probe_count: 3,3

This will quickly generate a 9‑point (3×3) mesh. The goal is not to print with this mesh, but to observe what happens when the same algorithm is repeated.

In Fluidd, under the Console tab, run the following commands N times:

BED_MESH_CALIBRATE

and
BED_MESH_OUTPUT

You will collect N mesh matrices, each representing the measured height of the nine points. In a perfect world, the matrices would be identical, but no measuring instrument is perfect. The only real question is whether the observed deviations are acceptable given how the measurement is used.

I ran the experiment 10 times (you should try it—it’s quick since there are only nine points). Your results will differ from mine because every machine is different, but you will likely see the same pattern. Here’s what I observed on my machine:

  • The maximum deviation between the 10 measurements for any of the nine points was 0.068 mm, which is 34% of a 0.2 mm layer height.
  • The average absolute deviation across the 10 measurements was 0.032 mm, or 16% of a 0.2 mm layer.

With a supposedly constant flow—which already puts the extruder under pressure to compensate for pressure variations—it’s easy to see how this leads to ripples and lifting that ruin the first layer. The measurement error at each point of the bed is simply too large to produce a reliable first layer.

WHAT TO DO

First, a few thoughts that go against common assumptions:

  • The main quality we expect from a mesh is not how flat it is (though that doesn’t hurt), but how accurately it reflects the actual topology of the bed.
  • The topology of the bed has no reason to change from one print to the next (otherwise it could also change during a print).
  • It does not change when you update the firmware, switch filament types (PLA, PETG, TPU…), install a new nozzle, a new hotend, or even a new extruder—even a non‑CREALITY one.
  • As long as you don’t touch the gantry or the bed itself, the topology stays the same.

With a bit of luck, you might get a mesh whose error is small enough to give you “good enough” prints. If you ever manage to obtain such a mesh, keep it, because the odds of recalculating a better one are low.

The real question is whether we can force that luck and obtain an acceptable mesh. When a measuring instrument produces unacceptably noisy data, the scientific approach is to repeat the measurement N times and average the results, reducing the error by a factor of 1 / sqrt(N).

CREALITY knows this perfectly well: the reference Z measurement at the start of each print is repeated several times (at least 5), with additional checks likely used to discard outliers.

So, in theory, CREALITY would only need to measure each mesh point N times to produce an acceptable mesh. And indeed, machines equipped with a prtouch probe have a samples parameter in the [prtouch_v3] section of printer.cfg. Unfortunately, on the K2 Plus, changing this parameter has no effect on the mesh calculation.

Thus, the mesh problem would be solved if CREALITY simply enabled this parameter, allowing users to choose between a fast “bad” mesh and a slower “good” one.

In the meantime…

You can approximate this behavior by performing several mesh measurements, averaging the resulting matrices, and replacing the mesh stored in the commented section at the end of printer.cfg.

However, there is a crucial detail: Each mesh is measured relative to a Z reference that changes slightly from pass to pass due to measurement noise. You must not average the raw matrices. You must first normalize each matrix by subtracting its own average value.
The algorithm is:

  1. Choose a grid size N (9×9, 11×11…). The “right” value is another topic I’ll return to later.
  2. Run BED_MESH_CALIBRATE then BED_MESH_OUTPUT P times, saving each matrix.
  3. Normalize each matrix by subtracting its mean value.
  4. Compute the average of the P normalized matrices and paste the result into the mesh section at the end of printer.cfg. This averaged matrix becomes the default mesh at the next reboot. Be extremely careful with syntax—this part of the file is not meant to be edited.

To ensure the mesh is always loaded after reboot, add the following line to the [gcode_macro START_PRINT] macro in gcode_macro.cfg, after:

 NEXT_HOMEZ_NACCU
 G28 Z

add

 BED_MESH_PROFILE LOAD=default

Reboot the machine, then adjust your Z‑offset, which should now be close to 0 and depend only on the filament.

MY RESULTS

After validating the method with a 13×13 grid measured 10 times, the resulting mesh produced an almost perfect first layer up to a 250×250 mm square. Minor defects appear beyond that, more visible as the print size increases. This is due to a fundamental limitation of interpolation algorithms: they cannot interpolate accurately near the edges, and even less near the corners.

With a 13×13 matrix, the outer 25 mm border is poorly reproduced. The closer you get to the edge, the worse the approximation. To print larger areas, you must increase the matrix size, but measurement time grows with the square of the grid size.

Being a compulsive perfectionist, I pushed things far beyond reason. With a 65×65 matrix (4225 points) measured 17 times (two full days of measurements), here is the resulting mesh (range 0.4290 mm—not impressive on paper):

But in practice, it allows me to print a 348×348 mm first layer (leaving room for a skirt) with perfect repeatability, as shown here:

I’ve been using this mesh for two weeks. I’ve printed large PLA parts and smaller TPU parts. I will never repeat this experiment—it produces a level of perfection no one actually needs—but this will remain my reference mesh until I’m forced to modify the bed. (As a precaution, I never touch the magnetic build plate.)

This experiment makes one thing unmistakably clear: the machine itself is not the problem. The K2 Plus delivers excellent flow control, applies mesh compensation reliably, and is mechanically solid. The only real flaw is a software decision — CREALITY’s choice to prioritize mesh‑calculation speed over mesh quality. That trade‑off cripples first‑layer consistency, and users shouldn’t be forced to live with it. CREALITY should simply give us control: a parameter that lets the user decide how many times each probe point is measured. One small change, and the entire first‑layer experience transforms.

2 Likes

@CREALITY Can we fix this with the next firmware update? I cant start a print without being at my machine to adjust the Z Offset, it makes the rest of your ecosystem useless.

1 Like

I too have often wondered whether the real problem was the low number of probed points and the accuracy of them. You’ve done an excellent job here, and are to be congratulated. Thanks for your efforts for the benefit of us all. I for one would be happy to have a high-resolution bed mesh selectable in the standard UI.

Again, THANK YOU!

1 Like