Skip to Content

Interfacing Arduino To An E-ink Display

Interfacing Arduino To An E-ink Display

In this article, I will take you through a step-by-step guide to start with an E-ink display. By the end of this article, you can control an E-ink display using Arduino and display images and text on the screen.

E-ink displays find their applications in a lot of areas. You can find them in the stores which display the part name and the price, in the outdoor sports accessories such as speedometers on bicycles, watches, etc.. Amazon Kindle E-reader is one example that provides a very smooth reading experience and brings you weeks of battery life.

By the end of this article, you will know the benefits of the E-ink reader, basic working principle, step-by-step Arduino and E-ink display connection guide and example Arduino code.

Let’s get started.

Components Needed To Build Arduino And E-ink Display Project

Hardware Components

Software

Makerguides.com is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for sites to earn advertising fees by advertising and linking to products on Amazon.com.

Basics of E-ink Display

Basic Working Principle Of The E-ink Display

The E-ink stands for electronic ink. E-ink or e-Paper displays based on a technology where a thin film of microparticles aligns based on the charge.

You can either display black or white in that tiny cell.

The orientation can only be changed once you apply the current in the reverse direction.

Since power is always necessary to clear the Display, you can keep the image on the Display as long as you want without worrying about power consumption.

The E-ink display remains the same for weeks or even months without power. 

The Display looks more realistic to the eyes. The Display gets better as you move to a well-lit area (same as how you experience while reading a book in a darker and a more lit area).

The Applications Of The E-ink Display

The E-ink display doesn’t need the power to retain the contents on the screen. Hence it finds its application in many areas where you want to display content that doesn’t change frequently. Some of the applications are listed below.

Outdoor displays – Fuel price displays, Bus route displays, Information about the monuments, weather information, etc. The displays need no light in the daytime and consume no power while the display is static. It helps to save power and also provides a very readable display even in bright sunlight.

Shelf Labels – The prices won’t change very often. Hence, E-ink displays are an excellent reprogrammable price-label option. The labels can display price information, product name, or both.

Automobiles – Pedometer for cycles, dashboard displays, weather display information system, Next stop display in long route vehicles, booking information of the train seats, etc. 

The Pinouts of the E-ink Display

The pin details of the E-ink display are given in the table below. Make sure to buy the E-ink display, which comes with the datasheet.

Let’s get started. Below is the Pinout of the display module where you can see the pin connections and the labels.

Pinout of e-Paper display
Pinout of e-Paper display
Pin LabelPin TypeDescription
VINPowerThis is the input power pin. You can supply 5 V from the Arduino here. There is a 3.3 V linear voltage regulator on the display module. This pin serves as the input for the regulator. 
3V3PowerThis is the output of the voltage regulator. The 3.3 V powers the display controller IC. 
You can also use this to power other modules, but ensure that the current consumption is kept below the regulator voltage rating.
GNDPowerGround connection pin. 
SCKSignalSPI Clock – Clock Pin of the serial peripheral interface
MISOSignalSPI MISO – Master In Slave Out pin of the Arduino. This is the input pin of the Display controller and the output pin of the Arduino.
MOSISignalSPI MOSI – Master Out Slave In – This is the Arduino output pin and input pin for the display controller.
ECSSignalE-ink Chip Select
D/CSignalE-ink data command
SRCSSignalSRAM chip select
SDCSSignalSD Card chip select
RSTSignalE-ink reset
BUSYSignalE-ink Busy signal
ENASignalEnable pin. This is connected to the Enable pin of the 3.3 V regulator. You can drive the pin Low to save Power when you have to. 
When you disable the display controller, the display RAM and the SD Card (if present) will all get disabled. You have to reinitialize the board again. 

Note that the display controller we have chosen here has an SRAM IC. The SRAM can be used to store the frame buffers. Depending on the display size, the memory required will vary. For a larger display, the internal RAM present in the Arduino can quickly become a bottleneck. Hence, many of the display boards will have an SRAM chip. 

You can prepare the image/contents in the SRAM. Once ready, you can start loading the display controller with the data from SRAM. Most of the available display libraries provide this support already. 

In the below table, you will find a look-up table for the connection diagram. You can use this table as a reference for other similar E-ink modules.

