Waveshare e-paper displays with SPI

I’m using ESP32 (LilyGo) with epaper display and external DAC (PCM5102A).
Display is driven by GxEPD lib, sound by ESP32-audioI2S lib.
I get no sound while calling display update.
Same time when I call display update I get text over text issue (previously displayed text is not cleared).
Anyone has same issue or/and solution for it?

Oh, that was a surprisingly fast reply, thank you! Do you think that should/need to use paged drawing on an esp32 or esp8266 or is display.display(false); enough?

Also, I saw that you were talking to someone else a few posts above about his board having a special reset circuit. I also have a 4,2-inch Waveshare screen with spi as the guy you talked with. How do I know if my screen has this special reset circuit? Will it just not work, is there a specific version of the screen or is there a specific component on the screen I should look for?

If you use the constructor with full height for page_height, the compiler will complain if it doesn’t fit in ram.

The actual version will have the “clever” reset circuit. Take a look at the schematics.

Awesome, thank you!

Hi Jean Marc, have ESP32 dev board and waveshare 1,54 200x200 epaper.
In Arduino 1.8.13 cannot compile the minimum example from your library, got these error message
C:\Users\VR\CloudStation\Arduino\libraries\Adafruit_BusIO\Adafruit_SPIDevice.cpp: In member function ‘void Adafruit_SPIDevice::transfer(uint8_t*, size_t)’:
C:\Users\VR\CloudStation\Arduino\libraries\Adafruit_BusIO\Adafruit_SPIDevice.cpp:133:31: error: no matching function for call to ‘SPIClass::transfer(uint8_t*&, size_t&)’
_spi->transfer(buffer, len);
In file included from C:\Users\VR\CloudStation\Arduino\libraries\Adafruit_BusIO/Adafruit_SPIDevice.h:1:0,
from C:\Users\VR\CloudStation\Arduino\libraries\Adafruit_BusIO\Adafruit_SPIDevice.cpp:1:
C:\Users\VR\CloudStation\Arduino\hardware\espressif\esp32\libraries\SPI\src/SPI.h:67:13: note: candidate: uint8_t SPIClass::transfer(uint8_t)
uint8_t transfer(uint8_t data);
C:\Users\VR\CloudStation\Arduino\hardware\espressif\esp32\libraries\SPI\src/SPI.h:67:13: note: candidate expects 1 argument, 2 provided
exit status 1
Nastala chyba při kompilaci u desky ESP32 Dev Module.

All libraries are up to date… any advice?
Thank you

@VasekR, Hi, welcome to the forum! I hope you already read How to get the best out of this forum.

All libraries are up to date… any advice?

No, not really. I avoided to update dependent libraries when updating Adafruit_GFX recently.
Maybe that is why I still can compile. Adafruit_GFX updates and dependencies are a nightmare.


Version 1.3.2 of library GxEPD2 is available, install with Library Manager.

  • added support for GDEW0213T5D 104x212 b/w e-paper panel
  • added support for GDEW029T5D 128x296 b/w e-paper panel
  • added support for GDEW0213Z19 104x212 b/w/r e-paper panel
  • added support for GDEW029Z13 128x296 b/w/r e-paper panel
  • both GDEW0213Z19 and GDEW029Z13 support only full screen refresh (controller issue)


Hello, I have been playing around with your library and so far I have to say that you have done an excellent job!

However in my project I want to display some large numbers on the screen. I am currently using one of the 24pt fonts included with the library and since it’s to small I also added the setTextSize(2) function which makes my text rougly the size I want. However when doubling the 24pt font it makes the text very blocky. I assume that the library doesn’t have a function to smooth the text so I guess I need a larger font. Do you know if there is a font available larger than 24 pt? Preferebly a 48pt freeSans font. Thanks!

I would like to answer without going to spend much time searching. But with the new forum my saved links don’t work anymore, or not exactly. So I only can tell you what to look for:

You can create your own fonts using the squix font converter.

