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.

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 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.