mirror of
https://github.com/alexandrebobkov/ESP-Nodes.git
synced 2025-08-08 07:16:08 +00:00
.
This commit is contained in:
@@ -1,363 +1,76 @@
|
|||||||
#include <Arduino.h>
|
// 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 <GFX.h>
|
||||||
|
|
||||||
#include <GxEPD2_BW.h>
|
#include <GxEPD2_BW.h>
|
||||||
|
|
||||||
#include <GxEPD2_3C.h>
|
#include <GxEPD2_3C.h>
|
||||||
|
#include <GxEPD2_4C.h>
|
||||||
|
#include <GxEPD2_7C.h>
|
||||||
#include <Fonts/FreeMonoBold9pt7b.h>
|
#include <Fonts/FreeMonoBold9pt7b.h>
|
||||||
|
|
||||||
// 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<GxEPD2_213_BN, GxEPD2_213_BN::HEIGHT> 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<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH0154D67
|
||||||
|
|
||||||
//GxEPD2_3C<GxEPD2_213_Z98c, GxEPD2_213_Z98c::HEIGHT> display(GxEPD2_213_Z98c(/*CS=5*/ SS, /*DC=*/ 1, /*RST=*/ 2, /*BUSY=*/ 3)); // GDEY0213Z98 122x250, SSD1680
|
// for handling alternative SPI pins (ESP32, RP2040) see example GxEPD2_Example.ino
|
||||||
|
|
||||||
// 2.9'' EPD Module
|
|
||||||
|
|
||||||
//GxEPD2_BW<GxEPD2_290_BS, GxEPD2_290_BS::HEIGHT> display(GxEPD2_290_BS(/*CS=5*/ SS, /*DC=*/ 1, /*RST=*/ 2, /*BUSY=*/ 3)); // DEPG0290BS 128x296, SSD1680
|
|
||||||
|
|
||||||
//GxEPD2_3C<GxEPD2_290_C90c, GxEPD2_290_C90c::HEIGHT> display(GxEPD2_290_C90c(/*CS=5*/ SS, /*DC=*/ 1, /*RST=*/ 2, /*BUSY=*/ 3)); // GDEM029C90 128x296, SSD1680
|
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
|
|
||||||
{
|
{
|
||||||
|
//display.init(115200); // default 10ms reset pulse, e.g. for bare panels with DESPI-C02
|
||||||
pinMode(8, OUTPUT);
|
display.init(115200, true, 2, false); // USE THIS for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
||||||
|
|
||||||
digitalWrite(8, HIGH);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
display.init(115200,true,50,false);
|
|
||||||
|
|
||||||
helloWorld();
|
helloWorld();
|
||||||
|
|
||||||
helloFullScreenPartialMode();
|
|
||||||
|
|
||||||
delay(1000);
|
|
||||||
|
|
||||||
if (display.epd2.hasFastPartialUpdate)
|
|
||||||
|
|
||||||
{
|
|
||||||
|
|
||||||
showPartialUpdate();
|
|
||||||
|
|
||||||
delay(1000);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
display.hibernate();
|
display.hibernate();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char HelloWorld[] = "Hello World!";
|
const char HelloWorld[] = "Hello World!";
|
||||||
|
|
||||||
const char HelloWeACtStudio[] = "WeAct Studio";
|
|
||||||
|
|
||||||
void helloWorld()
|
void helloWorld()
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
display.setRotation(1);
|
display.setRotation(1);
|
||||||
|
|
||||||
display.setFont(&FreeMonoBold9pt7b);
|
display.setFont(&FreeMonoBold9pt7b);
|
||||||
|
|
||||||
display.setTextColor(GxEPD_BLACK);
|
display.setTextColor(GxEPD_BLACK);
|
||||||
|
|
||||||
int16_t tbx, tby; uint16_t tbw, tbh;
|
int16_t tbx, tby; uint16_t tbw, tbh;
|
||||||
|
|
||||||
display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh);
|
display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh);
|
||||||
|
|
||||||
// center the bounding box by transposition of the origin:
|
// center the bounding box by transposition of the origin:
|
||||||
|
|
||||||
uint16_t x = ((display.width() - tbw) / 2) - tbx;
|
uint16_t x = ((display.width() - tbw) / 2) - tbx;
|
||||||
|
|
||||||
uint16_t y = ((display.height() - tbh) / 2) - tby;
|
uint16_t y = ((display.height() - tbh) / 2) - tby;
|
||||||
|
|
||||||
display.setFullWindow();
|
display.setFullWindow();
|
||||||
|
|
||||||
display.firstPage();
|
display.firstPage();
|
||||||
|
|
||||||
do
|
do
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
display.fillScreen(GxEPD_WHITE);
|
display.fillScreen(GxEPD_WHITE);
|
||||||
|
display.setCursor(x, y);
|
||||||
display.setCursor(x, y-tbh);
|
|
||||||
|
|
||||||
display.print(HelloWorld);
|
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());
|
while (display.nextPage());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void helloFullScreenPartialMode()
|
void loop() {};
|
||||||
|
|
||||||
{
|
|
||||||
|
|
||||||
//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);
|
|
||||||
|
|
||||||
}
|
|
Reference in New Issue
Block a user