Waveshare e-paper displays with SPI

Be careful with your remarks, if you want further responses. The example uses refresh every second on the 1.5" display.

Very clear to me

Very clear to me you spent 4 monthes testing and not 57 years :wink:

I'll make a trial to contact Waveshare and challenge them why Life Panel is no longer specified with Reflesh Cycles.

They are now teasing the market with e-paper demo code demonstrating RTC like displays with 1Hz Partial Refresh.

Is it in "Total"/"Partial"/"not at all" contradiction with effective reliability performance of latest generations of panels ?

I'll post the feedback I'll get if any.
Very interesting techno and subject anyway.

Dear Jean-Marc, hi everyone

I have a Waveshare 5.65 7-color e-Paper on an ESP32 working flawlessly and showing nice pictures from SPIFFS. The WIFI-example (GxEPD2_WiFi_Example) works also well, as long as the images are on the servers used in the example-ino.

However, if I try to display pictures that are on my own server, I connot get the ESP to download/display them.

I tried to extract the correct fingerprint and certificate as described in the code. And I get a valid http-header:

connecting to spar.wunderwald.ch
requesting URL: https://spar.wunderwald.ch/e-Paper/logo200x200.bmp
request sent
HTTP/1.1 200 OK

headers received
Starting to parse received file ...
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
weird bitmap format.

Whenever I read from the client client.read(); or read16(client);, I get -1's.

Is there any way to figure out, what the problem of the connection is so that I cannot read from the connection?

Thank you very much for a hint,

Hi Dani,

If I enter the link into a browser, the file gets downloaded instead of shown.
Same is true if I click on an entry in Index of /e-Paper.
This is different compared to the other links used in my example.
Maybe this is the reason.

No, this is caused by the Microsoft Edge browser.

But I am neither a WiFi, nor network, nor secure communication expert.

Maybe someone else can help.


Thank you, Jean-Marc, for pointing that out. When I copy the links into the address-bar, I get the images in the browser window, so I cannot follow your findings. May I ask if you would deposit one of my bmp-images on your server and try that out? Regards, Dani

No, I don't have a server at hand, and I have no time for this.

See also: Help needed with GxEPD2 Wifi example - Using Arduino / Displays - Arduino Forum

Maybe ask in Latest Using Arduino/Networking, Protocols, and Devices topics - Arduino Forum

Dear Jean Marc,
I'm back to you with a question related to GXePD2 and RAM footprint, near the end to finalize my application I'm a bit short in RAM to code all the feature targeted.

Taking your "GxEPD2_example" demo sketch and selecting GwEPD2_290_T94_V2 display, takes 5528 bytes of RAM, this is significant as compared to the 8K of the MEGA2560.

I realized same demo sketch is compile-able for UNO or even NANO so RAM under such configuration footprint is of only 1592 bytes.

I then changed MAX_DISPLAY_BUFFER_SIZE to 800 onto my original application (instead of 5000 for MEGA2560 ) and I must admit my code is breathing far more smoothly with not any visible compromises to display execution time or any functional side effect, and surely no more risk of stack overflow :wink:

Would you have in mind any side effect or drawback because of this BUFFER SIZE reduction I should particular care about for validating definitively such configuration ?

I could chose intermediate values from 800 to 5000 if prefer-able and safer, but I must admit I have no clue what I manipulate here.

Thanks a lot for your support, this library is definitively awesome and powerful.

And if you have some guidelines or links to share for making the partial refresh Next.Display() function interuptable, this will probably be soon my further area of interest for optimizing application fluidity.

HI ZinggJM,

I am new to this topic and i have waveshare 2.9, 4.2 , 12.48 inch e-paper b&w display i am trying to connect the e-paper display with ESP32 dev module when i try to run the example code.

I was able to compile and run the code for 2.9 and 4.2 inch display. but when i try to the run the same code for 12.48 inch display i could not achieve anything on the screen.

