3D Printer Monitor Wemos D1 Mini ESP8266





Introduction: 3D Printer Monitor Wemos D1 Mini ESP8266

About: I enjoy flying RC and 3D Printing

Monitor your 3D printer over a wifi connection. This is a Wemos D1 Mini and a 128x64 OLED combined together to display the status from your OctoPrint Server.

Requires the following:


  • Displays the print status from OctoPrint Server
  • Estimated time remaining
  • Time Printing
  • Percentage complete
  • Progress bar
  • Bed and Tool Temperature
  • Screen turns off when printer is turned off or disconnected
  • Screen turns on when printer is Operational or connected
  • Option to display clock instead of sleep mode
  • Sample rate is every 60 seconds when not printing
  • Sample rate is every 10 seconds when printing
  • Fully configurable from the web interface (not required to update Settings.h)
  • Supports OTA (loading firmware over WiFi connection on same LAN)
  • Basic Athentication to protect your settings
  • Video: https://youtu.be/niRv9SCgAPk
  • Detailed build video by Chris Riley: https://youtu.be/Rm-l1FSuJpI

Step 1: Solder Up the Wemos D1 Mini With the 128x64 I2C OLED Display

This step only requires connecting 4 wires between the Wemos D1 Mini and the OLED display.

  • SDA -> D2
  • SCL -> D5
  • VCC -> 5V+
  • GND -> GND-

Step 2: 3D Print a Case for Your 3D Printer Monitor

Since you are monitoring a 3D printer, you probably have the means to print the case for this project or create your own. My design is posted on Thingiverse.com here:


Fit your Wemos and OLED in the case. You may need to apply some glue to the outer corners of the OLED display to get it to stick into the case. The Wemos will be held into the case by the back panel.

Step 3: Download and Compile Source Code

It is recommended to use Arduino IDE. You will need to configure Arduino IDE to work with the Wemos board and USB port and installed the required USB drivers etc.

  • USB CH340G drivers: https://wiki.wemos.cc/downloads
  • Open the Arduino IDE and enter the following URL http://arduino.esp8266.com/stable/package_esp8266com_index.json into Additional Board Manager URLs field. You can add multiple URLs, separating them with commas. This will add support for the Wemos D1 Mini to Arduino IDE.
  • In the Arduino IDE, open Boards Manager from Tools > Board menu and install esp8266 platform (and don't forget to select your ESP8266 board from Tools > Board menu after installation).
  • Select Board: "WeMos D1 R2 & mini"

Download the Source Code for 3D Printer Monitor:



The following packages and libraries are used (download and install to your Arduino IDE):

Initial Configuration
You can update the project Settings.h file with your OctoPrint API Key or do it from the web interface. Get your OctoPrint API Key from your OctoPrint -> User Settings -> Current API Key.

NOTE: The settings in the Settings.h are the default settings for the first loading. After loading you will manage changes to the settings via the Web Interface. If you want to change settings again in the settings.h, you will need to erase the file system on the Wemos or use the “Reset Settings” option in the Web Interface.

Step 4: Web Interface

The Printer Monitor uses the WiFiManager so when it can't find the last network it was connected to it will become a AP Hotspot -- connect to it with your phone and you can then enter your WiFi connection information.

After connected to your WiFi network it will display the IP addressed assigned to it and that can be used to open a browser to the Web Interface. Everything can be configured there in the web interface.



    • Creative Misuse Contest

      Creative Misuse Contest
    • Clocks Contest

      Clocks Contest
    • Oil Contest

      Oil Contest

    32 Discussions

    Many thanks

    The project is very nice and I have successfully completed it.
    I asked if it was possible to insert a small buzzer that warns a few minutes before the end of the print.

    Hello David,

    This is a very cool project.

    I have an octoprint with 2 instances

    port 80

    port 5001

    The printer monitor will not allow me to change the port to 80. When I open the config tab, it's already listed as port 5001, and it always defaults back to 5001 after a save. Then I get the following - Error: Response: HTTP/1.1 403 FORBIDDEN

    Note: If I setup the API for port 5001, it does work.

    Any ideas?


    David Ewen

    2 more answers

    Try removing the hostname -- the code goes and resolves the port from the name. If you leave the hostname blank then it should keep the port and IP you specify. Give that a try.


    Thanks, that did the trick!

    Hi i have build it but can`t acces the wemos by http: and IP Adress it`s pingable on the IPadress but i can`t acces for the printer settings, can you help me out here :-). O with IE and Firefox it will not work or by Phone.

    PLEASE can someone help me out here it dit work for 10 minutes but its still rebooting and ask to go to ip for the settings i reload the sketch and set the AP again but still no live in display.

    This is all i get
    See picture.

    1 reply

    It looks like it is crashing before fully starting up or when you are connecting. Also, not sure if you removed the weatherAPI key or if you didn't provide one.

    Hi, great project. I followed your instructable but my display is not updating. It shows everything exept for the time. When i save the configuration the display is updated but then it show only this information and does'nt update the information. Any idea??

    2 more answers


    i tried your solution. Firstly, when i uploaded the modified code, it works, but after i uplugged the power, shutted down the octoprint server, and wemos powered again, i saw just constans information, about the octoprint server status, becouse the update timing isn't working again.

    Any idea?

    Hi, very nice project! I'm building one for my octoprint. I couldn't find the city ID for the weather service. Where I can find it?

    thank you very much!


    1 reply

    Is anyone else seeing the error

    "no matching function for call to 'base64:encode(String&, bool)' " ?

    It seems to have a problem with the line:

    encodedAuth = b64.encode(userpass, true);

    It thinks there is some other b64.encode function:

    static String encode(uint8_t * data, size_t length);

    And therefore won't compile. I was able to get around this by deleting the 'true' that is passed in with the function, however, that only led to a million more compiling errors. My hunch is that it is not including the right files, does anyone have any suggestions?

    I have now tried this on two different computers (Mac and Windows) as well as well Arduino IDE 1.8.3, 1.8.4, and 1.8.5.


    2 replies

    The base64 is part of the ESP8266 core -- so you just need to update the ESP8266 core.

    Never mind!

    Took a little more troubleshooting but it turned out my ESP8266 board manager library was out of date even though it told me it was "up to date".

    To anyone else who comes across this problem, all I had to do was delete the ESP8266 folder containing the hardware and library folders, which was a bit hard to locate, but it should be in Arduino/packages/esp8266, just delete the whole esp8266 folder and reinstall board manager.

    DetalhesHello, how and what to install to use in the mega arduino 2560, because it is what my 3d printer uses. I still do not quite understand the arduino. Thanks

    1 more answer

    The software requires an ESP8266 (Arduino) that has WiFi built on it. It also requires OctoPrint (usually a Raspberry Pi) running with your printer. The Arduino code then uses the OctoPrint REST API services to get the current printing data over a Wifi connection.

    Hi. Awesome project. But is it possible to add a button to cycle the display? And is it possible for faster refresh rate(update every 1 minute)?

    Uten navn.png
    1 more answer

    The code is open for you. You could easily add a button function -- though it is not currently in my plan for the official release. As for the refresh rate... when the printer is offline -- it checks every 60 seconds on a change. When it is online -- it checks every 10 seconds. Not sure what you mean by the 1 minute. The "Time Refresh" -- is only how often it checks and resets the clock with the internet time.

    Thanks for the heads up. I updated the display text.