You can use fonts from U8G2. GxEPD2 has an example for this.

Thank you. I actually managed to solve it myself. I don’t know if you have heard about it but I found an awesome online tool called truetype2gfx https://rop.nl/truetype2gfx/

What it does is lets you choose a font either FreeSans, FreeSerif or FreeMono (you can also upload your own). Then you set the font size you want and then it automatically creates a .h adafruit gfx font file that you can then download and use with your library.

Version 3.1.1 of library GxEPD is available, install with Library Manager.

  • added support for GDEM029T94 2.9" b/w, actual Waveshare 2.9" b/w
  • updated example GxEPD_WiFi_Example, for actual GitHub certificate

This panel has been reported to be used on the actual Waveshare 2.9" b/w board.
But I don't have this Waveshare board, so I can't check and test with.


BTW: forum, please accept that I update both of my main topics with this information!

Version 1.3.3 of library GxEPD2 is available, install with Library Manager.

  • added b/w differential refresh method to GDEW0213Z19
  • added b/w differential refresh method to GDEW029Z13
  • up to 100 b/w fast refreshes have been possible (resulting in slightly reddish background)
  • added experimental example GxEPD2x_MixedTest for proof of concept
  • GxEPD2x_MixedTest needs enough RAM for 2 GFXCanvas1 objects
  • general 3-color mixed refresh in GxEPD2 is in evaluation, for capable panels

I did not believe b/w fast partial update (differential refresh) would be possible for 3-color displays.

But the donator of these two panels, John Hawley, provided this link:

and the demo code he obtained from Good Display.

So I learned these e-paper displays can do new tricks, and I started to add them to GxEPD2.

Thanks John!


Hello Jean-Marc,

I had the same problem as @vanilla_chief and @allllo with my display. After accidentally destroying the screen of my old display, I ordered a new display and as mentioned it is "V2". By changing to the other line (GxEPD2_BW<GxEPD2_290_T94, MAX_HEIGHT(GxEPD2_290_T94)> display(GxEPD2_290_T94(/CS=53/ SS, /DC=/ 8, /RST=/ 9, /BUSY=/ 7)); // GDEM029T94) the display works, but my current problem is by normal updating the display. At the beginning, the display is quite dim, but recovers to a readable level after a few seconds. This was never the case with my old display, is there a tip how I can solve this weird behaviour?

I know that the change to GDEM029T94 from GDEH029A1 is only temporary:

Thanks in advance.


did you replace the Waveshare board, or the panel on the Waveshare board?

I know that the change to GDEM029T94 from GDEH029A1 is only temporary:

I don't know what you mean by this.
Ok, I know that any board from Waveshare will be changed over time!

I have exchanged the complete Waveshare board, only the plug included in the delivery is used again from my old display.

I was referring to the statement that there may be an adaptation for this type of display in the future.

I have no idea. My panel connected to the DESPI-C02 doesn't show this effect.
I don't have that Waveshare board.
It may be caused by the LDO or by the level converter, or by the "clever" reset circuit.

You could report the processor you use and the voltage you supply to the board on VCC,

It is connected directly via cable to the Joy-it MEGA 2560 (Atmega2560) and the recommended wiring, and it only happens with the new display.With the old display it worked fine with the same setup (power supply 5V), I wanted to exchange the displays 1 to 1 after the damage and that's how I came to this post.

It's strange that after a few updates the display reaches full strength, and after switching it off the contrast drops again slightly. But the initial state is actually not cool :confused:

Sometimes an improvement ("V2") doesn't seem to be better after all....


there may be a difference between the booster circuit of the board and the booster circuit in the panel specs.

If enough users recommend to Waveshare that they should provide me with a free sample, then one day I may be able to analyze these issues. But I am not willing to buy this board.

Or is it possible that there is a problem like you explained in this post:

At the very beginning, the display updates everything completely during init, after that I have the feeling that it is interrupted when building up the contrast.

Post diagnostic output, in a code window please.