Ultimate Marlin 2 + BLTouch for Ender 3 (8-bit) with OctoPrint

This is the vanilla version of Marlin Firmware 2.x pre-configured for Creality Ender 3 printers with original or generic BL Touch sensors. This distribution is focused on professional/power users and is packed with the maximum amount of features the small 1284P chip can fit at the expense of the SD Card support. Because of the lack of the SD support this is only recommended for OctoPrint users.

Please note that this is not the version I recommend for 8-bit boards like the one used in the Ender 3. The most stable and feature rich version of the firmware for this architecture is the 1.1.9 that I made available in another article. Marlin 2.x is aimed to a new generation of boards using 32-bit processors, the built in libraries are bigger and there is less space left for features. Anyway, if you want to try this you can be sure I did the best I could to configure it properly and fit the maximum amount of features possible. It was downloaded and installed more than 10000 times and I believe most of the users will find no problems with it.


  • Full LCD Menus
  • Adaptive step smoothing
  • S-Curve acceleration
  • Advanced Pause feature
  • BLTouch support enabled (default probe offsets X=-42mm, Y=-5mm, Z=0mm)
  • Bilenear automatic bed level with 25 probe points and 3 trials each
  • Nozzle park feature
  • Fully compatible with OctoPrint
  • All changes from the original Marlin config file were marked with the comment tag "Customized DBP"
  • SD Card support disabled to fit all extra features

Note about the bed leveling strategy

There are two ways to perform the automatic bed leveling, the first is before every print and the second is only when necessary. Based on my experience with the Ender 3, it's better to do an extremely precise bed leveling when necessary than a simpler one before every print and this firmware configuration reflects this choice.

If you want to do quick/imprecise bed leveling before every print you will need to reconfigure the firmware.

Note about linear advance feature

Most of the slicers already have excellent implementations of this flow compensation algorithm. Enabling Linear Advance in the firmware would make it incompatible with the slicers implementation and limit the user options. Linear advance is not enabled in this distribution.


  • BLTouch installed on pin 27
  • Z stop switch removed (it can block the Z axis movement)
  • IMPORTANT! BLTouch tip height must be adjusted according to the official instruction manuals. There are different BLTouch sensor clearences and the YouTube videos tips are wrong most of the times
  • Bootloader installed
  • Microsoft Visual Studio Code if you plan to install from the source code
  • PlatformIO IDE extension installed on Visual Code if you plan to install from the source code
  • OctoPrint - This version has no SD Card support.

Installation and configuration

Follow the instructions in the Vanilla Marlin 2.x for Ender 3 article.

If you have problems compiling the firmware...

I can compile the firmware for you. Please see here for more details.

Other Marlin downloads for Ender 3

Version (July 2020)
Any operating system
File size
5.0 MB (source), 496 KB (HEX)
Package 1 SHA256: 6FAF28131F8F0BEF040FECD76AB8025EFB5120C603C4BEC147CD3A930E10147B
Package 2 SHA256: ED07FF0E1E542909BC949F2A06609DA16DF610D33CE674819D65888A86EA97D8
Package 3 SHA256: AF40246657584FC13A0B1EB74AE5FA48C89ED391CF14CBF9BA424BCA2F7175F7

Post Categories


Submitted by Donnie on Sat, 12/25/2021 Permalink

I have complied everything and uploaded with out any changes. When I auto home, it will home the x,y. It will safe home for z; as far as returning to the middle of the bed. It will deploy the BTTouch probe, but it will not move down to the bed and touch off. It just deploys the probe the last time and the probe stays down, with the blue light. The screen on the ender 3 says Endstops Z. That's it. it will not do anything else. X  159, Y122, Z ??/20. If I try to lower Z through the motion feature, Z does nothing. It will move up. If you try to make it go down, the numbers will change (decrease) but Z does not move down at all. 

I have been working on this thing for days and I still have this same issue, The only thing I have done other than the basic install of Creality's kit is removed the resistor on the board for Z. This issue was present before I did that. It made no difference at all. 


Submitted by Ricky-Bobby on Sat, 06/19/2021 Permalink

Just installed my first BLTouch on my Ender 3. After G28, Both ways of running bed leveling (before every print, and restoring a mesh after homing) are completely ignored.  Probe and G29 is working just fine through Octoprint Terminal. If print is paused in Octoprint, M420 S1 works to turn on bed leveling but that is not at all my desired workflow.

