SkillAgentSearch skills...

Epdiy

EPDiy is a driver board for affordable e-Paper (or E-ink) displays.

Install / Use

/learn @vroland/Epdiy
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

Documentation Status Matrix JoinSlack

EPDiy E-Paper Driver

EPDiy is a driver board which talks to affordable E-Paper (or E-Ink) screens, which are usually sold as replacement screens for E-Book readers. Why are they interesting?

  • Easy on the eyes and paper-like aesthetics
  • No power consumption when not updating
  • Sunlight-readable

Ready-made DIY modules for this size and with 4bpp (16 Grayscale) color support are currently quite expensive and / or slow. The EPDiy controller can drive the bare display modules, e.g. from old e-Readers, which are available for 20$ (small) / 30$ (large) on ebay! Additionally, since it is based on the ESP32S3 (V7) / ESP32 (V2-V6) microcontroller, it features WiFi and Bluetooth connectivity.

The EPDiy driver board targets a range of E-Paper displays, as shown in the table below. As the driving method for all matrix-based E-ink displays is more or less the same, only the right connector and timings are needed. The current V7 board has three different display connectors, other display will require an adapter board.

The controller is optimized for the use with LiPo batteries, featuring a LiPo charger and ultra-low deep sleep current.

This project supports a driver for the ESP-IDF and Arduino. For installation instructions, please refer to the documentation. Note that for epdiy V7, update speeds are significantly lower when using the Arduino IDE, because it does not allow to change the sub-optimal cache configuration.

Get Inspired

The examples directory contains some example applications like a weather station or a screen diagnostic test. If you want to build something more useful though, how about:

  • A serial terminal for connecting to a raspberry pi: video repository]
  • A Music Player Daemon (MPD) dashboard: repository]
  • An e-Paper picture frame: video
  • And more to come!

Building It

On the EPDiy Hardware Page, you'll find a list of all boards and variants, adapters, and helpers. Next to each board, there are manufacturing files (gerbers), Bill of Materials (BoM), part placement files, and 3D models ready to use!

demo image

For ordering from JLCPCB for example, ordering is as easy as downloading the zipped gerbers, BoM, and placement file and uploading them. The process is very similar for other manufacturers, check your vendor's documentation for details. Don't forget to oder adapters if the board doesn't have connectors for your specific display.

The current latest version is epdiy V7, beased on the ESP32S3. Older versions are also available on the hardware page.

Contributing Hardware

Want to contribute your own board variant or adapter? Check out the epdiy-hardware repository for instructions.

Gettings Started

For instructions and more information visit the documentation!

Join the Discussion

  • Matrix Matrix Community: +epdiy:matrix.vroland.de
  • Slack: See badge

Displays