i followed the connection provided in the example for 12.48 and also tried to change the pin according the HW SPI present as show below

GxEPD2_BW < GxEPD2_1248, GxEPD2_1248::HEIGHT / 4 >

display(GxEPD2_1248(/sck=/ 18, /miso=/ 12, /mosi=/ 23, /cs_m1=/ 5, /cs_s1=/ 22, /cs_m2=/ 33, /cs_s2=/ 19,dc1=/ 17, /dc2=/ 25, /rst1=/ 16, /rst2=/ 14, /busy_m1=/ 4, /busy_s1=/ 26, /busy_m2=/ 13, /busy_s2=/ 32));

The E-paper displazy is

i also tried the example to run with Arduino uno but nothing has helped to power up the e paper dispaly.

Could you please guide me towards correct direction in getting the display work.

i will attach the following output and connection i have achieved in the post.

Thanks for understanding

With Regards
Lakshminarayana K S

Hi Lakshminarayana K S, welcome to the forum!

Yes, I can try. But I am always short on time, so I give you a quick answer, and will maybe answer further questions in more detail.

I think the connector you connected your processor to is on the 5V side of level converters.
This may be the reason for not working with your ESP32.

I used a Waveshare ESP32 driver board, mounted on the connector intended for this.
I recently compared the driver board to a no-name ESP32 devkit board with the same number of pins, and was pleased that it has the same pinout. So I might spare one of my driver boards. But I didn't try it on this 12.48" board yet.

I suggest that you compare your ESP32 board pinout to the driver board also, and use jumper wires to the ESP32 socket, if it doesn't match directly.
Added: my processor board is a devkit V2, I think, and it has a VIN pin connected to the 5V from USB.

And I think you need a quite strong 5V power supply to the board. I don't remember if the USB connector of the driver board was good enough, but I think so.


Hi ZinggJM,

I tired the things you mentioned above, when i provided 5V supply to Vin pin of E-paper i got the similar Output has previous mentioned above.

Their was no luck with other setup also.

Hope you have solution for this.

I am attaching the output for reference.

Yes, the solution is simple: buy a Universal e-Paper Raw Panel Driver Board, ESP32 WiFi / Bluetooth Wireless board.
It matches to the connector on the board on the backside of your panel.
And it also works directly with my library, I just checked again.
You would need this and check with the Waveshare demo code, if you want to prove if your panel is defective.
You could also buy a ESP32 devkit V2 or clone, with the same pinout, to check. These are less expensive. I also checked that it works right now.
Note that I needed to compile for WEMOS LOLIN32, because when I compile for ESP32 Dev Module the program hangs (Serial.begin() issue).

You did not provide a list with your wiring connections (point to point), so I can't check against your constructor parameters.
But you use an input only pin for cs_m2, and the standard MISO pin for cs_s2.
I will not spend time on reproducing and checking your wiring.

For your test with Arduino UNO you may need to close the ICSP switches. These are strangely placed, as far as I remember. Check the schematics. Note that UNO will be very slow with this display, because of heavy paging.


Version 1.3.8 of library GxEPD2 is available, install or update with Library Manager.

  • added support for GDEQ042Z21 4.2" b/w/r 400x300 panel or Waveshare 4.2" V2 b/w/r board
  • the Waveshare 4.2" V2 b/w/r board requires the shortened reset pulse
  • added support for GDEW029I6FD 2.9" b/w 128x296 flexible panel
  • some fixes and improvement for the new style panel selection

Support for GDEQ042Z21 is thanks to the board donated as free sample by Waveshare.

Support for GDEW029I6FD is thanks to the panel donated by @lanewinfield.


Hello ZinggJM,

i was able to get it work with the esp32 node32s device but no help with esp32 dev module.


