Introduction: 3D Print Bed Leveling Tool Using M5StickC

About: Avid Inventor, Programmer, and founder of GyroPalm LLC.

Do you ever find it a hassle to manually level your 3D print bed every time you make a print? Even seasoned 3D printing pros need to level the printbed after every couple prints. We’ve created a device that helps tremendously improve this procedure. This project, codenamed OmniLevel, helps you level your 3D printer bed with just a push of a button. We used the M5Stick-C to monitor the pressure between the nozzle of an extruder and the printer bed. Using a force-sensitive resistor (FSR), this allows the user to easily detect when the bed is level.

The current method of leveling a 3D print bed is to manually "eyeball" the surface of your 3D printer bed and adjust the screws on each corner accordingly. Alternately, some users slip a business card or piece of plastic between the printer bed and the nozzle to sense the "friction". This can be a tedious and frustrating task, and one that has led many people to question the usefulness of 3D printers. Sometimes improper leveling has led to poor first-layers and even failed prints.

While some new 3D printers may have special auto-leveling features, this Instructable is for the rest of us who may have an old 3D printer laying around that needs manual leveling. With the M5StickC and some basic components, I've created a device that makes the process of leveling a 3D printer bed incredibly easy! Just turn on the device, press one button, and the device will do all the hard work for you.

Step 1: Supplies and Materials

For this project, you will need the following materials:

  • M5StickC - $25 on Amazon
  • Male 8-pin header - $1 at Parts store or salvaged
  • Round Force-Sensitive Resistor (FSR sensor) - $7 on Adafruit
  • 10k Ohm Resistor - $0.50 at Parts store or salvaged

Overall, it should cost you less than $40 to build.

It is highly recommended that you have the following supplies:

  • Wire Strippers/Cutter
  • Soldering iron w/ solder
  • Tweezers
  • Hot glue or UV glue (to isolate connections)
  • A piece of large heat-shrink (to protect the circuit)

Step 2: Wiring and Schematic

The assembly will take anywhere from 15 mins to an hour, depending on your skill with soldering. Place the M5StickC on its back. Be careful when soldering and do not overheat the header pins or the FSR sensor or you might melt its terminals.


  1. Insert the header pins into the top of the M5StickC.
  2. Lay the 10k ohm resistor across Gnd and G36. Solder it.
  3. Cut the G0 and BAT terminals using your wire snippers. We don't need them. Put hot glue or UV glue on top.
  4. Solder one terminal of the FSR sensor to the 3V3 pin.
  5. Solder the other terminal of the FSR to the G36 pin.
  6. Put a large piece of heat-shrink on top of the circuit to protect your connections.

Step 3: Upload Firmware

Now that your hardware is prepared, you will need to upload the firmware to get the project working. Since this project involves the M5StickC, you will need to make sure you have the M5Stick library. Also, we will be using the OneButton library to handle button press events. Make sure you have both libraries installed. Also, make sure you have the M5StickC board profile by using the Arduino IDE "Board Manager".

Explanation of code for those technically inclined:

  • The M5Stick library included because we are using the M5.LCD commands to show objects on the display.
  • On the display, we plan to have a couple of text items, a custom progress bar to show the FSR, and a few icons that get drawn on the display to guide the user when leveling.
  • The OneButton library is included because we want to handle button events in an organized and scalable manner. In the future, DoubleClick events can be used for additional functions.
  • We are using EEPROM to store a calibrated setpoint integer between 0-127. This number is retrieved during the powering up of the device. A "tick mark" is shown on the progress bar to indicate the setpoint.
  • A "rainbow style" progress bar is drawn. A function is written to visually show the pressure applied to the FSR. The progress bar takes values from 0-127.
  • To recognize whether the print bed is leveled, a function to calculate percent error is written. In this function, we provide the setpoint as the exact value and the current pressure reading as the actual value. If the percent error falls below a threshold (typically set between 5-8%) then the device considers the print bed as leveled.
  • When the print bed is leveled, the LED is lit and a "thumbs up" icon is shown. When the print bed has a percent error beyond the threshold, the appropriate icon (clockwise or counterclockwise) is shown to assist the user in adjusting the print bed screws until it becomes leveled.
  • When the user presses Button A (large button), the device takes the current pressure reading, sets that as the setpoint, and stores the value in the EEPROM. This value gets restored when the device is power cycled on and off.
  • When the user presses Button B (right-side button), the M5Stick powers itself off.

Download my code on Github:

Step 4: Calibration and Test

Now that you've uploaded the code to the microcontroller, let's test it. Unfortunately, you will have to manually level your 3D printer by hand one more time. Hopefully, it's the last time!

Then follow these instructions to calibrate your device:

  1. Home the XYZ axes of your 3D Printer. Power off the stepper motors.
  2. Move the extruder to any area of your 3D print bed. Insert the FSR sensor between the nozzle and print bed.
  3. Hold the M5Stick by hand and press Button A (the large button).

Quick tip: Do not place your M5Stick on the print bed when doing the calibration. When you push the button, you would be also pushing on the print bed, and that will affect the FSR reading.

At this point, the red LED should be lit. You've calibrated your device and it's ready to use!

Step 5: Usage

This is how you would level your 3D printer:

  1. To turn on the M5Stick, push the power button on the left side (might be obvious by now).
  2. Home the XYZ axes of your 3D printer.
  3. Insert the FSR sensor between the nozzle and the print bed.
  4. Look at the icon shown. If you see "thumbs up" with an LED, it is leveled. Otherwise, turn your bed screw in the clockwise/counterclockwise direction indicated by the icon.
  5. Repeat steps 3 and 4 until all the corners of your print bed light up.

Remember to turn off your device afterward by pressing the right-side button.

Let me know if you have any comments, questions, or suggestions. In the future, I may offer an assembled version of this project on Tindie. PM me if you are interested to get one. I would be happy to hear from you!

Anything Goes Contest

Participated in the
Anything Goes Contest