This page goes over how to use the 2.9" Tri-Color eInk displays with CircuitPython.
2.9" Tri-Color eInk Display and FeatherWing Revision
- As of June 20, 2025 - The tri-color display and FeatherWing have been updated (old ones discontinued) to now use a spiffy modern SSD1680 chip - we have support in CircuitPython/Python/Arduino for it!


CircuitPython eInk displayio Library Installation
To use displayio, you will need to install the appropriate library for your display.
First make sure you are running the latest version of Adafruit CircuitPython for your board. You will need the latest version of CircuitPython.
Next you'll need to install the necessary libraries to use the hardware--carefully follow the steps to find and install these libraries from Adafruit's CircuitPython library bundle. The introduction guide has a great page on how to install the library bundle for both Express and non-Express boards.
You will need to copy the appropriate displayio driver from the bundle lib folder to a lib folder on your CIRCUITPY drive. The displayio driver contains the initialization codes specific to your display that are needed to for it to work. Since there is more than one driver, you will need to copy the correct file over. Here is a list of each of the displays and the correct driver for that display.
To use the eInk displays with displayio, you will need to use the latest version of CircuitPython and a board that can fit displayio
. See the Support Matrix to determine if displayio
is available on a given board: https://circuitpython.readthedocs.io/en/latest/shared-bindings/support_matrix.html
Image File
All of the examples below use the same bitmap image. You'll need the display-ruler.bmp bitmap file on your CIRCUITPY drive.
Copy display-ruler.bmp into the root directory of your CIRCUITPY drive.
As of June 20, 2025 - The displays have been updated to use the SSD1680 chip
As of June 20, 2025, the 2.9" Tri-Color display and FeatherWing use the Adafruit_CircuitPython_SSD1680 library. To easily get all the required files and libraries, you can click the Download Project Bundle link at the top of the example code below. Just unzip, open the folder that corresponds to the version of CircuitPython you have installed, and copy the contents to the CIRCUITPY drive.

# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries # SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya # # SPDX-License-Identifier: Unlicense """Simple test script for Adafruit 2.9" Tri-Color eInk Display Breakout Supported products: * Adafruit 2.9" Tri-Color eInk Display Breakout * https://www.adafruit.com/product/1028 """ import time import board import displayio from fourwire import FourWire import adafruit_ssd1680 displayio.release_displays() # This pinout works on a Metro M4 and may need to be altered for other boards. spi = board.SPI() # Uses SCK and MOSI epd_cs = board.D9 epd_dc = board.D10 epd_reset = board.D5 epd_busy = board.D6 display_bus = FourWire(spi, command=epd_dc, chip_select=epd_cs, baudrate=1000000) time.sleep(1) display = adafruit_ssd1680.SSD1680( display_bus, width=296, height=128, highlight_color=0xFF0000, rotation=270, ) g = displayio.Group() pic = displayio.OnDiskBitmap("/display-ruler.bmp") t = displayio.TileGrid(pic, pixel_shader=pic.pixel_shader) g.append(t) display.root_group = g display.refresh() print("refreshed") time.sleep(120)
For the FeatherWing, you will want to change the epd_reset
and epd_busy
values to None
:
epd_reset = None epd_busy = None
Save it to your CIRCUITPY drive as code.py and it should automatically run. Your display will look like this:

Between November 16, 2022 and June 20, 2025 the 2.9" Tri-Color eInk display used the UC8151D chipset.
If you purchased the 2.9" Tri-Color eInk display between of November 16, 2022 and June 20, 2025, the display has the UC8151D chipset and uses the Adafruit_CircuitPython_UC8151D library. To easily get all the required files and libraries, you can click the Download Project Bundle link at the top of the example code below. Just unzip, open the folder that corresponds to the version of CircuitPython you have installed, and copy the contents to the CIRCUITPY drive.

