Vanilla Marlin Firmware configured for Ender 3 + BLTouch

This is the 1.1.9 version of vanilla Marlin Firmware pre-configured for Creality Ender 3 printers with the original or generic BL Touch sensors. The standard configuration file from Marlin distribution was carefully reviewed to include the latest Ender 3 specific settings from the official Creality firmware. If you don't have a BLTouch sensor please use this version of Marlin that supports Mesh Bed Leveling.

I made avaliable the 2.x versions of Marlin for the same board and printer but I recommend using the 1.1.9.x because it is much more stable and has more features. The 2.x versions of Marlin are too big for the board memory and several features had to be removed in order to fit the firmware.

There are three installation options available, the traditional with Arduino IDE, the new method using Visual Studio Code + PlatformIO and the third one that is uploading the compiled firmware directly to the board. I recommend the PlatformIO option for most of the users, once the software is downloaded, the firmware can be upgraded in less than 5 minutes.

This firmware was made for 8-bit boards and will not work on 32-bit boards.


  • Official Marlin firmware + bugfix with all hardware settings from Creality latest official firmware (April 2020).
  • BLTouch original/generic up to 3.x. enabled by default (BLTouch 3.x might need the 5V logic enabled from the LCD menu).
  • No need to remove any capacitors from the board.
  • Installs from the original Arduino IDE (smaller download and frequent updates from Arduino team).
  • Source code was modified to prevent releasing the BLTouch sensor during "beep" events triggered by LCD menus.
  • Thermal runway protection enabled.
  • Does not reset the bed level settings after the G28 (Home) command.
  • Custom menu with maintenance mode, emergency mode and full auto bed leveling sequence (warmup, wait, home, level and then save settings).
  • Ultra-precise bilinerar bed leveling algorithm with 25 probing points and slow probing (takes around 5 minutes to complete, 10 including the bed heating).
  • Run and toggle the bed level and BLTouch tools from LCD menus.
  • BLTouch voltage/logic settings from the LCD menu.
  • Slim menus enabled.
  • Baby steps enabled and configured for the "Magic Numbers".
  • Emergency parser enabled.
  • All changes from the original Marlin config file were marked with the comment  "//Customized DBP"


  • 8-bit boards only! This will not work with 32-bit boards.
  • 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 sensors and the YouTube videos tips are most of the times wrong
  • Bootloader installed in your board
  • Arduino IDE for installation option 1
  • Visual Studio Code for installation option 2
  • AVRDude for installation option 3 in Linux or MacOS (AVRDude for Windows is included in the package)

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 (slower) bed leveling when necessary than a simpler one before every print. 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.