Most of the pins are configurable. You have to ensure that you also update the code to reflect the pin mapping changes you have made.

Arduino Pin ConnectionsE-ink Display module connections
Pin 1 of the ICSP headerMISO – SPI Master In Slave Out
Pin 3 of the ICSP headerCLK – SPI Clock Pin
Pin 4 of the ICSP headerMOSI – SPI Master Out Slave In
GND GND – Ground connection
GPIO Pin 5SDCS – SD card Chip select pin
GPIO Pin 6SRCS – SRAM Chip Select
GPIO Pin 7BUSY – Busy pin connection for E-ink
GPIO Pin 8RST – Reset Pin of the E-ink controller
GPIO Pin 9 ECS – E-ink Chip select pin
GPIO Pin 10D/C – Data Command Pin

In the next section, you will find the step-by-step guide to complete the required connections between Arduino and the E-ink module.

How To Connect The E-ink Display To The Arduino UNO?

The details required to complete the Arduino and the E-ink display are given to you in this section. The final connection should look similar to the image below.

How To Connect The E-ink Display To The Arduino UNO
Complete wiring of E-Ink Display with Arduino

Step 1: Let us begin with the Ground connection

Ground connection

It is a best practice to start the connections with the ground (GND) pins first. Pin GND of the display goes to the GND pin of the Arduino. You can choose any of the GND pins available. You can select any of the GND pins available to complete the connection.

Step 2: Connect the 5V pin

Connect the 5V pin

Connect the 5 V pin on the Arduino to the VIN pin of the display module.

The 5 V pin on the Arduino is directly the USB power (when Arduino is powered from the USB cable connected to a computer). 

Step 3: Connect the ECS Pin

Connect the ECS Pin

ECS is the chip select pin of the E-ink display controller. Connect this to Pin 9 of the Arduino UNO. 

Step 4: D/C  Connection between Display and the Arduino

Connection between Display and the Arduino

Connect pin 10 on the Arduino UNO to Pin D/C of the E-ink display module. D/C is the Data/Command of the E-ink display. 

Step 5: SRCS Pin Connection

SRCS Pin Connection

SRCS pin is a SRAM Chip select pin. Connect SRCS to Pin 6 of the Arduino

Step 6: Reset pin connection

Reset pin connection

RST pin is the E-ink display controller Reset pin. Connect RST pin to the digital pin 8 of the Arduino UNO.

Step 7: BUSY pin connection

BUSY pin connection

Connect the Display board’s BUSY pin to the digital pin 7 of the Arduino.

Step 8: SDCS Pin connection

SDCS Pin connection

The SDCS pin is the chip select pin for the SD Card on the display module. Connect the SDCS pin to the digital pin 5 on the Arduino. 

Step 9: ICSP SCK Connection

ICSP SCK Connection

The ICSP SCK is present on a separate 6-pin connector. Connect the SCK pin of the Display module to the ICSP_SCK pin on the Arduino.

Step 10: ICSP MISO Connection

ICSP MISO Connection

The ICSP MISO is present on the Pin 1 position of the 6-pin connector. Connect the MISO pin of the Display module to the ICSP_MISO pin on the Arduino.

Step 11: ICSP MOSI Connection

ICSP MOSI Connection

Congratulations! This completes the required hardware connections.

Arduino Code Example For The E-ink Display Project

In this section, you will install the required libraries and run an example code to ensure that the connections and setup are fine. Let us get started. 

Install the libraries to start with. Go to Tools → Manage Libraries. Search for “EPD” in the search box.

Once you find the Adafruit EPD library, Click on the “Install” button.

Adafruit EPD library in Library Manager
Adafruit EPD library in Library Manager

You may be prompted with the option to install all dependent libraries. Click on “Install All” to install all the linked and missing libraries in one shot.

install all the linked and missing libraries in one shot

This completes the required  library setup. Now we will see the example code.

The Complete Arduino Code

Follow the image below to load an example image from the libraries you have installed in the previous section.

Example code for E-Ink display
Example code for E-Ink display

And here is the code for this specific example:

#include "Adafruit_ThinkInk.h"
 
#define EPD_DC      10 // can be any pin, but required!
#define EPD_CS      9  // can be any pin, but required!
#define EPD_BUSY    7  // can set to -1 to not use a pin (will wait a fixed delay)
#define SRAM_CS     6  // can set to -1 to not use a pin (uses a lot of RAM!)
#define EPD_RESET   8  // can set to -1 and share with chip Reset (can't deep sleep)
 
