Waveshare e-paper displays with SPI

static const uint8_t SS    = 34;
static const uint8_t MOSI  = 35;
static const uint8_t MISO  = 37;
static const uint8_t SCK   = 36;
  • DIN ??
  • DC/RST/BUSY can be any GPIO?

DIN from MOSI (Master Out Slave IN)
Yes, any available pin.

Version 1.3.0 of library GxEPD2 is available through Library Manager.

  • added support for GDEM029T94 128x296 b/w e-paper panel
  • added support for GDEW026M01 152x296 b/w new DES e-paper panel
  • the new GDEW026M01 DES b/w e-paper panel has higher contrast and wide temperature range
  • differential refresh (fast partial update) is supported for normal temperature range
  • disable differential refresh for extended temperatures by setting hasFastPartialUpdate = false;
  • the differential waveform table for GDEW026M01 is experimental and may need improvement
  • major update of display selection in the examples to make additions easier:
  • old style selection is now in separate include files GxEPD2_display_selection.h
  • and GxEPD2_display_selection_added.h
  • added new style display selection in include file GxEPD2_display_selection_new_style.h
  • either selection style can be used. old style is intended for easy copying of constructor lines.

Jean-Marc

@kevinsteven,

I checked the GDEH075Z90 880x528 3-color panel again with DESPI-C02 on ESP8266 and ESP32, and with the Waveshare ESP32 Driver board. All results looked ok with correct red color.