Instructions using Arduino IDE (option 1)

  1. Install the Arduino IDE
  2. Quit any software that could try to access the printer from the USB port (Cura, Serial Monitor, OctoPrint, etc...).
  3. Run the Arduino IDE and configure to download the Sanguino board. Add the following URL to the board manager (File->Preferences->Additional boards manager):


  4. Install the following libraries/boards in the Arduino IDE:
    • U8Glib
    • Sanguino
  5. With all requirements in place unpack this entire Marlin distribution to a folder and open the "Marlin.ino" file from the Arduino IDE.
  6. Look for the configuration.h file and change the following lines to the relative coordinates of your BLTouch mount to the Nozzle. The actual settings are for this mount. If you don't have the measurements now you can configure it later with the M851 GCode (see instructions below).

  7. Disable the endstop interrupts feature by commenting (//) the following line in configuration.h. This feature needs to be disabled only if you are using Arduino IDE, with PlatformIO this problem does not exist.



  8. Compile and upload the firmware. Make sure you are using the following settings.
    • Board configuration: ATMega 1284P 16Mhz
    • Programmer configuration: AVRISP MKII
    • COM Port: Depends of your computer. Usually only one is available for selection.
  9. Follow the post-installation instructions below.

Instructions using Visual Studio Code + PlatformIO (option 2)

  1. Download and install Visual Studio Code.
  2. From Visual Studio Code extension menu, install the PlatformIO IDE extension.
  3. With all requirements running, unpack the entire Marlin source code downloaded from the link below to a folder.
  4. From Visual Studio Code select File->Open folder and select the folder where the platformio.ini file is located. Attention! Use the "open folder" command, not the"open file".
  5. Look for the configuration.h inside the "Marlin" sub-folder and edit the following configuration to the relative coordinates of your BLTouch mount to the Nozzle. This does not need to be too precise, the only purpose is avoiding the probe to test outside the bed. The default settings X = -42mm, Y= -5mm and Z=0 are for this mount:
  6. Save the file and then select Terminal->Run Task->Build . It will take a few minutes for the system to download all dependencies and compile the code.
  7. If the code compiled properly you will see something like this in the terminal: "=== 1 succeeded in 00:00:30.050 ===".
  8. Connect your printer to the computer using the USB cable.
  9. Go to the Visual Code menu Terminal->Run Task->Upload .
  10. If everything goes well another message like this "=== 1 succeeded in 00:00:55.010 ===" will be printed.

Installing the pre-compiled HEX (option 3)

The pre-compiled firmware is also available here. You can simply burn the compiled HEX file directly to your Ender3 board without installing the Arduino IDE or Visual Studio Code.

To upload the pre-compiled firmware you will need the AVRDUDE 6.3 tool. For your convenience I included the Windows version of this tool in the zip file that contains the HEX firmware but the tool is also shipped with the Arduino IDE. The upload command in Windows PowerShell should look like this:

./avrdude -p atmega1284p -c arduino -P COM3 -b 115200 -v -U flash:w:firmware.hex:i

The serial port is something between COM1 and COM8, depending on where the USB driver is pointing to, and firmware.hex is the file you are uploading. If you are using other operating system like Linux the port address will be somehting like this /dev/ttyUSB0.

After initializing the board with the new firmware don't forget to reconfigure the probe offsets running the following command from any serial terminal. Replace the default offset values in the command (-42, -5, 0) with the ones for your probe mount.

M851 X-42 Y-5 Z0

Finally, follow the post-installation instructions below.

Post-installation configuration

  1. Manually pre-level the bed! This is important because the BLTouch has limited max/min detection ranges and the print quality can be affected if the Z-Axis moves too much.
    1. Cool down the bed and the nozzle. Heating should have little to no effect on this specific procedure.
    2. Disable stepper motors using the LCD menu command.
    3. Place a credit card on one the bed, the thickness of the card will be used as a reference distance.
    4. Turn the Z axis with your hand until the nozzle hits the credit card.
    5. Move hot end to several positions of the bed, starting from the 4 corners. For each position, adjust the bed level knobs to keep the nozzle at the credit card thickness distance from the nozzle. This is what you would do in manual calibration but instead of using a paper you will use the card for convenience. The card thickness does not matter because the BLTouch probe will redefine the Z reference.
  2. Heat the bed to the printing temperature and run the bed level command from the LCD (Prepare -> Bed Leveling -> Level bed)  or using the G29 gcode or using the Heat and Level command from the custom menu (recommended). Note that the Heat and Level command waits 2 minutes after the bed is hot to allow the mounted surfaces to expand/contract properly.
  3. Save the settings using the LCD menu or the M500 gcode (if you used the Heat and Level custom command, they will be automatically saved).
  4. Add the following gcode to the startup code of you slicer, right after the line of the G28 command to load the bed level configuration from the memory before every print:
    M420 S1

  5. After enabling the bed level, print something large and flat to adjust the Z offset. The nozzle will always be far from the bed until you adjust the offset to a negative value (LCD -> Prepare -> Bed Leveling -> Z Offset). Don't forget to save the settings after the print to keep the offset in the memory, you can use the LCD or the M500 GCode for this.

Troubleshooting tips

  • No serial COM port appears when connecting to the board: Download the FTDI Drivers
  • Bed level failing:
    • 1st - make sure you manually leveled the bed, the probing tends to fail if any part of the bed is >2mm lower or higher than the home level.
    • 2nd - make sure you have the M420 S1 command AFTER the G28 line in your print initialization GCode.
    • 3rd - make sure your probe was installed properly, there are maximum and minimum height clearences between the BLTouch tip and the nozzle tip and that changes for each version of BLTouch.
    • 4th - check the wiring! Sometimes the wires are inverted in the default connector setup.
    • 5th - if you are using BLTouch 3.x see the next topic.
  • BLTouch 3.x failing to probe: Be aware that this is rare contition, the vast majority of the users run BLTouch 3.x without problems. I suspect this is related with the hardware (probe/board components, etc) and there is little we can do from the firmware side:
    • 1st - Enable the 5V logic in the LCD menu (LCD -> Control-> BLTouch). BLTouch versions 1.x and 2.x don't have voltage modulation do not require this setting.
    • 2nd - If the previous does not work, enable SW mode (LCD -> Control-> BLTouch).
    • 3rd - Enable and adjust the delay setting in configuration_adv.h (requires recompiling the source). This is trial an error but try values from 300 to 700 increasing/decreasing by 100.
    • 4th - If the BLTouch is version 3.0 (not 3.1, 3.x...) enable BLTOUCH_FORCE_MODE_SET setting in the configuration_adv.h.
    • 5th - If none of the above work you either have a faulty probe or a problem with the capacitor in the board.
#define BLTOUCH_DELAY 500
  • Error "..._PIN is not interrupt-capable..." in Arduino IDE: This is an Arduino IDE bug, disable the feature in the configuration.h file according to the example below to fix (put "//"). If you are using PlaformIO you should leave this option enabled.
  • Disable serial port clients before flashing: If the COM ports are used by any other app, the flashing process will fail. Shutdown Cura, OctoPrint, any other slicer and any other Serial Monitor program like the Arduino IDE before compiling/flahsing the new ROM.
  • Correct fuse settings: If you are using other software than AVRDUDE (PROGISP, for example) to upload the firmware make sure you are using the correct fuse settings. Apparently the Creality tutorial has the wrong settings and the board fails to boot afterwards.
  • Reset the EEPROM: Sometimes the EEPROM memory is not reset during the Marlin reflash and this can cause problems. To reset manually use the following G-Codes from any Serial Terminal: M502 followed by M500.
  • Blank screen after flashing: You did not flashed the firmware properly. Please use AVRDude according to the instructions above and if this does not work you might have to reflash the bootloader.
  • Serial Port Monitor for Windows: This small program allows you to send/receive GCode to the printer. If the characters look strange you are probably using the wrong baud rate (start with 115200bps).
  • avrdude: stk500_getsync() attempt 1 of 10: not in sync: Wrong baud rate for the serial port or serial port already in use (OctoPrint, Cura, etc..). Try configuring the upload rate to 115200bps. If you are using PlatformIO to upload, make sure you are using the correct baud rate for your environment in the platformio.ini file.
  • Reconfigure the BLTouch probe offsets: Use the following command replacing the -42, -5 and 0mm coordinates with the offsets of your actual mount:
    M851 X-42 Y-5 Z0

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 Bugfix + BLTouch for Ender 3 (Aug 3rd, 2020)
Arduino IDE or PlatformIO
File size
4.2 MB
File 1 SHA256: 1DCD5D998C999C80D72A4153BDF27D3A2682FA5F6E869029EEB282FEE2842739
File 2 SHA256: C69961C0E223D1189FFBC2258DD30D49557BE986C5505011ABBFD479CCE61169
File 3 SHA256: D3CEFC5D5EB7C6536EFDBCED861201DA5E59272FFB0193549E2B469740452F44

Post Categories


Submitted by Hajo Piltz on Wed, 04/29/2020 Permalink

I just did a diff of my Ender 3 Pro stock settings as reported by M503 and what is burned into this hex.

Aside from slightly less conservative settings for jerk in my stock firmware, this stood out:

Recv: echo:Maximum Acceleration (units/s2):
Recv: echo:  M201 X500 Y500 Z100 E5000

Acceleration for the Extruder is 5x (!) that of the stock firmware (1000mm/s² there). Judging from the other parameters, could this be a typo and the intend was for this to be 500?



Hello Hajo,

That acceleration values are the lastest in use by Creality and were included in the official marlin distribution later last year. Usually we don't want low acceleration values because they cause surface artifacts/blobs.

Nowadays most of the slicers override the acceleration settings according to the print configuration and this hardware setting is often ignred.

If you want to change the default values use the M201 command followed by M500. No need to flash the firmware again.



Submitted by Paulo on Tue, 04/21/2020 Permalink

Olá Daniel,

Antes de tudo preciso agradecer por seu excelente trabalho com estes firmwares.

Para que o nivelamento seja feito sempre que uma impressão for enviada posso substituir o M420 S1 por G29?

Posso também alterar GRID_MAX_POINTS_X  para 3 para que o nivelamento seja feito mais rapidamente?

Muito obrigado!

Boa noite Daniel,

Acabei de gravar o FW mas estou com alguns problemas: 

1) quando conecto via OctoPrint ou mesmo via OpenSerialPortMonitor recebo o erro "EEPROM datasize error.";

