From 99e633bb5ecc4e7361a16a48112416251efad0cd Mon Sep 17 00:00:00 2001 From: Alexandre B Date: Sat, 26 Oct 2024 09:48:46 -0400 Subject: [PATCH] . --- ESP32-C3_ePaper/src/main.cpp | 359 ++++------------------------------- 1 file changed, 36 insertions(+), 323 deletions(-) diff --git a/ESP32-C3_ePaper/src/main.cpp b/ESP32-C3_ePaper/src/main.cpp index 45b525a80..6a76b5e07 100644 --- a/ESP32-C3_ePaper/src/main.cpp +++ b/ESP32-C3_ePaper/src/main.cpp @@ -1,363 +1,76 @@ -#include +// GxEPD2_HelloWorld.ino by Jean-Marc Zingg +// +// Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! +// +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ +// +// Author: Jean-Marc Zingg +// +// Version: see library.properties +// +// Library: https://github.com/ZinggJM/GxEPD2 -// base class GxEPD2_GFX can be used to pass references or pointers to the display instance as parameter, uses ~1.2k more code +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues -// enable or disable GxEPD2_GFX base class +// see GxEPD2_wiring_examples.h for wiring suggestions and examples +// if you use a different wiring, you need to adapt the constructor parameters! -#define ENABLE_GxEPD2_GFX 0 +// uncomment next line to use class GFX of library GFX_Root instead of Adafruit_GFX +//#include #include - #include - +#include +#include #include -// ESP32-C3 SS=7,SCL(SCK)=4,SDA(MOSI)=6,BUSY=3,RST=2,DC=1 +// select the display class and display driver class in the following file (new style): +#include "GxEPD2_display_selection_new_style.h" -// 2.13'' EPD Module +// or select the display constructor line in one of the following files (old style): +#include "GxEPD2_display_selection.h" +#include "GxEPD2_display_selection_added.h" -GxEPD2_BW display(GxEPD2_213_BN(/*CS=5*/ SS, /*DC=*/ 1, /*RST=*/ 2, /*BUSY=*/ 3)); // DEPG0213BN 122x250, SSD1680 +// alternately you can copy the constructor from GxEPD2_display_selection.h or GxEPD2_display_selection_added.h to here +// e.g. for Wemos D1 mini: +//GxEPD2_BW display(GxEPD2_154_D67(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH0154D67 -//GxEPD2_3C display(GxEPD2_213_Z98c(/*CS=5*/ SS, /*DC=*/ 1, /*RST=*/ 2, /*BUSY=*/ 3)); // GDEY0213Z98 122x250, SSD1680 - -// 2.9'' EPD Module - -//GxEPD2_BW display(GxEPD2_290_BS(/*CS=5*/ SS, /*DC=*/ 1, /*RST=*/ 2, /*BUSY=*/ 3)); // DEPG0290BS 128x296, SSD1680 - -//GxEPD2_3C display(GxEPD2_290_C90c(/*CS=5*/ SS, /*DC=*/ 1, /*RST=*/ 2, /*BUSY=*/ 3)); // GDEM029C90 128x296, SSD1680 +// for handling alternative SPI pins (ESP32, RP2040) see example GxEPD2_Example.ino void setup() - { - - pinMode(8, OUTPUT); - - digitalWrite(8, HIGH); - - - - display.init(115200,true,50,false); - + //display.init(115200); // default 10ms reset pulse, e.g. for bare panels with DESPI-C02 + display.init(115200, true, 2, false); // USE THIS for Waveshare boards with "clever" reset circuit, 2ms reset pulse 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.setCursor(x, y); 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: - - digitalWrite(8, HIGH); - - delay(1000); - - digitalWrite(8, LOW); - - delay(1000); - -} \ No newline at end of file +void loop() {}; \ No newline at end of file