9.7" epaper breakout (Kindle DX screen)

I always wanted a large, affordable E-Ink screen to play around with. The result is a board to talk to a Kindle DX screen with an ESP32.

Similar projects worth following
A breakout board for the ED097OC4 9.7" ePaper (or E-Ink) display. ePaper is a fascinating technology for low-power and pleasant-to-look-at screens. However, ready-made DIY modules for this size and with 4bpp (16 Grayscale) color support are currently quite expensive.

This project uses Kindle DX replacement screens, which are available for 30$ on ebay, making tinkering with those screens much more affordable.

Displayed image By David REVOY -, CC BY 3.0, Link

Build it!

KiCad-Project, Gerber files and firmware can be found on github:


  • 4bpp (16 color) output in ~2 seconds (at 1200x825 resolution)
  • Simple, 2 layer PCB with all components on front
  • Broken out I2C and sensor pins

Thanks to:

Thanks to the work of some awesome people, the hard stuff was already done:


A print of the PCB layout.

Adobe Portable Document Format - 168.86 kB - 11/01/2019 at 11:12



The board schematic.

Adobe Portable Document Format - 84.94 kB - 11/01/2019 at 11:12



A short demo video.

MPEG-4 Video - 41.19 MB - 11/01/2019 at 10:27



Gif of the demo video.

Graphics Interchange Format - 9.67 MB - 11/01/2019 at 10:22


  • Font Rendering and Partial Drawing

    Valentin11/18/2019 at 21:44 0 comments

    Now, finally I implemented what these displays where originally designed for: displaying text. Unfortunately, the ESP32 does not have enough RAM for a real frame buffer (maybe a version 2 will use a module with PSRAM). So, I have to resort to partial refresh / drawing. 

    For the image shown above, I first displayed a full-screen grayscale image as usual. Then, I cleared the middle area and proceeded to draw the text line-by-line. If you screen content does not need to be updated often, this should suffice. Otherwise, you can always stream frames via wifi.

    For my tests I used the latin1 character set and the Fira Sans font, however, this is completely customizable.

  • ESP32 timing

    Valentin11/01/2019 at 11:32 0 comments

    Hello World! Finally, the project is ready to go public. If you have any ideas, improvements or comments to share, feel free!

    During the last days, I struggled a bit with getting the timing for the gray scale output right. Each row has to be activated for a only a few microseconds to only dim it slightly. While this worked most of the time, sometimes, the code took much longer, resulting in dark horizontal stripes. Debugging this was quite a journey, since I was new to the ESP32:

    • Coming from the world of Arduino, having a real-time OS running on the chip was new. Disabling interrupts during the critical sections helped, the fact that the noInterrupts() function of the Arduino framework for the ESP32 is just a dummy did not.
    • At this point, most bad stipes where gone, but timing was still somewhat irregular, even when using the hardware timer. I thought using hardware timer interrupts is as good as it gets when trying to do exact timing, but apparently I was wrong. If someone has an idea why this could be, please tell me!
    • Finally, tagging the critical function with IRAM_ATTR and busy waiting for a set number of CPU cycles did the trick.

    Busy waiting does not seem like the most elegant solution, but it works. Refresh times are now at about 2 seconds for a gull grayscale image of 1200x825 pixels. If I could manage to already shift in new data while waiting for the current row to fade, this could be even faster. I'll have to try some things :) 

View all 2 project logs

Enjoy this project?



Similar Projects

Does this project spark your interest?

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