Version 1.0.4 of library GxEPD2_4G is available, download and install as ZIP-file.

  • GxEPD2 variant with support for 4 grey levels on supported e-papers
  • added support for GDEW029T5D
  • added support for GDEW029I6FD
  • added support for GDEM029T94
  • GDEM029T94 has no partial refresh with grey refresh mode
  • improved handling of switching between refresh modes

still considered experimental.


ZinggJM - hi, huge fan of your work!

I'm having a little trouble with GxEPD2, MKR1000, Waveshare B/W 7.5 (which i believe is GDEW075T7) - hoping for some assistance...

I can successfully change images on my screen using the official Waveshare demo code here: waveshare arduino github. So know my screen works and my hardware is correct.

Now, i'm struggling to get your HelloWorld example working (here: ZinggJM HelloWorld)

I have chosen to use the "New Style" display selection. I carefully look in GxEPD2_display_selection_new_style.h and determine that really the only lines needed are:

// select the display class (only one), matching the kind of display panel
// select the display driver class (only one) for your  panel
#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7  // GDEW075T7   800x480, GD7965

#if defined(ARDUINO_ARCH_SAMD) //i believe MKR1000 is samd architecture
#define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise
// adapt the constructor parameters to your wiring

I use serial messages to follow the progress with the following output:
07:36:22.524 -> sending init
07:36:22.804 -> sending hello world...
07:36:32.804 -> Busy Timeout!
07:36:43.359 -> Busy Timeout!
07:36:53.391 -> Busy Timeout!
07:36:53.391 -> ...hello world done
07:36:53.391 -> made it to main loop
07:36:58.403 -> made it to main loop

There is no visible changes to my paper.

Eagerly awaiting your response and THANKYOU!

@weow147, Hi, welcome to the forum!

Thank you for posting code in a code window. Please also post diagnostic output in a code window, too.

Please read How to get the best out of this forum if you haven't done yet.

Your diagnostic output looks uncommon; I would expect to see busy times from diagnostic output in Serial Monitor.

Busy Timeouts most likely are caused by SPI communication not working, or wrong panel selected.

Please report your wiring, point-to-point, to be able to check against your constructor parameters.
And provide a link to the display you bought, to see if you bought it with a HAT for connection.

Note that my suggested wiring and parameters are different than the wiring used by the Waveshare examples. Just make sure that your wiring corresponds to your parameters.

Yes, MKR1000 is SAMD architecture.



-Diagnostic Output was copy/pasted from serial monitor. Will place in code window next time. :+1:
-display 800×480, 7.5inch E-Ink raw display
-Hat Universal e-Paper Raw Panel Driver HAT

HAT -> MKR1000
Busy -> 5
RST   -> 6
DC    -> 7
CS    -> 4
CLK  -> 9 SCK
DIN  -> 8 MOSI
VCC  -> VCC (confirmed 3.3V)

I'm using the suggested mappings from GxEPD2_wiring_examples.h

// mapping suggestion for Arduino MKR1000 or MKRZERO
// note: can't use SS on MKR1000: is defined as 24, should be 4
// BUSY -> 5, RST -> 6, DC -> 7, CS-> 4, CLK -> 9, DIN -> 8

This configuration also matches the constructor in GxEPD2_display_selection_new_style.h

//lines 194 and 195 from GxEPD2_display_selection_new_style.h
// adapt the constructor parameters to your wiring

Noted: Waveshare wiring differs from ZinggJM wiring - i like yours better.

I must have the wrong panel??

No, I don't think so. If the Waveshare demo works, this is the correct panel for this resolution.

But the actual version of the HAT has the "clever" reset circuit, that needs the shortened reset pulse (at least for the big panels), see in README.md:

  • note that Waveshare bords with "clever" reset circuit may need shortened reset pulse
  • use init(115200, true, 2, false) for Waveshare boards with "clever" reset circuit
  • note that Waveshare bords with "clever" reset circuit need 1k pull-up on RST on ESP8266, or different pin

I don't have the actual HAT version, so I can't test. I prefer the DESPI-C02 for 3.3V processors.