From b2db0ada23dbc4c9ea82833e6dc5ffebfadaaf5d Mon Sep 17 00:00:00 2001 From: YXZhu Date: Mon, 19 Jan 2026 11:21:56 +0800 Subject: [PATCH] add Example/EpaperModuleTest_Arduino_ESP32S3 --- .../EpaperModuleTest_Arduino_ESP32S3.ino | 199 ++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 Example/EpaperModuleTest_Arduino_ESP32S3/EpaperModuleTest_Arduino_ESP32S3.ino diff --git a/Example/EpaperModuleTest_Arduino_ESP32S3/EpaperModuleTest_Arduino_ESP32S3.ino b/Example/EpaperModuleTest_Arduino_ESP32S3/EpaperModuleTest_Arduino_ESP32S3.ino new file mode 100644 index 0000000..ee31aed --- /dev/null +++ b/Example/EpaperModuleTest_Arduino_ESP32S3/EpaperModuleTest_Arduino_ESP32S3.ino @@ -0,0 +1,199 @@ + +// base class GxEPD2_GFX can be used to pass references or pointers to the display instance as parameter, uses ~1.2k more code +// enable or disable GxEPD2_GFX base class +#define ENABLE_GxEPD2_GFX 0 + +#include +#include +#include + +// ESP32S3 CS(SS)=10,SCL(SCK)=12,SDA(MOSI)=11,BUSY=3,RES(RST)=46,DC=9 +#define CS_PIN (10) +#define BUSY_PIN (3) +#define RES_PIN (46) +#define DC_PIN (9) + +// 1.54'' EPD Module +//GxEPD2_BW display(GxEPD2_154_D67(/*CS=5*/ CS_PIN, /*DC=*/ DC_PIN, /*RES=*/ RES_PIN, /*BUSY=*/ BUSY_PIN)); // GDEH0154D67 200x200, SSD1681 + +// 2.13'' EPD Module +//GxEPD2_BW display(GxEPD2_213_BN(/*CS=5*/ CS_PIN, /*DC=*/ DC_PIN, /*RES=*/ RES_PIN, /*BUSY=*/ BUSY_PIN)); // DEPG0213BN 122x250, SSD1680 +//GxEPD2_3C display(GxEPD2_213_Z98c(/*CS=5*/ CS_PIN, /*DC=*/ DC_PIN, /*RES=*/ RES_PIN, /*BUSY=*/ BUSY_PIN)); // GDEY0213Z98 122x250, SSD1680 + +// 2.9'' EPD Module +//GxEPD2_BW display(GxEPD2_290_BS(/*CS=5*/ CS_PIN, /*DC=*/ DC_PIN, /*RES=*/ RES_PIN, /*BUSY=*/ BUSY_PIN)); // DEPG0290BS 128x296, SSD1680 +//GxEPD2_3C display(GxEPD2_290_C90c(/*CS=5*/ CS_PIN, /*DC=*/ DC_PIN, /*RES=*/ RES_PIN, /*BUSY=*/ BUSY_PIN)); // GDEM029C90 128x296, SSD1680 + +// 3.7'' EPD Module +//GxEPD2_BW display(GxEPD2_370_GDEY037T03(/*CS=5*/ CS_PIN, /*DC=*/ DC_PIN, /*RES=*/ RES_PIN, /*BUSY=*/ BUSY_PIN)); // GDEY037T03 240x416, UC8253 + +// 4.2'' EPD Module +//GxEPD2_BW display(GxEPD2_420_GDEY042T81(/*CS=5*/ CS_PIN, /*DC=*/ DC_PIN, /*RES=*/ RES_PIN, /*BUSY=*/ BUSY_PIN)); // 400x300, SSD1683 +//GxEPD2_3C display(GxEPD2_420c_GDEY042Z98(/*CS=5*/ CS_PIN, /*DC=*/ DC_PIN, /*RES=*/ RES_PIN, /*BUSY=*/ BUSY_PIN)); // 400x300, SSD1683 + +void setup() +{ + display.init(115200,true,50,false); + helloWorld(); + helloFullScreenPartialMode(); + delay(1000); + if (display.epd2.hasFastPartialUpdate) + { + showPartialUpdate(); + delay(1000); + } + display.hibernate(); +} + +const char HelloWorld[] = "Hello World!"; +const char HelloWeACtStudio[] = "WeAct Studio"; + +void helloWorld() +{ + display.setRotation(1); + display.setFont(&FreeMonoBold9pt7b); + display.setTextColor(GxEPD_BLACK); + int16_t tbx, tby; uint16_t tbw, tbh; + display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh); + // center the bounding box by transposition of the origin: + uint16_t x = ((display.width() - tbw) / 2) - tbx; + uint16_t y = ((display.height() - tbh) / 2) - tby; + display.setFullWindow(); + display.firstPage(); + do + { + display.fillScreen(GxEPD_WHITE); + display.setCursor(x, y-tbh); + display.print(HelloWorld); + display.setTextColor(display.epd2.hasColor ? GxEPD_RED : GxEPD_BLACK); + display.getTextBounds(HelloWeACtStudio, 0, 0, &tbx, &tby, &tbw, &tbh); + x = ((display.width() - tbw) / 2) - tbx; + display.setCursor(x, y+tbh); + display.print(HelloWeACtStudio); + } + while (display.nextPage()); +} + +void helloFullScreenPartialMode() +{ + //Serial.println("helloFullScreenPartialMode"); + const char fullscreen[] = "full screen update"; + const char fpm[] = "fast partial mode"; + const char spm[] = "slow partial mode"; + const char npm[] = "no partial mode"; + display.setPartialWindow(0, 0, display.width(), display.height()); + display.setRotation(1); + display.setFont(&FreeMonoBold9pt7b); + if (display.epd2.WIDTH < 104) display.setFont(0); + display.setTextColor(GxEPD_BLACK); + const char* updatemode; + if (display.epd2.hasFastPartialUpdate) + { + updatemode = fpm; + } + else if (display.epd2.hasPartialUpdate) + { + updatemode = spm; + } + else + { + updatemode = npm; + } + // do this outside of the loop + int16_t tbx, tby; uint16_t tbw, tbh; + // center update text + display.getTextBounds(fullscreen, 0, 0, &tbx, &tby, &tbw, &tbh); + uint16_t utx = ((display.width() - tbw) / 2) - tbx; + uint16_t uty = ((display.height() / 4) - tbh / 2) - tby; + // center update mode + display.getTextBounds(updatemode, 0, 0, &tbx, &tby, &tbw, &tbh); + uint16_t umx = ((display.width() - tbw) / 2) - tbx; + uint16_t umy = ((display.height() * 3 / 4) - tbh / 2) - tby; + // center HelloWorld + display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh); + uint16_t hwx = ((display.width() - tbw) / 2) - tbx; + uint16_t hwy = ((display.height() - tbh) / 2) - tby; + display.firstPage(); + do + { + display.fillScreen(GxEPD_WHITE); + display.setCursor(hwx, hwy); + display.print(HelloWorld); + display.setCursor(utx, uty); + display.print(fullscreen); + display.setCursor(umx, umy); + display.print(updatemode); + } + while (display.nextPage()); + //Serial.println("helloFullScreenPartialMode done"); +} + +void showPartialUpdate() +{ + // some useful background + helloWorld(); + // use asymmetric values for test + uint16_t box_x = 10; + uint16_t box_y = 15; + uint16_t box_w = 70; + uint16_t box_h = 20; + uint16_t cursor_y = box_y + box_h - 6; + if (display.epd2.WIDTH < 104) cursor_y = box_y + 6; + float value = 13.95; + uint16_t incr = display.epd2.hasFastPartialUpdate ? 1 : 3; + display.setFont(&FreeMonoBold9pt7b); + if (display.epd2.WIDTH < 104) display.setFont(0); + display.setTextColor(GxEPD_BLACK); + // show where the update box is + for (uint16_t r = 0; r < 4; r++) + { + display.setRotation(r); + display.setPartialWindow(box_x, box_y, box_w, box_h); + display.firstPage(); + do + { + display.fillRect(box_x, box_y, box_w, box_h, GxEPD_BLACK); + //display.fillScreen(GxEPD_BLACK); + } + while (display.nextPage()); + delay(2000); + display.firstPage(); + do + { + display.fillRect(box_x, box_y, box_w, box_h, GxEPD_WHITE); + } + while (display.nextPage()); + delay(1000); + } + //return; + // show updates in the update box + for (uint16_t r = 0; r < 4; r++) + { + display.setRotation(r); + display.setPartialWindow(box_x, box_y, box_w, box_h); + for (uint16_t i = 1; i <= 10; i += incr) + { + display.firstPage(); + do + { + display.fillRect(box_x, box_y, box_w, box_h, GxEPD_WHITE); + display.setCursor(box_x, cursor_y); + display.print(value * i, 2); + } + while (display.nextPage()); + delay(500); + } + delay(1000); + display.firstPage(); + do + { + display.fillRect(box_x, box_y, box_w, box_h, GxEPD_WHITE); + } + while (display.nextPage()); + delay(1000); + } +} + +void loop() { + // put your main code here, to run repeatedly: +}