2) quando executo um M503 no terminal o resultado de M851 é apenas Z0.00, não mostra X-42 Y-14 (os valores que eu configurei com base no meu BLTouch);

3) se executo um nivelamento pela opção no LCD ele realiza a medição muito próximo do limite da mesa.

Peço desculpas por estar incomodando você e antecipadamente agradeço por sua ajuda.

Submitted by Martin on Tue, 04/21/2020 Permalink

Hi Dan

I want your HEX. file ( 1.19 with BL touch) in my Ender3.

But i can´t get Avrdude to work on my windows 10 machine? is wont start at all.

Submitted by Surcouf on Tue, 04/21/2020 Permalink

Hey, thanks so much for this guide. Unfortunately I am stuck at the uploading sketch phase for hours. I get the dreaded avrdude: stk500_getsync() attempt 1 of 10: not in sync error. Nothing else is running... Cura, Octoprint, whatever. During the upload phase I get   Overriding Baud Rate          : 115200 which presumably means my baud rate is correct? 

I've tried changing port, doing it from several PCs, to no avail. Any clue for a solution?

Thanks a million :)


Hey, yeah, I did actually check the troubleshooting guide a few times before bothering you with a question :)


I did not really figure how to use the tool you link in the section but I noticed there is a built in serial monitor in Arduino IDE so that is what I used. And surely enough the only choice in the drop down that doesn't display garbled character is 115200 - just like you said it should be.

