A lightweight ATMega328p based information display panel thingie for RepRap firmware based 3D Printers; specifically the Duet controller.

Similar projects worth following
This is somewhat of a Parts bin special; I wanted to add some sort of temperature feedback to my DuetWifi controlled 3D printer; it's Wifi interface is great but I got fed up with not being able to see the status at a glance while prepping the machine.

This unit plugs directly into the UART (panelDue) connector on my controller, it runs at 5V from the supply on the connector; and has simple mosfet level converters on the serial port to cope with the 3.3V controller used by the Duet.


This is a low cost and lightweight temperature and status monitor for 3d Printers using Duet (or other repRap Firmware) controllers.

The Controller connects to the PanelDue serial port on the Duet card, and periodically queries the Duet Firmware for It's status and temperatures, then updates it's display as appropriate.

  • Atmega328P based (as per the Arduino Uno)
  • 2 x 0.96' OLED displays on individual I2C busses
  • Level Shifter for Serial connections (duet is 3.3v, 328p is 5v)
  • A button for pausing, a LED to show we are alive and a case to show off
  • All the software is complete and tested, this was more than half the work..
  • I include the full KiCad project, exported Gerber Files and more.
  • The compact single-sided PCB is optimised for home production with a CNC or chemicals. It has generous pads, tracks and clearance widths.
  • I do not provide detailed build instructions; You need to be confident you can do things like 3d print cases and make PCB's if you wish to follow this project. All the sources are provided but none of the technique ;-)

The two OLED display panels have fixed I2C addresses which conflict; so I create two separate I2C busses on the controller in software to drive them independently. 

The completed project:

  • Only displays very basic info: Status, tool and bed status + temperatures, percentage printed.
  • Periodically sends M408 S0 status requests to the controller and processes the Json reply to obtain values.
  • Responds to some 'config' Json for update speed, brightness, timeouts and more
  • Sleep mode when controller reports PSU off, (configurable).
  • Activity LED and Pause button are fully configurable.
  • Clearly shows when heaters are in a fault state.
  • Plug-n-play with panelDue UART port, powered by the port itself.


Project time was spent mostly in developing the Software; this was the most challenging part of the equation for me; I learned a lot doing this, which was the whole point of the exercise.

Please read the README file in the software repo for a proper description, requirements and documentation

I developed using the Arduino IDE and programmed the prototype via a FTDI adapter while testing using the serial terminal. The project was nearly complete before it was ever connected to my Duet controller. And when I did that, it worked first time :-)


In the release packages and Github repo I have provided the Full KICad project I created; including custom component and footprint definitions for the OLED displays.

The ATMega sits on a standalone PCB; it has a very 'vanilla' crystal and reset circuit; the OLED displays are driven directly, they already have appropriate pullup resistors onboard. The RX/TX serial lines go through a very basic bidirectional 3.3v level converter for compatibility with the Duet controller.

The UART port on the Duet controller provides a 5v power supply; and I designed the PCB with a FTDI connector facilitating in-place reprogramming with any suitable programmer. The Duet is connected via the same connector using an appropriate cable to bring power and serial comms.


Gerber files for the single-sided PCB are included in the Hardware Repo

  • There are three bridges that need to be placed on the top side.
  • The FTDI connector needs to be placed on the reverse (copper) side of the PCB.
  • The PCB is optimised for Home CNC fabrication, using a vcutter for isolation and a mill bit or drills for the holes.  All pads, track widths and clearances are generous.


The included case is designed to have the OLED panels glued in place. The PCB then mounts onto their connectors.

  • Glue it lightly! I used generic contact...
Read more »


V2.0 Software

gzip - 313.88 kB - 12/09/2019 at 15:43


V2.0 Software in zip format

Zip Archive - 314.49 kB - 12/09/2019 at 15:43



PDF version of the schematic

Adobe Portable Document Format - 40.50 kB - 09/18/2019 at 10:38


gzip - 3.25 MB - 09/18/2019 at 09:55


Zip Archive - 3.25 MB - 09/18/2019 at 09:55


