// 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 // GxEPD2_U8G2_Fonts_Example : show use of U8G2_FOR_ADAFRUIT_GFX with GxEPD2 // // Library: https://github.com/olikraus/U8g2_for_Adafruit_GFX // see: https://github.com/olikraus/U8g2_for_Adafruit_GFX/blob/master/README.md // // NOTE: you need to SAVE the modified example to a saveable location for UTF-8 characters to work // e.g. for Umlauts // 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 // see GxEPD2_wiring_examples.h for wiring suggestions and examples // 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 #include #include #include // select the display class and display driver class in the following file (new style): #include "GxEPD2_display_selection_new_style.h" U8G2_FOR_ADAFRUIT_GFX u8g2Fonts; // for handling alternative SPI pins (ESP32, RP2040) see example GxEPD2_Example.ino void setup() { Serial.begin(115200); Serial.println(); Serial.println("setup"); //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 u8g2Fonts.begin(display); // connect u8g2 procedures to Adafruit GFX helloWorld(); delay(1000); helloArduino(); delay(1000); helloEpaper(); delay(1000); showFont("u8g2_font_helvR14_tf", u8g2_font_helvR14_tf); // select u8g2 font from here: https://github.com/olikraus/u8g2/wiki/fntlistall delay(2000); showFont("u8g2_font_profont22_mr", u8g2_font_profont22_mr); // select u8g2 font from here: https://github.com/olikraus/u8g2/wiki/fntlistall delay(1000); Serial.println("setup done"); } void loop() { } const char HelloWorld[] = "Hello World!"; const char HelloArduino[] = "Hello Arduino!"; const char HelloEpaper[] = "Hello E-Paper!"; void helloWorld() { //Serial.println("helloWorld"); uint16_t bg = GxEPD_WHITE; uint16_t fg = GxEPD_BLACK; u8g2Fonts.setFontMode(1); // use u8g2 transparent mode (this is default) u8g2Fonts.setFontDirection(0); // left to right (this is default) u8g2Fonts.setForegroundColor(fg); // apply Adafruit GFX color u8g2Fonts.setBackgroundColor(bg); // apply Adafruit GFX color u8g2Fonts.setFont(u8g2_font_helvR14_tf); // select u8g2 font from here: https://github.com/olikraus/u8g2/wiki/fntlistall int16_t tw = u8g2Fonts.getUTF8Width(HelloWorld); // text box width int16_t ta = u8g2Fonts.getFontAscent(); // positive int16_t td = u8g2Fonts.getFontDescent(); // negative; in mathematicians view int16_t th = ta - td; // text box height //Serial.print("ascent, descent ("); Serial.print(u8g2Fonts.getFontAscent()); Serial.print(", "); Serial.print(u8g2Fonts.getFontDescent()); Serial.println(")"); // center bounding box by transposition of origin: // y is base line for u8g2Fonts, like for Adafruit_GFX True Type fonts uint16_t x = (display.width() - tw) / 2; uint16_t y = (display.height() - th) / 2 + ta; //Serial.print("bounding box ("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", "); Serial.print(tw); Serial.print(", "); Serial.print(th); Serial.println(")"); display.firstPage(); do { display.fillScreen(bg); u8g2Fonts.setCursor(x, y); // start writing at this position u8g2Fonts.print(HelloWorld); } while (display.nextPage()); //Serial.println("helloWorld done"); } void helloArduino() { //Serial.println("helloArduino"); uint16_t bg = GxEPD_WHITE; uint16_t fg = GxEPD_BLACK; u8g2Fonts.setFontMode(1); // use u8g2 transparent mode (this is default) u8g2Fonts.setFontDirection(0); // left to right (this is default) u8g2Fonts.setForegroundColor(fg); // apply Adafruit GFX color u8g2Fonts.setBackgroundColor(bg); // apply Adafruit GFX color u8g2Fonts.setFont(u8g2_font_helvR14_tf); // select u8g2 font from here: https://github.com/olikraus/u8g2/wiki/fntlistall int16_t tw = u8g2Fonts.getUTF8Width(HelloArduino); // text box width int16_t ta = u8g2Fonts.getFontAscent(); // positive int16_t td = u8g2Fonts.getFontDescent(); // negative; in mathematicians view int16_t th = ta - td; // text box height uint16_t x = (display.width() - tw) / 2; uint16_t y = display.height() / 4 - th / 2 + ta; display.setPartialWindow(0, y - 14, display.width(), 20); display.firstPage(); do { display.fillScreen(bg); u8g2Fonts.setCursor(x, y); u8g2Fonts.print(HelloArduino); } while (display.nextPage()); //Serial.println("helloArduino done"); } void helloEpaper() { //Serial.println("helloEpaper"); uint16_t bg = GxEPD_WHITE; uint16_t fg = GxEPD_BLACK; u8g2Fonts.setFontMode(1); // use u8g2 transparent mode (this is default) u8g2Fonts.setFontDirection(0); // left to right (this is default) u8g2Fonts.setForegroundColor(fg); // apply Adafruit GFX color u8g2Fonts.setBackgroundColor(bg); // apply Adafruit GFX color u8g2Fonts.setFont(u8g2_font_helvR14_tf); // select u8g2 font from here: https://github.com/olikraus/u8g2/wiki/fntlistall int16_t tw = u8g2Fonts.getUTF8Width(HelloArduino); // text box width int16_t ta = u8g2Fonts.getFontAscent(); // positive int16_t td = u8g2Fonts.getFontDescent(); // negative; in mathematicians view int16_t th = ta - td; // text box height uint16_t x = (display.width() - tw) / 2; uint16_t y = display.height() * 3 / 4 - th / 2 + ta; display.setPartialWindow(0, y - 14, display.width(), 20); display.firstPage(); do { display.fillScreen(bg); u8g2Fonts.setCursor(x, y); u8g2Fonts.print(HelloEpaper); } while (display.nextPage()); //Serial.println("helloEpaper done"); } void showFont(const char name[], const uint8_t *font) { display.setFullWindow(); display.setRotation(0); u8g2Fonts.setFontMode(1); // use u8g2 transparent mode (this is default) u8g2Fonts.setFontDirection(0); // left to right (this is default) u8g2Fonts.setForegroundColor(GxEPD_BLACK); // apply Adafruit GFX color u8g2Fonts.setBackgroundColor(GxEPD_WHITE); // apply Adafruit GFX color u8g2Fonts.setFont(font); // select u8g2 font from here: https://github.com/olikraus/u8g2/wiki/fntlistall display.firstPage(); do { drawFont(name); } while (display.nextPage()); } void drawFont(const char name[]) { //display.setRotation(0); display.fillScreen(GxEPD_WHITE); u8g2Fonts.setCursor(0, 0); u8g2Fonts.println(); u8g2Fonts.println(name); u8g2Fonts.println(" !\"#$%&'()*+,-./"); u8g2Fonts.println("0123456789:;<=>?"); u8g2Fonts.println("@ABCDEFGHIJKLMNO"); u8g2Fonts.println("PQRSTUVWXYZ[\\]^_"); u8g2Fonts.println("`abcdefghijklmno"); u8g2Fonts.println("pqrstuvwxyz{|}~ "); u8g2Fonts.println("Umlaut ÄÖÜäéöü"); }