// 1.54" 152x152 Tricolor EPD with ILI0373 chipset
//ThinkInk_154_Tricolor_Z17 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY);
 
// 1.54" 152x152 Tricolor EPD with SSD1680 chipset
//ThinkInk_154_Tricolor_RW display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY);
 
// 1.54" 200x200 Tricolor EPD with SSD1681 chipset
//ThinkInk_154_Tricolor_Z90 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY);
 
// 2.13" Tricolor EPD with SSD1680 chipset
//ThinkInk_213_Tricolor_RW display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY);
 
// 2.13" Tricolor EPD with IL0373 chipset
//ThinkInk_213_Tricolor_Z16 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY);
 
// 2.7" Tricolor Featherwing or Breakout with IL91874 chipset
//ThinkInk_270_Tricolor_C44 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY);
 
// 2.7" Tricolor Featherwing or Breakout with EK79686 chipset
//ThinkInk_270_Tricolor_Z70 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY);
 
// 2.9" Tricolor Featherwing or Breakout with IL0373 chipset
ThinkInk_290_Tricolor_Z10 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY);
// 2.9" Tricolor Featherwing or Breakout with UC8151D chipset
//ThinkInk_290_Tricolor_Z13 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY);
// 2.9" Tricolor Featherwing or Breakout with SSD1680 chipset and negative offset
//ThinkInk_290_Tricolor_Z94 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY);
 
//ThinkInk_420_Tricolor_RW display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY);
//ThinkInk_420_Tricolor_Z21 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY);
 
 
void setup() {
  Serial.begin(115200);
  while (!Serial) { delay(10); }
  Serial.println("Adafruit EPD full update test in red/black/white");
  display.begin(THINKINK_TRICOLOR);
}
 
void loop() {
  Serial.println("Banner demo");
  display.clearBuffer();
  display.setTextSize(3);
  display.setCursor((display.width() - 144)/2, (display.height() - 24)/2);
  display.setTextColor(EPD_BLACK);
  display.print("Tri");  
  display.setTextColor(EPD_RED);
  display.print("Color");  
  display.display();
 
  delay(15000);
 
  Serial.println("Color rectangle demo");
  display.clearBuffer();
  display.fillRect(display.width()/3, 0, display.width()/3, display.height(), EPD_BLACK);
  display.fillRect((display.width()*2)/3, 0, display.width()/3, display.height(), EPD_RED);
  display.display();
 
  delay(15000);
 
  Serial.println("Text demo");
  // large block of text
  display.clearBuffer();
  display.setTextSize(1);
  testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit.", EPD_BLACK);
  display.display();
 
  delay(15000);
 
  display.clearBuffer();
  for (int16_t i=0; i<display.width(); i+=4) {
    display.drawLine(0, 0, i, display.height()-1, EPD_BLACK);
  }
 
  for (int16_t i=0; i<display.height(); i+=4) {
    display.drawLine(display.width()-1, 0, 0, i, EPD_RED);
  }
  display.display();
 
  delay(15000);  
}
 
 
void testdrawtext(const char *text, uint16_t color) {
  display.setCursor(0, 0);
  display.setTextColor(color);
  display.setTextWrap(true);
  display.print(text);
}

The code snippet below shows the pin mapping. The pin mapping can be updated based on your actual hardware connections.

#define EPD_DC      10 // can be any pin, but required!
#define EPD_CS      9  // can be any pin, but required!
#define EPD_BUSY    7  // can set to -1 to not use a pin (will wait a fixed delay)
#define SRAM_CS     6  // can set to -1 to not use a pin (uses a lot of RAM!)
#define EPD_RESET   8  // can set to -1 and share with chip Reset (can't deep sleep)

The Tri color program output will look similar to this

The Tri color program output

Conclusion

That concludes the article on the E-ink display. I hope this article gave you some helpful information regarding applications and Arduino E-ink project examples.

If you are looking for a nice application for an E-Ink display, have a look at the Weather Station on e-Paper Display tutorial.

Feel free to ask in the comment section and Happy Tinkering ; )