View all 7 files

  • 1 × ATmega328-PU Microprocessors, Microcontrollers, DSPs / ARM, RISC-Based Microcontrollers
  • 2 × 0.96' I2C OLED (Mine are marked GM009605v4) SSD1315_I2C_OLED
  • 1 × 16MHz Crystal HC49-4H_Vertical Two pin crystal
  • 2 × 2N7000 MOSFET N-Channel MOSFET, 2.6V Logic Level, TO-92
  • 4 × 10K Resistor

View all 9 components

  • V2.0 - Octoprint friendlier

    Owen12/09/2019 at 15:45 0 comments

    Updated to improve support for OctoPrint use

    The pe_lmsg and pe_rmsg commands have been superseded by pe_imsg, which takes up to 20 characters and will be displayed split 10 chars left/right as appropriate, or just the first 10 characters on the right in 'busy' mode.

    A new control pe_bcfg has been added to control how the button behaves; giving options for M112 (reset/emergency stop) and other uses. As well as Octoprint-friendly pause/resume in busy/idle states.

    See the README for more, it has been updated with the new commands and an example of how to get progress display from Slic3r. Getting 'native' OctoPrint progress display is tricky and I really need to write a plugin to handle that.

    The code is a bit smaller too thanks to some refactoring and learning to better use progmem for fixed string functions.

  • v2.0, Button and Octoprint, coming

    Owen11/23/2019 at 13:32 0 comments

    I've finished work on a v2.0-dev branch to add more button functions, resets and sending OctoPrint action commands for pause/resume. Plus changes to how the arbitrary text system works. Hopefully I can get progress monitoring from OctoPrint working too.

    I even reduced code size and memory use 👍

    It builds, but is completely untested.. I'll test it soon and publish once I have worked the OctoPrint setup out..  

  • Exposed!

    Owen10/04/2019 at 01:04 0 comments

    Got some exposure! here and in the Duet forum.
    Thanks to everybody for dropping by, and thanks for the comments here and elsewhere. Much appreciated!

  • One week in

    Owen09/18/2019 at 19:14 0 comments

    Fitted to my Printer and powered for a whole week now, I'm pleased to say it's still working, responding, not hot or crashing . I'm also happy with the functionality, no software changes occur to me.

View all 4 project logs

  • 1

    I Use a FTDI Friend for programming this; it plugs directly into the same connector as the Duet cable; and allows in-circuit programming and serial debugging.

    The ATMega runs the Optiboot bootloader; this is the standard loader used in the Uno etc.

    During development I found I had to set the FTDI to 5v mode to get the reset pin triggering correctly to force programming mode.  This is not a problem for the 3.3v level converters; they still pass the serial signal properly. 

    There are ways of using Arduino Uno, Deci etc boards to simulate the FTDI friend by removing or disabling their CPU and then connecting the RX, TX and RST lines from the board to the relevant lines on the FTDI connector. (note: the CTS line is not needed/used/connected)

View all instructions

Enjoy this project?



vnjhfgv wrote 07/05/2020 at 14:21 point

Hello, creator! When I finished the project, I encountered a problem and displayed the interface, but unfortunately it always showed 0. I don’t know if I didn’t do something right!

  Are you sure? yes | no

Mike Szczys wrote 10/02/2019 at 17:08 point

Nice display panel! I like the idea of having a dedicated readout.

On the back of the OLED modules are there a couple of resistors for setting I2C address? Usually there are 2-bits so you can have four different OLEDs on the same bus. I suppose it's possible the module didn't break out those pins but often it's just unpopulated resistor pads.

  Are you sure? yes | no

Owen wrote 10/04/2019 at 00:41 point

No. First thing I checked of course. I even did a brief search in case I was missing something but it turns out this is common with these 0.96 inch units (unlike the ubiquitous 1.3' units I have in ESP printermonitors, which all have two addresses selectable). 

They do have R0 jumpers and pads to swap VCC and 0V over,  I guess that is handy for system integrators as a supply option but I didnt need/want to mess with that, 

edit: I just made this a better reply. For reference the displays I use are marked: GM009605v4

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates