Hi guys!
This is going to be my first post here! I really appreciate any comments or help!
So the story is like this:
While I was playing around with my 1.54” 3-Color EPD (200x200), which is compatible with the Waveshare 1.54 b/w/r EPD, I noticed that using the GxEPD or GxEPD2 library from @ZinggJM (btw. I am very grateful for this super library!! Thanks a lot!) I can only get a pinkish-red color displayed instead of that intensive red of the demo picture that was originally on the display when I got it.
So I tried a little bit more with both the demo codes from Waveshare and GxEPD(2) library and using different bitmaps, and I found out by using the demo code of waveshare I am able to get the intensive red, and simultaneously the pinkish-red, as well. Which means in fact, the 3-color EPD can display 4 different colors: White, Pink, Red, Black. (Please take a look on my photo, and look at the left upper corner)
To achieve that, I noticed that the pinkish color is simply red without black at the same spot, and the intensive red is black underneath the red. You can take a look at the bitmaps I am using. (I attached how the bitmaps look) 
Thus, because you can display 2 color layers you can display the 4 types of color for a pixel by having:
| Color | Black Layer | Red Layer |
|---|---|---|
| White | No | No |
| Pink | No | Yes |
| Red | Yes | Yes |
| Black | Yes | No |
Now, the problem is that this only works with the library and demo code provided by Waveshare. Because it seems to refresh both given color layers. When I trying display the same bitmaps with GxEPD2, I can only get the pinkish red (so only 3 colors, please take a look at my photo).
And the code I am using with GxEPD2 is:
code.ino
#define ENABLE_GxEPD2_GFX 0
#include <GxEPD2_BW.h>
#include <GxEPD2_3C.h>
#include "data.h"
GxEPD2_3C<GxEPD2_154c, GxEPD2_154c::HEIGHT> display(GxEPD2_154c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println();
Serial.println("setup");
delay(100);
display.init(115200);
display.fillScreen(GxEPD_WHITE);
display.setFullWindow();
drawBitmaps();
display.display(false);
}
void loop() {
// put your main code here, to run repeatedly:
}
void drawBitmaps()
{
display.drawInvertedBitmap(0, 0, IMAGE_BLACK, 200, 200, GxEPD_BLACK);
display.drawInvertedBitmap(0, 0, IMAGE_RED, 200, 200, GxEPD_RED);
}
The data.h contains the 2 IMAGE_X bitmaps as C array.
The same bitmaps C arrays are used with Waveshare demo code.
It seems like the GxEPD(2) will combine both red and black layer into one picture and then separate the colors. Thus the red color cannot have the black color underneath before it refreshes out. The same also happens on other drawing functions like fillRect or Circle.
Did this only happen on my EDP? Unfortunately, I do not have another one to test, so I appreciate any comments!
Thanks in advance! ![]()