Things I have tried:

M400 after G28 and G29

Erasing all other custom start GCODE





 M420 S1"

 And a whole lot of googling looking for the answers to my questions



Ender 3

Creality 1.1.4 board

Marlin Ultimate from danbp.org

Ultimaker Cura 4.9.0

Octoprint 1.6.1 on a windows machine

Submitted by Aleksej Horvat on Sat, 08/08/2020 Permalink

I flashed the Compiled Ultimate Marlin (HEX) for Ender 3 + BLTouch + TMC2208 version of your firmware and flashing completed sucessfully. I still have the stock display connected without the adapter board, which is now beeping constantly (high pitched noise). I beleive this is because pin 27 expects the BLTouch which I still must finish connecting. I am trying to upload a new version with BLTouch pin changed to 29, or downgrade to 1.1.9 but in all cases I receive an error

avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00

The board seems to boot normally and I can access menu functions. I can connect with OctoPrint and the board seems to reset when I try to flash with Avrdude but now I am stuck. Does your firmware version overwrite the bootloader? Do you have some advice for how I can reflash (I do not have the avrflasher at the moment).

Thank you also for sharing your efforts and any advice you could provide.

Thank you!

I ordered an avrprommer and with that I was able to reflash the bootloader. Problems are gone now. So it seems that the bootloader had become corrupt. I don't know how this happened, but I have a suspicion that it's because it's because I use OctoPrint on a RasberryPi, and the Creality mainboard is drawing power over the USB cable. There may have been a brownout condition which caused the bootloader corruption. I can't know for sure, but it's my best theory. So a word of caution for anyone with a similar setup.

Now I still have the buzzer going constantly even though I changed SERVO0_PIN to 29 in Configuration.h

Is there some other setting that affects the buzzer?

Submitted by CedFlow on Mon, 08/03/2020 Permalink


Thanks for your work.

Do you know what the differences between compile with "mezli" and "melzi_optimized" ?

"melzi_optimized" use less space on ROM. Why ? and is it working as well ?


Submitted by Eric on Mon, 07/13/2020 Permalink

Recently, Marlin was released.  I recognize it was essentially a maintenance release, however do you plan to update your build to this latest version?



I checked the release notes and nothing changed for 8-bit processors like the Ender 3. I will run some extra experiments before releasing because the library versions changed and this typically increase the size of the firmware.



While I don't want to be a nag, Marlin 2.0.6 just was released.  Will you do your build for this release?  Thanks.


Submitted by Frederick on Thu, 06/25/2020 Permalink



Awesome guide and build! Thank you!


I do have 2 questions however:

1) For S Curve Acceleration to work correctly, do I need to disable Jerk and Acceleration control in Cura?



2) I'm new to BL touch. I've installed it, used this build and set my probe offsets.


I have this fan duct: https://www.thingiverse.com/thing:4401624 with the spacer: https://www.thingiverse.com/thing:3072487

I used M851 to set Offset: X: -47 Y: -8

Next I used G28 to home.

Next I lowered the Z axis to position the nozzle close to the bed with a post-in in between and this gave me -3.4 as offset which I set with M851 Z-3.4.

(I have a glass bed which is quite thick).




Now, when I do G28 again it moves the Nozzle back quite above the bed, so I use G1 F60 Z0 to position it back to the real Z home.

I have noticed that sometimes it puts it back nicely where I put it manually when defining the -3.4 offset, but sometimes it seems to position it around 0.5 higher... This without touching the bed or glass.

What am I doing wrong?


Thanks a lot!





Seems that each time after a G29... the nozzle is 0.5 higher than when I calibrated it and adjusted the offset.




Manually move the nozzle just above the bed, post-in in between

M851 Z -> adjusted




G1 F60 Z0 -> OK



G1 F60 Z0 => nozzle 0.5 higher than when calibrated.


What am I missing?

Thanks in advance for hour help!

Submitted by Jerzy on Mon, 06/08/2020 Permalink

Hello Daniel

In configuration.h in the section on TMC2208 in the ultimate version you have "//" in front of #define X_DRIVER_TYPE TMC2208_STANDALONE // Customized DBP. Is this correct?

Submitted by Nathan on Sat, 05/30/2020 Permalink

Hi Dan!