This is the message I get when I select the aforemetioned baud rate.

echo: Last Updated: 2019-07-26 | Author: Ender-3 Pro BLTouch
echo:Compiled: Aug  5 2019
echo: Free Memory: 9981  PlannerBufferBytes: 1232
echo:TF card ok
Init power off infomation.


If I keep the monitor on during the upload sequence it reads this:

echo: External Reset
Marlin 1.1.6BL_V3.1


... and that's where I get the dreadful error message.


I should probably mention I found this page because I bought the official creality BL Touch kit and I followed the procedure to install it. It comes with an arduino nano (I think) already wired so all you have to do is plug the USB end into your PC and follow a powerpoint to flash a custom firmware to the board. It used a piece of software called Progisp.


It's based off Marlin 1.1.6... and it kind of work, but it doesn't use Mesh Bed Leveling but a quick and dirty auto leveling before each print, which is really not working for me. I'd much rather use your version.


Submitted by Surcouf on Tue, 04/21/2020 Permalink In reply to by Surcouf

So yeah I did some more research and figured that by following creality procedure I actually nuked the bootloader I had previously installed... I think this is my answer. I am off to burn a bootloader again. Sorry for wasting your time.

Yeah, I used the arduino kit provided in the creality kit to burn Optiboot, and after that I was able to flash your firmware without any hitch using Arduino IDE. It's working great and I couldn't be happier!

Submitted by MICHAEL on Sat, 04/18/2020 Permalink

I am getting this when trying to load it all.

Arduino: 1.8.12 (Windows 10), Board: "Sanguino, ATmega1284 or ATmega1284P (16 MHz)"

In file included from sketch\endstops.cpp:35:0:

sketch\endstop_interrupts.h: In function 'void setup_endstop_interrupts()':

endstop_interrupts.h:121:7: error: non-constant condition for static assertion

       static_assert(digitalPinToPCICR(X_MIN_PIN) != NULL, "X_MIN_PIN is not interrupt-capable");


