E-Paper Display Partial Refresh With Arduino

7,332

12

2

Introduction: E-Paper Display Partial Refresh With Arduino

In this instructable I use a Waveshare 2.9" E-Paper display with an Arduino Nano to create a partial refresh window in order to display updating values without completely refreshing/rebooting the screen.

Update: Check out my new Istructable as well, where I use the Waveshare display, an ADS1115 and Arduino nano to build a precise voltmeter capable of measuring voltages up to 90v DC: https://www.instructables.com/Waveshare-E-ink-Display-Precise-Voltmeter-0-90v-DC/

Supplies

Supplies Used in this instructable:

1 x Arduino Nano - https://amzn.to/2TiPaHY

1 x Waveshare display - https://amzn.to/33N1XrD

Breadboard and wires - https://amzn.to/2z0KmjH

USB Power Bank - https://amzn.to/3cEhk7Q

CanadianWinters is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for sites to earn fees by linking to Amazon.com and affiliated sites. By using these links, as an Amazon Associate I earn from qualifying purchases, even if you buy something else--and it won't cost you anything.

Step 1: Wiring the Display

I wired the display to the Arduino Nano as follows:

Display <-> Arduino

BUSY <-> D7

RST <-> D8

DC <-> D9

CS <-> D10

DIN <-> D11

CLK <-> D13

VCC <-> 3.3V

GND <-> GND

Step 2: Code

To test the display, I used the code provided by Waveshare at this link:

https://github.com/waveshare/e-Paper

Once I verified that the display was working, I created my own Arduino Sketch in order to perform a partial update of some values. In my code I use the input pin A0 as a floating value to be displayed on the screen.

The code uses the following libraries:

  • GxEPD2
  • U8g2_for_Adafruit_GFX

Here is the code:

#define ENABLE_GxEPD2_GFX 0
#include <GxEPD2_BW.h>
#include <U8g2_for_Adafruit_GFX.h>

#if defined(__AVR)
#define MAX_DISPLAY_BUFFER_SIZE 800 
#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
GxEPD2_BW<GxEPD2_290, MAX_HEIGHT(GxEPD2_290)> display(GxEPD2_290(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7));
#endif

U8G2_FOR_ADAFRUIT_GFX u8g2Fonts;

void setup()
{
  display.init();
  u8g2Fonts.begin(display); // connect u8g2 procedures to Adafruit GFX
  delay(1000);
}

void loop()
{
  display.fillScreen(GxEPD_WHITE);
  displayValues();
  delay(1000);  
}


void displayValues()
{
  
  float number; //A0 Value
  float number2; // A0 Value converted to voltage
  number = analogRead(A0);
  number2 = number/1023 * 5;
  

  display.setRotation(1); // 0--> No rotation ,  1--> rotate 90 deg
  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

  u8g2Fonts.setFont(u8g2_font_logisoso32_tr); //u8g2_font_logisoso32_tn--->numbers only to save memory ; u8g2_font_logisoso32_tr , u8g2_font_logisoso32_tf -->numbers&letters
  
  uint16_t x = 150;
  uint16_t y = 50;
  display.setPartialWindow(0, 0, display.width(), 296); //this sets a window for the partial update, so the values can update without refreshing the entire screen.
  display.firstPage();
  do
  {
    display.fillScreen(bg);

    // Display A0 value
    u8g2Fonts.setCursor(90, y); 
    u8g2Fonts.print("A0:");
    u8g2Fonts.setCursor(x, y);
    u8g2Fonts.println(number,1);
  
   // Display Voltage of A0
   u8g2Fonts.setCursor(50, y +40);
    u8g2Fonts.print("Volts:");
   u8g2Fonts.setCursor(x, y + 40);
   u8g2Fonts.println(number2,1);
  }
  while (display.nextPage());
}

I hope you've found this instructable useful!

Be the First to Share

    Recommendations

    • Backyard Contest

      Backyard Contest
    • Sculpt & Carve Challenge

      Sculpt & Carve Challenge
    • Build a Tool Contest

      Build a Tool Contest

    2 Comments

    0
    lorenzobianchimu
    lorenzobianchimu

    7 months ago

    Dear Canadian,
    I am working around e-ink displays. I found your sketch very interesting for partial refresh and for the use of fonts so I tested it on my hardware. To don't make mistakes I used the same Arduino and Waveshare display as you. Once compiled, there are no errors but display doesn't wake up.
    Hardware is tested with other sketches.
    Do you have some tips about? Thank you in advance from Italy!