I've been looking for a solution for this for days now and I'm glad to come across a post that provides the HEX file because for the life of me I keep getting errors when trying to enable advanced pause feature & filament change through VS when building.

The only issue I have is that I can't find a version of your HEX where you provide SD card support + BLTouch + Advanced pause & Filament change. If you'd be able to compile a version like that in HEX format all my problems would be over...

If you could provide me another solution I'd be happy to hear it!




I'm currently running the 1.9 merlin with bltouch, display but bed leveling happens through the gcode command in the SD card. I can still calibrate the Z offset, but I'd like to do this with the Marlin 2 version because my prints don't come out as good with the 1.9 marlin... I just can't seem to configure the 2.0 marlin through either arduino or VScode... If I could I'd just remove the features I removed in the 1.9 marlin and configure it myself into a hex file but I'm getting so many library errors when trying to compile marlin 2.0 in arduino or vscode that just don't show up with the 1.9 version even though I do exactly the same?

Please Obi-One Kenobi you're my only hope

It is not that simple... Marlin 2.0.5 is much bigger than 1.1.9 and all the errors you are getting in VSCode are because you are trying to fit more data than the memory can handle (many error messages don't explicitely say that). The smallest version of Marlin 2 is the 2.0.1 available here and even using it you will need to disable something if you plan to use advanced pause/filament replacement.


Submitted by William on Mon, 05/25/2020 Permalink

Hi, great work!, Thank You!

I realize in the new version 2 of marlin you got rid of the Preheat bed, level and store feature to save space. I was hoping that forgoing support for the SD card, that feature would be put back in this ultimate version. But, alas, I can't find it in the menu. Or am I mistaken?





Unfortunately it's not possible to fit this feature. As Marlin evolves the built in libraries get too fat for the limited 8-bit boards and I am forced to disable some features...Feature and performance wise, the best Marlin for the Ender 3 is the 1.1.9.

For this specific version you can enable SLIM LCDs to re-enable CUSTOM commands menu back.

Submitted by Kayvee on Mon, 05/25/2020 Permalink

Thanks for this excellent guide. I am new to 3D printing, purchased an ender 3 pro last month. And added bltouch abl. But not that happy with the stock firmware. And I found your blog post. How I find if my printer’s main board is 8 bit or 32 bit.

Submitted by Eric on Wed, 05/06/2020 Permalink

First, thank you for this excellent description and firmware for adding BLTouch to an Ender 3.  However I think your SHA-256 is incorrect for all three packages.  Here is what I calculated for the source code:

owner@iMac Downloads % shasum -a 256 Marlin-
625e74b88e8ccee48c7d463a1b20d777403152665af83c5609f9006fc414904f  Marlin-
owner@iMac Downloads %


This does not match the SHA-256 what you have listed.




Submitted by Charles on Thu, 04/30/2020 Permalink

I want to say thanks first for the firmware, it was the one thing that got my Ender 3 Pro running properly using the BLTouch.

I have noticed - "Warn: Not sending "M141 S0", printer profile has no heated chamber " scrolling in the terminal window on OctoPrint. I think line -"#define TEMP_SENSOR_CHAMBER 0" needs to be commented out to "//#define TEMP_SENSOR_CHAMBER 0" to prevent this.

Plus, I think someone else might've mentioned that the version displayed onscreen still says v. instead of v2.0.5.3 like in the About Printer > Printer Info screen.

Otherwise, awesome!!!

I'm still battling the upgraded V1.1.5 board and extruder stopping randomly. I'm sure it's related to the TMC2208 and Marlin, as I've seen many issues form other people posted. Creality sent me a replacement for my original V1.1.4 that was having issues with x-axis. I received the V1.1.5 only to find it worked once then died, so Creality sent another replacement that has yet to arrive. In the meantime I ordered a new ATmega1284P and swapped it out. I assumed that because I could not flash the chip that it was dead and it came back to life again.

Long story short, I'm still waiting on the second replacement Silent board to confirm the issue is not a faulty board.


Submitted by Francois on Wed, 04/29/2020 Permalink

Has an information, it's still written CUSTOM_MACHINE_NAME "Marlin" inside configuration.h wich is confusing at first. When correcting it, it works perfectly for now.

Submitted by Tiago Da Costa on Sat, 04/18/2020 Permalink

Hello, Daniel,

Thank you for your firmware and all your precise indications. I can barely imagine the regular work it represents.

However here is my problem, when I do the G29 function the X axis goes much too far.

I am using the precompiled version Package 3: Compiled Ultimate Marlin (HEX) for Ender 3 + BLTouch + TMC2208

Currently I have is fixes the problem?

Could you please check. Thank you very much!

Translated with www.DeepL.com/Translator (free version)



Only 2.4.4 is working here. 2.5.1 and 2.5.3 wont show anything on the lcd and can't be accessed with octoprint.

any suggestion ?


power supply is not the issue. 

version 2.4.4 from here boots and works. but as soon as i go to 2.5.3 the screen stays blank. when i flash 2.4.4 back it works again. 



Submitted by Nick Marino on Wed, 04/15/2020 Permalink

After flashing this version of firmware I got an error on the LCD saying Error: EEPROM. Onlything I changed was the probe offset.

Is there something else I need to do to get it to work correctly.

Also I ran initialize EEPROM in the LCD menu and that seems to work but afterwards Octoprint just kept rebooting the controller trying to connect to it.

You could see on the LCD it was just constantly rebooting. When I stopped Octoprint manually from SSH the rebooting cycle would stop.

Not sure this is 100% compatible with OctoPrint.

EEPROM verification is a new feature in Marlin 2.0.5. It checks the memory for inconsistent/corrupt data. If you upgraded from Marlin 2.x or 1.x you will get that because the storage system is different.

You must reset your EEPROM to fix this error. Please do not use Octoprint for firmware maintenance activities.



Submitted by Simon Wilmann on Sat, 04/11/2020 Permalink

Hi Dan


First i want to say this is awesome and Im really grateful for your work.

So I have this weird issue.

When doing a G28 homing the Z the first time the bltouch activates but it seems to ignore it for the first activation but after the second activation it works like it should. but not after the hotend hits the bed.

It will do a second check and not hit the bed. and then go about its way and print just fine.


if i do a g28 it does the 25 point bed test no issues does not hit the bed.

my current start code is this.(Hitting the bed happens any time I run G28)

M140 S55
M190 S55
M104 S200
M109 S200
M82 ;absolute extrusion mode
M201 X500.00 Y500.00 Z100.00 E5000.00 ;Setup machine max acceleration
M203 X500.00 Y500.00 Z10.00 E50.00 ;Setup machine max feedrate
M204 P500.00 R1000.00 T500.00 ;Setup Print/Retract/Travel acceleration
M205 X8.00 Y8.00 Z0.40 E5.00 ;Setup Jerk
M220 S100 ;Reset Feedrate
M221 S100 ;Reset Flowrate

G28 ;Home
M420 S1
G92 E0 ;Reset Extruder
G1 Z2.0 F3000 ;Move Z Axis up

not sure what im doing wrong. I hope i explained it well enough. tried looking around the web but cant find anyone with this issue.


also note i have moved the touch to PIN 29.

changed it in config.h and in "pins_MELZI_Creality.h"




Probe crashing is due Z end-stop problems:

  1. Make sure you are using the exact clearences/heights indicated in the manual for your version o BLTouch. Every version of the BLTouch requires different clearences and if the probe is too far from the nozzle it will fail.
  2. Check the white/black cable connection, and the "capacitor" issue in Antclabs website.


i forgot  that i did that stuff with my last upgrade. eg when i got the BLtouch about a year ago. 

and going from marlin 1.1.x to 2.0.x just is a little confusing.


so i just bit the bullet and  removed the capacitor. works fine now.




Section: Melzi & Compatible(Creality3D V1.1.3 or V1.1.4 : Ender-3) Board Wiring

※ ​ C7 must be removed to use BLTouch.

If you remove C7, accuracy would be higher, even though if you don't use BLTouch.

It is inappropriate for it to be there. You can easily remove C7 by just using a long nose plier or cutter.


This is what i did and it fixed all my issues.



Submitted by flolas on Sun, 04/05/2020 Permalink



I'm trying to compile and flash my ender 3 pro with the source code provided, i have the following error in sketch:

Sketch uses 131050 bytes (100%) of program storage space. Maximum is 130048 bytes.

I tried to disable some features following this :https://www.crosslink.io/marlin-2-0-memory-usage-by-feature/ 

but almost everything was off.....

If i use the .hex provides it will overwrite the bootloader? I'm currently flashing directly with usb