In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:258:0,

                 from sketch\HAL.h:36,

                 from sketch\MarlinConfig.h:39,

                 from sketch\Marlin.h:35,

                 from sketch\endstops.cpp:27:

C:\Users\michael.beach\AppData\Local\Arduino15\packages\Sanguino\hardware\avr\1.0.3\variants\sanguino/pins_arduino.h:112:70: error: reinterpret_cast from integer to pointer

 #define digitalPinToPCICR(p)        ( (((p) >= 0) && ((p) <= 31)) ? (&PCICR) : ((uint8_t *)0) )


sketch\endstop_interrupts.h:121:21: note: in expansion of macro 'digitalPinToPCICR'

       static_assert(digitalPinToPCICR(X_MIN_PIN) != NULL, "X_MIN_PIN is not interrupt-capable");


In file included from sketch\endstops.cpp:35:0:

endstop_interrupts.h:141:7: error: non-constant condition for static assertion

       static_assert(digitalPinToPCICR(Y_MIN_PIN) != NULL, "Y_MIN_PIN is not interrupt-capable");


In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:258:0,

                 from sketch\HAL.h:36,

                 from sketch\MarlinConfig.h:39,

                 from sketch\Marlin.h:35,

                 from sketch\endstops.cpp:27:

C:\Users\michael.beach\AppData\Local\Arduino15\packages\Sanguino\hardware\avr\1.0.3\variants\sanguino/pins_arduino.h:112:70: error: reinterpret_cast from integer to pointer

 #define digitalPinToPCICR(p)        ( (((p) >= 0) && ((p) <= 31)) ? (&PCICR) : ((uint8_t *)0) )


sketch\endstop_interrupts.h:141:21: note: in expansion of macro 'digitalPinToPCICR'

       static_assert(digitalPinToPCICR(Y_MIN_PIN) != NULL, "Y_MIN_PIN is not interrupt-capable");


In file included from sketch\endstops.cpp:35:0:

endstop_interrupts.h:161:7: error: non-constant condition for static assertion

       static_assert(digitalPinToPCICR(Z_MIN_PIN) != NULL, "Z_MIN_PIN is not interrupt-capable");


In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:258:0,

                 from sketch\HAL.h:36,

                 from sketch\MarlinConfig.h:39,

                 from sketch\Marlin.h:35,

                 from sketch\endstops.cpp:27:

C:\Users\michael.beach\AppData\Local\Arduino15\packages\Sanguino\hardware\avr\1.0.3\variants\sanguino/pins_arduino.h:112:70: error: reinterpret_cast from integer to pointer

 #define digitalPinToPCICR(p)        ( (((p) >= 0) && ((p) <= 31)) ? (&PCICR) : ((uint8_t *)0) )


sketch\endstop_interrupts.h:161:21: note: in expansion of macro 'digitalPinToPCICR'

       static_assert(digitalPinToPCICR(Z_MIN_PIN) != NULL, "Z_MIN_PIN is not interrupt-capable");


exit status 1
non-constant condition for static assertion

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.


You are using Arduino IDE so you need to comment/disable the ENDSTOP_INTERRUPTS_FEATURE. See the troubleshooting section for more information.

This is a problem that only happens with the Arduino IDE.

Submitted by Darren Upton on Fri, 04/17/2020 Permalink

am currently using AUTO_BED_LEVELING_LINEAR with your Marlin - working very well 

Submitted by joerg on Fri, 04/17/2020 Permalink


gibt es eine Version, auch schon älter die nicht so überarbeitet wurde wie diese.

Wo noch alle Menüs vorhanden sind.

Ich komme von meinen Pc per USB aus irgendwelchen Gründen nicht auf den Drucker.

Und möchte auch nicht immer den PC anschliessen.

Normal möchte ich alle Menüs und Einstellungen direkt am Drucker vornehmen.

Vielleicht hat ja jemand noch eine die nur etwas optimiert wurden ist.



Submitted by MT on Fri, 04/17/2020 Permalink

Found this firmware on the internet.  Thank you for sharing your work.  I just flashed the newest April 16, 2020 version of your firmware, trying to follow your guide on setup but couldn't find the "Heat and Level" command.  Is this remove from the firmware?  Just want to make sure I am doing things correctly.

