Ultimate Marlin 2 + BLTouch for Ender 3 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.


Version (April 2020)
Any operating system
File size
5.0 MB (source), 496 KB (HEX)
Package 1 SHA256: 625E74B88E8CCEE48C7D463A1B20D777403152665AF83C5609F9006FC414904F
Package 2 SHA256: ADC6D67985C34935FD7EE830FDA060694A8E41CF87F1B9E8AC9DB116622F7D03
Package 3 SHA256: 309D37BA16D9392C63C02EF8D0EADD39CE10990E93BE623D3C7B98A29C7042F6

Post Categories


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:

[email protected] Downloads % shasum -a 256 Marlin-
625e74b88e8ccee48c7d463a1b20d777403152665af83c5609f9006fc414904f  Marlin-
[email protected] 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.



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



Submitted by Ben Holmes on Wed, 04/01/2020 Permalink

After spending a week trying to configure Marlin 2.0.x myself to include my new BLTouch I finally found your post here. Thank you so much for providing this.

Submitted by David on Sun, 03/29/2020 Permalink

Hello, first of all, thanks for your work. I print with Ender 3 and with Octoprint and my BLTouch, but sometimes I print with SD. What I should disable to enable SD CARD?


Thanks and regards.

Submitted by Bobby O'Connell on Tue, 03/24/2020 Permalink

I have tried to build this from source code only changing the amount of space to inset probe from edge of bed and it keeps telling me the file is too large. Is there anything else that can be removed? I would ideally like to change where the probe is touching the bed, it currently tries to probe on top of my bed clips.

Hi Daniel, first of all, thanks for this great firmware. It solved a lot, if not all, of my BLTouch headaches and printing works great now. 

I have the issue that the menu structure changes during printing ("move" menu disappears, and other things) and does not come back when I cancel the print in Octoprint I think it also does not change back to the default menu when the print finishes in a regular manner. I assume the change of the menu is normal as some operations like moving the head only make sense when not printing. 

But how do I get the standard "idle" menu state back after Octoprint finishes? So far, only switching things off and on again does that.

Kind regards, Chris 


Marlin 2 does the things in a very different way than the 1.x versions. I'm still trying to figure out everything that changed by I suspect this behavior can be related with G-Codes that disable the stepper driver and/or reset the homing after the end of the printing. Could you try to home the head again and see if the menus come back? The G-Code is G28 but there is an option for this from the LCD panel as well.

Daniel, thanks for the response. I can report that a regular print via octoprint works. Afterwards, the menus return to their "idle" state. I did not do what you suggested because meanwhile, I received my new silent board and will have to make my own Marlin now anyway due to the need of TMC2208 stepper motor drivers enabled. I will post what happens with my own build. Kind regards, Chris 

Submitted by Aäron Declerck on Mon, 02/24/2020 Permalink

Thank you to compile your own Marlin version. It is excellent! I still have an issue where occasionally the LCD screen won't turn on. M502 followed by M500 doesn't seem to resolve this issue. I will try to investigate it further. Do you have a PayPal or Patreon link where I could support you?


There are some errors related with the EEPROM not being updated with the firmware and I was not able to figure out exactly what happens. Resetting the EEPROM seems to work most of the time.

Thank you for the support offer! Since I don't maintain any channel for contributions I ask you to consider donating the amount to a charity service of your trust.


Submitted by Arti on Tue, 03/17/2020 Permalink In reply to by Aäron Declerck

Have same problem, but occasionally the LCD screen  turn on. I have to turn off and turn on printer 6-7 times until it start working.

Stock firmware works ok

Submitted by Christian on Sun, 02/16/2020 Permalink

Hi Daniel,


thank you for your excellent work! I have successfully flashed your Marlin Ultimate Edition to my Creality Ender 3X and it worked very well. Right now I am doing the next step and building a firmware on my own to be able to include some specific settings (e.g. PIDTEMP, PIDTEMPBED).


In the Configuration.h file on line 881 ("#define SERVO0_PIN 27") there is a remark that the BEEPER_PIN sould be set to -1 to prevent triggering the BL-Touch probe during the menu use. Although this did not happen when using your compiled firmware, I double checked the file (Marlin\src\pins\sanguino\pins_SANGUINOLOLU_11.h) and there BEEPER_PIN is set to 27 or 29 depending on the configuration and not to -1. Shall I change this value to -1 or am I missing something?


Greetings from Vienna,


Hi Daniel,


thank you for your quick reply. :-)


By the way: it turned out that enabling the PID-Tuning for the heatbed (which is disabled by default) increases the size of the firmware so that is too large. So I will limit the changes more or less to entering my PID-Tuning values for the hotend.




To enable the advanced Marlin 2 features like the S-Curves and the adaptive smoothing I had to turn off something to free memory. The SD Card support was the only candidate left and by doing that we got additional benefits...

The 1284P chip has a limited processing power and every time it gets overloaded with complex GCode instructions it will hang for a few microseconds. When this happens the residual pressure in the nozzle generates a blob.

Obviously the SD Card reading takes a huge amount of cycles and after disabling it we can have a much smoother operation.

Another feature enabled to save processor cycles is the ENDSTOP_INTERUPTS_FEATURE that eliminates the endstop check loop.