|Name |Size |Resolution|Compatible|Connector|Pin count|Compatible since pcb version|Notes | --: | --: | --: | --: | --: | --: | --: | --: | | ED060SC4 | 6" | 800 x 600<br>167 PPI | yes, tested | FH26W-39S-0.3SHW(60) | 39 | v2 | | |ED097OC4|9.7"|1200 x 825<br>150 PPI|yes, tested|XF2M-3315-1A|33|v2|Cheap, inferior contrast |ED097TC2|9.7"|1200 x 825<br>150 PPI|yes, tested|XF2M-3315-1A|33|v2|Slightly higher price, better contrast |ED097OC1|9.7"|1200 x 825<br>150 PPI|yes (should work)|XF2M-3315-1A|33|v2|Cheap, inferior performance |ED047TC1|4.7"|960 x 540<br>234 PPI|yes, tested|40-pin|40|LILYGO 4.7" EPD|Supported only by 4.7" e-paper board by LILYGO | ED050SC5 | 5" | 600 x 800<br>200 PPI | yes, tested | THD0510-33CL-GF | 33 | v5 | | ED050SC3 | 5" | 600 x 800<br>200 PPI | yes (should work) | THD0510-33CL-GF | 33 | v5 | | ED052TC4 | 5.2" | 1280 x 780<br>??? PPI | yes (should work) | WP27D-P050VA3 | 50 | v5 | | ED133UT2 | 13.3" | 1600 x 1200<br>150 PPI | yes, tested | adapter board | 39 | v2 | Adapter Board required, also PENG133D | ED060XC3 | 6" | 758 x 1024<br>212 PPI | yes, tested | THD0515-34CL-SN | 34 | v5 | Cheapest, good contrast and resolution | ED060XD4 | 6" | 758 x 1024<br>212 PPI | yes, tested | THD0515-34CL-SN | 34 | v5 | | ED060XC5 | 6" | 758 x 1024<br>212 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 | | ED060XD6 | 6" | 758 x 1024<br>212 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 | | ED060XH2 | 6" | 758 x 1024<br>212 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 | | ED060XC9 | 6" | 758 x 1024<br>212 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 | | ED060KD1 | 6" | 1072 x 1448<br>300 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 | | ED060KC1 | 6" | 1072 x 1448<br>300 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 | | ED060SCF | 6" | 600 x 800<br>167 PPI | yes, tested | THD0515-34CL-SN | 34 | v5 | Different flex cable shape | ED060SCN | 6" | 600 x 800<br>167 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 | Different flex cable shape | ED060SCP | 6" | 600 x 800<br>167 PPI | yes (should work as ED060XC3) | THD0515-34CL-SN | 34 | v5 | Different flex cable shape | ED060SC7 | 6" | 600 x 800<br>167 PPI | yes (should work) | AXT334124 | 34 | v5 | connector dropped in v6 | ED060SCG | 6" | 600 x 800<br>167 PPI | yes (should work) | AXT334124 | 34 | v5 | connector dropped in v6 | ED060SCE | 6" | 600 x 800<br>167 PPI | yes (should work) | AXT334124 | 34 | v5 | connector dropped in v6 | ED060SCM | 6" | 600 x 800<br>167 PPI | yes (should work) | AXT334124 | 34 | v5 | connector dropped in v6 | ED060SCT | 6" | 600 x 800<br>167 PPI | yes, tested | AXT334124 | 34 | v5 | connector dropped in v6 | ED078KC1 | 7.8" | 1872 x 1404<br>300 PPI | yes, tested | FH12-40S-0.5SH | 40 | v7 | 16 data lines

Troubleshooting

The following list is compiled from past experiences and GitHub issues:

  • The displayed image displays only part of the image. Make sure to select the correct display type as described here.
  • The existing image fades / darkens when updating a partial screen region. Make sure the VCOM voltage is calibrated for your specific display.
  • The second third of the image is replaced with the last third. This seems to be a timing issue we could not yet quite figure out the reason for. For a workarround or suggestions please join the discussion.
  • The ESP does not boot correctly when external periperals are connected. Make sure not to pull GPIO12 high during boot, as it is a strapping pin internal voltage selection (https://github.com/vroland/epdiy/issues/17).
  • The ESP power consumption in deep sleep is too high. Add rtc_gpio_isolate(GPIO_NUM_12); to your solution. See also Configuring IOs (Deep-sleep Only).

LilyGo Boards

Supported LilyGo Boards

| Board | Display | Board Definition | Notes | | --: | --: | --: | --: | | LilyGo T5 4.7" | ED047TC1 | epd_board_lilygo_t5_47 | Original T5 4.7" | | LilyGo T5 S3 E-Paper Pro | ED047TC1 | epd_board_v7 | ESP32-S3 based, includes GT911 touch, PCF8563 RTC, BQ25896/BQ27220 battery management |

Power Management

There are several differences with these boards. One particular one is the way the LilyGo handles power to the display the official lilygo code has two states. This is now handled in epdiy in a different way to the lilygo code. epd_poweroff() completely turns the power off to the display and the other peripherals of the lilygo. The new function epd_powerdown() keeps the peripherals on (this allows the touch functions to continue to work). epd_poweroff() should always be called before sleeping the system You can still use touch to wake the screen with the following. In Arduino it works like this. epd_poweroff();

epd_deinit();

esp_sleep_enable_ext1_wakeup(GPIO_SEL_13, ESP_EXT1_WAKEUP_ANY_HIGH);

esp_deep_sleep_start();

I2C Bus Sharing (Arduino)

When using epdiy with Arduino on boards like the T5 S3 E-Paper Pro, you may need to share the I2C bus between epdiy and other peripherals (touch controller, RTC, battery gauge, etc.).

Epdiy's board initialization will detect if the I2C driver is already installed (e.g., by Arduino's Wire.begin()) and reuse the existing driver instead of failing. This allows you to:

  1. Call Wire.begin(SDA, SCL) before epd_init() to initialize the I2C bus
  2. Use Wire for other I2C

Related Skills

View on GitHub
GitHub Stars1.8k
CategoryDevelopment
Updated22h ago
Forks245

Languages

C

Security Score

95/100

Audited on Mar 23, 2026

No findings