Thanks found it, don't know how I missed that.  One more question, under custom command, there is "Enable Autolevel", what does this command do?  Does it need to be executed for every power on to enable autolevel?

Submitted by Joerg on Thu, 04/16/2020 Permalink


leider finde die Einstellungen nicht für den Extruder die Steps sind nicht mehr vorhanden, oder sind die bei der Version nicht mehr dabei.

This version uses slim LCD menus to fit in the board memory, this removes the e-steps configuration menu. You have to set extruder steps using GCode commands where 93 should be replaced by the desire e-steps:

M92 E93



Submitted by TeamDiabolo on Thu, 04/16/2020 Permalink

thanks very much for this.

I too tried the paid for hex file from a very well known You Tuber and it was totally carp.

This one worked brilliantly.

i really respect people who want to dig around endlessly in firmware and constantly upgrade their printers but I just want to print reliably and as cheaply as I can and this really did the trick for me.


thanks again 😎




Submitted by Chance on Mon, 04/13/2020 Permalink


You mention both in the 2.0 page and this page that the 1.1.9 version, due to memory size restrictions, has more features packed in than the 2.0 version. Looking at the bulleted features listing on both pages, they seem very similar. Could you please give a listing of feature differences between the two?

Thanks a ton,


Submitted by RT on Thu, 04/09/2020 Permalink

BEST 1.1.9 Firmware for Ender 3 Pro

Works perfectly with 1.1.4 Board and BLTouch 3.1 and Creality bracket. Flashed it with the stock USB Dongle that comes with the Creality BLTouch bundle.

I downloaded the (paid) firmware from some very popular Youtube guy but that FW was literally crap. Yours is way better and easy to use. Autolevel is so much better despite it takes a little longer. Wish I found your website earlier. You should add a donate button.

Submitted by Frank on Thu, 04/09/2020 Permalink

Just want to say a big THANKS for your work. March 2020 update works great with my Ender 3 and BLTouch 3.1.

I only had to add the TMC2208 lines as posted in on of the other comments.

Submitted by Frank on Thu, 04/09/2020 Permalink In reply to by Frank

To enable TMC drivers edit configuration.h and replace the driver type from A4988 to TMC2208_STANDALONE as follows:

#define X_DRIVER_TYPE TMC2208_STANDALONE //Customized DBP
#define Y_DRIVER_TYPE TMC2208_STANDALONE //Customized DBP
#define Z_DRIVER_TYPE TMC2208_STANDALONE //Customized DBP
//#define X2_DRIVER_TYPE A4988
//#define Y2_DRIVER_TYPE A4988
//#define Z2_DRIVER_TYPE A4988
//#define Z3_DRIVER_TYPE A4988
//#define Z4_DRIVER_TYPE A4988
#define E0_DRIVER_TYPE TMC2208_STANDALONE //Customized DBP


Submitted by joerg on Mon, 04/06/2020 Permalink

Hallo, ich finde super was hier geleistet wird.

Ich besitze seit neuesten einen Ender 3 Pro.

Mit der Firmware und Bl touch 3.1

Kann ich da ohne Probleme mit bl touch von hier flashen als hex oder gibt es da Probleme was ich beachten muss.

Eine Frage habe ich noch das Board TMC 2208 läuft dann auch mit 1.1.91 oder besser mit der Marlin 2.0.

Flashen kann ich mit dem Arduino und dem VScode kenne ich mich nicht aus.

Viele Grüße





Submitted by Bias on Thu, 04/02/2020 Permalink


I flashed your version for my Ender 3 today but my BLTouch isn't working.

The Selftest and so on is working well, but if I start the autoleveling, the process starts but sometimes the BLTouch starts blinking red, while the Z-Axis is moving higher and higher.

I already tried another cable, another BLtouch and also another adapter for the display port on the mainboard.

Do you have any idea why it's not working for me?



I'm using the bug-fix hex version for TMC drivers on my Ender 3 Pro and I use a 3Dtouch clone V3. If I go to the menu and issue the 5v command, everything works fine but I can't seem to make that setting stick between reboots.