I compared the Waveshare driver code as e.g. in epd7in5b_HD.cpp with the Good Display demo code and the driver code of GxEPD2 in GxEPD2_750c_Z90.cpp.
I see no difference that could explain your issue.
Both Waveshare and Good Display use Data Entry Mode 0x01, y-decrement, instead of 0x03, y-increment.
Waveshare uses then reversed Gate driving sequence to undo the resulting vertical flip.
(there was a controller used on 2.31" b/w where y-increment didn't work, maybe that's why Good Display continued to use y-decrement. AFAIK Chinese don't read bottom up in general).

The driver code uses waveform tables from controller OTP. The VCOM value is also part of the temperature dependent waveform tables, and should be matched to the panel.
I see no command to set a different VCOM value in the Waveshare code, so this shouldn't be the reason.
But you can try to set VCOM in GxEPD2_750c_Z90.cpp by adding this at line 398:

  _writeCommand(0x2C); // Write VCOM register
  _writeData(0x28);    // -1.0V

for encoding of different values see controller or panel specs.

There is a related post here.

Jean-Marc

Hi @ZinggJM

Thanks for your latest findings. I tried out the command to change the volage, but it only made things worse (the second redraw of the picture only completed partially). And you are right, my issue seems to be related to the one from Lukas. Sorry I missed that.

But, I was able to get proper colors by using a workaround: I added the display init code from the epd7in5b_HD-demo as a first thing in the setup() routine. I am not really sure why this helps, but could it be related to me sometimes unplugging the display while it is still refreshing (is that bad?) and maybe the example code from waveshare does a bit more cleanup..?

Anyway, here is what I did to your code..., the "DEV_Config.h" and "EPD.h" and the code marked as "hack" below are from "examples/esp32-waveshare-epd/examples/epd7in5b_HD-demo" coming from the Waveshare e-Paper Hat Example Code.

#define GxEPD2_DISPLAY_CLASS GxEPD2_3C
#define GxEPD2_DRIVER_CLASS GxEPD2_750c_Z90 // GDEH075Z90  880x528

#include "DEV_Config.h"
#include "EPD.h"

void setup()
{
  Serial.begin(115200);
  Serial.println();
  Serial.println("setup");

  // hack start
  Serial.println("Doing the hack");
  DEV_Module_Init();
  printf("EPD_7IN5B_HD_test Demo\r\n");
  printf("e-Paper Init and Clear...\r\n");
  EPD_7IN5B_HD_Init();
  //EPD_7IN5B_HD_Clear();  // found this to be optional
  delay(1000);
  // hack done
  
  display.init(115200); // uses standard SPI pins, e.g. SCK(18), MISO(19), MOSI(23), SS(5)

Best regards
Kevin

@kevinsteven,

I just lost the detailed post of my answer by one of these dreadful forum failures.

You now know where the init code is in Waveshare code and GxEPD2 driver code.
You can use your workaround or experiment with including/changing code in GxEPD2.
Unless no other users report this issue, we leave it as is, else I would need the actual panel donated.

Jean-Marc

    EPD_7IN5B_HD_SendCommand(0x46);  // Auto Write RAM
    EPD_7IN5B_HD_SendData(0xF7);
    EPD_7IN5B_HD_ReadBusy();        //waiting for the electronic paper IC to release the idle signal

    EPD_7IN5B_HD_SendCommand(0x47);  // Auto Write RAM
    EPD_7IN5B_HD_SendData(0xF7);
    EPD_7IN5B_HD_ReadBusy();        //waiting for the electronic paper IC to release the idle signal
    EPD_7IN5B_HD_SendCommand(0x01);  // Set MUX as 527
    EPD_7IN5B_HD_SendData(0xAF);
    EPD_7IN5B_HD_SendData(0x02);
    EPD_7IN5B_HD_SendData(0x01);

0x02AF is not 527.
Using a different number of gates to scan will result in a different waveform. Maybe the waveform in OTP of the new panels is for a different panel, and this change corrects the timing. Your reported refresh times are slightly different than mine.

Hello Again !

Now i'm looking for using partial refresh on my waveshare 7.5 3 color display.
Really don't find the solution. Looks like it doesn't want to work.

this is the line used at the screen selection :

GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z08 800x480

I really don't see where we can find your library commands description (or adafruit GFX) Obliged to try.
Your sample GxEPD2_not Paged_example shows errors, so I simply transfered some blocks at the actual
Display_ePaper_7.5_BWR_with_GxEPD2 that I use and that's working but in paged mode.

That I need is be able to change only some part of text on my screen, and not to do the terrible whole flashing. Or do it sometimes but not as often as change a line content.

to obtain not paged use, it seems to me that we have to use
display.setFullWindow();
and then
write or draw something
and then

display.display(false); ??

or

display.setFullWindow(); ??

for the moment I get all kind of unpredictable results. Also maybe my screen doesn't support partial update ? it is writtend on your document " does not support differencial update" ??

I've clearly seen at some the unpredictable stuff your library + my modifications were doing on my screen, that the screen is totally able to wipe something and replace with another, without doing the "big flashing shit"...

but maybe we just can't control it ??

Any hint of help welcome !!!

Thank you..

my screen is this one : https://fr.aliexpress.com/item/32832744705.html?spm=a2g0s.9042311.0.0.27426c37h3JA8U

@47francois,

If you want to complain about documentation, read README.md about documentation, and don't expect further help from me.

No 3-color e-paper display can do differential refresh, flicker free fast partial update. Update of partial window is possible, but with full refresh.

47francois:
Hello Again !

Now i'm looking for using partial refresh on my waveshare 7.5 3 color display.
Really don't find the solution. Looks like it doesn't want to work.

this is the line used at the screen selection :

GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z08 800x480

I really don't see where we can find your library commands description (or adafruit GFX) Obliged to try.
Your sample GxEPD2_not Paged_example shows errors, so I simply transfered some blocks at the actual
Display_ePaper_7.5_BWR_with_GxEPD2 that I use and that's working but in paged mode.

That I need is be able to change only some part of text on my screen, and not to do the terrible whole flashing. Or do it sometimes but not as often as change a line content.

to obtain not paged use, it seems to me that we have to use
display.setFullWindow();
and then
write or draw something
and then

display.display(false); ??

or

display.setFullWindow(); ??

for the moment I get all kind of unpredictable results. Also maybe my screen doesn't support partial update ? it is writtend on your document " does not support differencial update" ??

I've clearly seen at some the unpredictable stuff your library + my modifications were doing on my screen, that the screen is totally able to wipe something and replace with another, without doing the "big flashing shit"...

but maybe we just can't control it ??

Any hint of help welcome !!!

Thank you..

my screen is this one : https://fr.aliexpress.com/item/32832744705.html?spm=a2g0s.9042311.0.0.27426c37h3JA8U

Quote for record. "Abschreckendes Beispiel". Not recommended way to expect help from me.

Mr. Dear Jean-Marc,
thank you very much again for the GxEPD2 library I use
a long time! According to that, I also followed which ePaper to buy!
Here is my ePaper collection in a few years ... :slight_smile:


For Christmas, I bought an ePaper 6.0 800x600 with an IT8951 controller

  • ESP32 from OLIMEX with external WiFi antenna (I needed it here)
    ESP32-DevKit-LiPo - Open Source Hardware Board
    and I created my PCB patch board.
  • excellent sensor SHT35-D
    Everything works very well with the library and your support! Thank you!!

I bought an ePaper (kindle) 9.7 1200x825
https://www.aliexpress.com/item/32840668114.html

I know you don't support him !!
I connected it to the IT8951 controller and used the GxEPD2 Library
and was a partial success, I displayed a picture or tex but only on part of the screen but 2x it's a bug and stripes on the right!


My question:
eWaper from Waveshare and IT8951 controller needs to be paired?
Can't combine the IT8951a controller with different Waveshare ePaper?
I think not! But I still apologize for asking this question!
Thank you very much for your willingness.
Regards Josef

@jzvolanek, Hi Josef,

what an impressive collection! respect!

Sometime I will find time and a big board or picture frame and canvas to mount my e-paper displays on.
(And a second board for my neglected TFT displays.)

eWaper from Waveshare and IT8951 controller needs to be paired?
Can't combine the** IT8951**a controller with different Waveshare ePaper?

Yes, they need be paired, best bought together. The IT8951 board comes programmed or parameterized.
And there are 2 different versions with different number of FPC pins.

Jean-Marc

Hi Jean-Marc,
thank you for the quick reply!
You mean if I buy Waveshare 9.7 + eHAT T8951
so there's any chance I'm breaking up with your GxEPD2 library ?

Thank you very much and have a nice evening!
Josef

Hi Josef,

most likely it is enough to copy and edit the driver class GxEPD2_it60_1448x1072 for the dimension of your 9.7" display. And add a constructor line to the example with a suitable page_height to fit the graphics buffer to processor RAM.
Maybe you would also need to look at the Waveshare demo for any initialization changes, but as the IT8951 board comes parameterized maybe there is no need.

Jean-Marc

Hi Jean-Marc,
thank you for the quick reply.
I really appreciate it, thank you!
Maybe it should be enough to add then
in my code:

#define SCREEN_WIDTH 1200 // Landscape mode setting
#define SCREEN_HEIGHT 825

Josef

See GxEPD2_it60_1448x1072.h

class GxEPD2_it60_1448x1072 : public GxEPD2_EPD
{
  public:
    // attributes
    static const uint16_t WIDTH = 1448;
    static const uint16_t HEIGHT = 1072;
    static const GxEPD2::Panel panel = GxEPD2::ED060KC1;

You would need to decide if you change the existing class or create a new one with an appropriate name.

Very pleasantly surprised, I will use it with waveshare e-paper.

Hi,

I want to use an waveshare ePaper Display 2.9in (b/w) via SPI to show the live data of a sensor. I want to use die GxEPD2-Library. It´s connected correctly, the example works (Hello world).
That´s my displays wiring: GxEPD2_290 (/CS=10/ SS, /DC=/ 8, /RST=/ 9, /BUSY=/ 7)

Where do I find informations about what each task does and do I have to include more libraries (like u8glib or something else)?

Thanks for the feedback!

It would be great if anyone has a sample code for my project that clarifies what is being done where?
I want to set up everything in the setup() area and then display the current values of the sensor in the loop() on each program run.

Thanks again.

flori_2121:
Hi,

I want to use an waveshare ePaper Display 2.9in (b/w) via SPI to show the live data of a sensor. I want to use die GxEPD2-Library. It´s connected correctly, the example works (Hello world).
That´s my displays wiring: GxEPD2_290 (/CS=10/ SS, /DC=/ 8, /RST=/ 9, /BUSY=/ 7)

Where do I find informations about what each task does and do I have to include more libraries (like u8glib or something else)?

Thanks for the feedback!

It would be great if anyone has a sample code for my project that clarifies what is being done where?
I want to set up everything in the setup() area and then display the current values of the sensor in the loop() on each program run.

Thanks again.

I want to use an waveshare ePaper Display 2.9in (b/w) via SPI to show the live data of a sensor.

Good to know your goal. This is a good start.

I want to use die GxEPD2-Library.

Welcome, you are allowed to do that!

It´s connected correctly, the example works (Hello world).

Congratulations.

That´s my displays wiring: GxEPD2_290 (/CS=10/ SS, /DC=/ 8, /RST=/ 9, /BUSY=/ 7)

Aha. Most likely you use an AVR Arduino. But you could provide more details.

Where do I find informations about what each task does and do I have to include more libraries (like u8glib or something else)?

You don't need anything else. Adafuit_GFX is included by GxEPD2. It needs be installed.

It would be great if anyone has a sample code for my project that clarifies what is being done where?

Search for weather-stations for e-paper displays. The world is full of these. e.g. ESP32-e-Paper-Weather-Display
You don't seem to want to take a look at GxEPD2_Example.ino.

I want to set up everything in the setup() area and then display the current values of the sensor in the loop() on each program run.

You may do that. It's the usual way to do.

Thanks for your answer!

I tried using the GxEPD library today to get the code to work, but immediately got an error message " Error compiling for Arduino Nano board."

#include <GxEPD.h>
#include <GxFont_GFX.h>

#include <GxGDEH029A1/GxGDEH029A1.cpp>      // 2.9" b/w
#include <GxIO/GxIO_SPI/GxIO_SPI.cpp>
#include <GxIO/GxIO.cpp>

GxIO_Class io(SPI, /*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9); // arbitrary selection of 8, 9 selected for default of GxEPD_Class
GxEPD_Class display(io, /*RST=*/ 9, /*BUSY=*/ 7); // default selection of (9), 7


#include <SPI.h>

void setup()  {} 

 void loop() { }

So my question: Is any library not embedded properly or where is the problem? The wiring of the microcontroller is correct, can it also be due to the new waveshare display used that it is not addressed (GxGDEH029A1 in GxEPD vs. GDEH029A1 in GxEPD2)?
Are there differences between the two libraries within the coding of the commands?

Mr. Dear Jean-Marc
【New Release】4.01inch e-Paper HAT (F) , 640×400 Pixels, ACeP 7-Color, SPI Interface

Dear Jean-Marc,

Is it really necessary with GxEPD2 to do the display commands with the construction do .... while, or are there also other ways that the display reacts?

In all examples of the GxEPD library that I have seen this was not done or was not necessary.

Thanks for your feedback.