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!