I tried both the 5v cmd and the "set 5v" but I don't understand what the difference is. Obviously I also used "store settings". Anything else I should try out or a special order in which to do things?

Thank you very much!


If this is a probe based in the polemic and discontinued BLTouch 3.0 you have to uncomment the following setting in the configuration_adv.h

   * Safety: Activate if connecting a probe with an unknown voltage mode.
   * V3.0: Set a probe into mode selected above at Marlin startup. Required for 5V mode on 3.0
   * V3.1: Force a probe with unknown mode into selected mode at Marlin startup ( = Probe EEPROM write )
   * To preserve the life of the probe, use this once then turn it off and re-flash.

BLTouch 3.1 works in a different way, it has has an internal memory and will automatically save the state from the LCD menu command, no need to change the source if you are using 3.1 probes.

If you are not confortable with recompiling the source code can also try to load the 5V logic from the slicer settings by adding the following code before homing and before loading the bed level settings. No need to change the firmware...

M280 P0 S140; Set the 5V mode
G4 P2000; 2 seconds delay for the BLTouch


This appears to be the case.

Since you were so kind to provide full sources, I think I'll go the recompile-route: I'd like to be able to auto-home etc. from the menu without having to remember to switch to 5V.

Thanks for all the work you do here! This is by far the best resource for upgrading the firmware to Marlin and making best use of the possibilities of ABL I've found anywhere.


Weird, this has not fixed it for me. I have also tried to uncomment "BLTOUCH_FORCE_SW_MODE" but still, after a reboot, G28 fails to register the touch. Unless I manually go to the menu and issue the 5V command.


Anything else I could try on firmware level? Should I maybe mess with the G28 routine to include the recommended M280 P0 S140? Or is it more promising to start playing around with the BLTOUCH_DELAY?


Thanks for your advise!


If anybody has the same issues with BLTouch clones V3.0 (e.g. from 3DTouch) on their Ender 3 with this Firmware: This has now fixed it for me. I can see no downsides.

Since the menu item "Cmd: 5V-Mode" worked for me (but not the settings BLTOUCH_FORCE_SW_MODE or BLTOUCH_FORCE_MODE_SET and also not playing around with the BLTOUCH_DELAY that might fix that at start-up) I decided to just call at the beginning of G28 (Auto Home) the same routine that this menu entry does. That happens to be _bltouch_set_5V_mode(), which I simply call with the other BLTouch stuff that is already happening in gcode_G28(). Done!

    // Make sure any BLTouch error condition is cleared
    _bltouch_set_5V_mode(); //                               <-- This here

I feel I'm pretty safe with this: Every slicer, every macro, even G29 calls G28 upfront and fixes this issue for me.

I think I'll keep this now for a long while as my productive setup. Thanks to all of you here!


I have the same issue. I've been playing with 4-5 different firmware versions if Marlin today trying to find a decent version that works with my Ender 3 Pro and Bltouch V3.1.

I used the hex file here as I didn't want to compile yet another version.

When I do the Heat bed and level, the Z axis just gets higher and higher. This only happens with the V1.1.9 version of the firmware and wasn't having this problem an hour ago.

I can't believe we have the same wiring or interference issue.


Thanks for the prompt response. The problem happened when doing "Heat Bed and Level"

I am using the Hex file I downloaded from here. So far to day I have tried

1. Ender-3-BL-Touch-Installation-master

2. Marlin_1.1.9.1_HEX - Yours

3. marlin -1.1.x

4. Marlin 2.0.1-Hex - Yours

5. Marlin- - Yours

6. Marlin-

The MB is out of the Ender 3 Pro so I can attach the ISP programmer, it takes about 10 mins to compile and load from the Arduino.

The equipment I'm using is:

* Ender 3 Pro

* BLTouch V3.1

* Creality V1.1.4 Motherboard.

I also have an Octoprint but am trying not to complicate the issue by changing too many things.

Currently the board is flashed to Marlin 2.0.1 (Your Hex version).

I'm now comfortable compiling the codebase, just that I'm more used to an old school Unix toolchain.

More than happy to try new firmware as I'm now getting pretty good at compiling and building, however I am struggling to get Marlin- compiled as the text size exceeds the space, but that's a different problem :)