UC8151D Display Usage
In the examples folder for your UC8151D displayio driver, there should be a test for your display which is listed here:
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT """Simple test script for Adafruit 2.9" 296x128 tri-color display Supported products: * Adafruit 2.9" Tri-Color Display Breakout * https://www.adafruit.com/product/1028 """ import time import board import displayio from fourwire import FourWire import adafruit_uc8151d # Used to ensure the display is free in CircuitPython displayio.release_displays() # Define the pins needed for display use # This pinout is for a Feather M4 and may be different for other boards spi = board.SPI() # Uses SCK and MOSI epd_cs = board.D9 epd_dc = board.D10 epd_reset = board.D5 epd_busy = board.D6 # Create the displayio connection to the display pins display_bus = FourWire(spi, command=epd_dc, chip_select=epd_cs, reset=epd_reset, baudrate=1000000) time.sleep(1) # Wait a bit # Create the display object - the third color is red (0xff0000) display = adafruit_uc8151d.UC8151D( display_bus, width=296, height=128, rotation=270, busy_pin=epd_busy, highlight_color=0xFF0000, ) # Create a display group for our screen objects g = displayio.Group() # Display a ruler graphic from the root directory of the CIRCUITPY drive pic = displayio.OnDiskBitmap("/display-ruler.bmp") t = displayio.TileGrid(pic, pixel_shader=pic.pixel_shader) g.append(t) # Place the display group on the screen display.root_group = g # Refresh the display to have it actually show the image # NOTE: Do not refresh eInk displays sooner than 180 seconds display.refresh() print("refreshed") time.sleep(180)
You will want to change the epd_reset
and epd_busy
to the correct values. If you wired it up as shown on the Wiring page, you will want to change it to these values:
epd_reset = board.D8 epd_busy = board.D7
Save it to your CIRCUITPY drive as code.py and it should automatically run. Your display will look something like this:
- Before November 16, 2022, the 2.9" Tri-Color eInk display used the IL0373 chipset.
- Before June 24, 2025, the 2.9" Tri-Color eInk FeatherWing used the IL0373 chipset.
If you purchased the 2.9" Tri-Color eInk display before November 16, 2022, or the FeatherWing before June 20, 2025, they used the IL0373 chipset with the Adafruit_CircuitPython_IL0373 library. To easily get all the required files and libraries, you can click the Download Project Bundle link at the top of the example code below. Just unzip, open the folder that corresponds to the version of CircuitPython you have installed, and copy the contents to the CIRCUITPY drive.

IL0373 Display Usage
In the examples folder for your IL0373 displayio driver, there should be a test for your display which is listed here:
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT """Simple test script for Adafruit 2.9" 296x128 tri-color display Supported products: * Adafruit 2.9" Tri-Color Display Breakout * https://www.adafruit.com/product/1028 """ import time import board import displayio import fourwire import adafruit_il0373 # Used to ensure the display is free in CircuitPython displayio.release_displays() # Define the pins needed for display use # This pinout is for a Feather M4 and may be different for other boards spi = board.SPI() # Uses SCK and MOSI epd_cs = board.D9 epd_dc = board.D10 epd_reset = board.D5 epd_busy = board.D6 # Create the displayio connection to the display pins display_bus = fourwire.FourWire( spi, command=epd_dc, chip_select=epd_cs, reset=epd_reset, baudrate=1000000 ) time.sleep(1) # Wait a bit # Create the display object - the third color is red (0xff0000) display = adafruit_il0373.IL0373( display_bus, width=296, height=128, rotation=270, busy_pin=epd_busy, highlight_color=0xFF0000, ) # Create a display group for our screen objects g = displayio.Group() # Display a ruler graphic from the root directory of the CIRCUITPY drive pic = displayio.OnDiskBitmap("/display-ruler.bmp") t = displayio.TileGrid(pic, pixel_shader=pic.pixel_shader) g.append(t) display.root_group = g display.refresh() print("refreshed") time.sleep(180)
For the FeatherWing, you will want to change the epd_reset
and epd_busy
values to None
:
epd_reset = None epd_busy = None
Save it to your CIRCUITPY drive as code.py and it should automatically run. Your display will look like this:

Page last edited June 30, 2025
Text editor powered by tinymce.