You are currently viewing Beyond 6 Colors: Exploring Dithering on Spectra 6-color E-Ink Displays

Beyond 6 Colors: Exploring Dithering on Spectra 6-color E-Ink Displays

I have tested the XIAO ePaper DIY Kit (ESP32-S3) – EE04 from Seeed Studio in depth. While its 6-color Spectra 6 display is impressive out of the box, I wanted to see if software could overcome hardware limitations. In this post, I’ll share how I’ve pushed this hardware to its limits by using dithering techniques to simulate an entirely new range of color tones and shades.

This post is divided into the following sections:

  1. Hardware Analysis

  2. How SPECTRA 6 E-INK Works

  3. The Challenge of SPECTRA 6

  4. Conclusion

Hardware Analysis

The hardware is composed of two elements. The first one is the controller board. It features several push buttons, an ON/OFF switch and a charging circuit to power the device via battery and charge it through the USB connector. The main components are an ESP32-S3 Plus and two flat cable connectors (24-pin and 50-pin) to connect our e-paper displays depending on their specifications.

While it is quite well-known, the integration of an ESP32-S3 offers great development opportunities thanks to its easy-to-use Wi-Fi and BLE support. I think it’s an excellent choice. There are also modules developed with an nRF instead of an ESP. Evaluating this option is important because the idle power consumption of nRF chips is usually much better than the power consuption of an ESP, which could significantly increase battery life.

xiaoi_epaper_board

Secondly, there is the e-paper display, which you can choose in different sizes: 1.54, 2.13, 2.9, and up to 7.5 inches. You can also choose between monochromatic displays or versions with up to 6 colors.

xiaoi_epaper_display

How SPECTRA 6 E-INK Works

In my case, I acquired the 7.3″ Spectra™ 6 E-Ink display, which supports up to 6 colors: White, Black, Yellow, Red, Green, and Blue. As with other Seeed Studio terminals, it can be configured using their SenseCraft web application if you prefer not to program and want something ready to go quickly. I won’t go into detail about that, as there is plenty of information online and it is quite intuitive. However, I prefer the DIY approach, so I started developing something from scratch.

 First of all, these types of color displays have a much slower full-screen refresh rate compared to monochromatic ones. This may seem obvious, as the canvas must be refreshed for each color independently. This is because the E-Ink Spectra 6 / ACeP terminal contains microcapsules with several color pigments inside. Depending on the voltage applied to each pixel, a specific colored fluid is moved toward the visible surface so we can see it, while the other colors for that pixel remain hidden.
GIF from: https://www.eink.com/tech/detail/How_it_works

spectra_gif

Since the color is physically formed within each pixel, refreshing all pixels takes time. It is important to highlight this for your implementations: you won’t be able to create content that requires frequent updates. A full refresh takes between 20 and 30 seconds, during which the screen flashes intensely as the pigments are rearranged. This rules it out for clocks with second hands or real-time notifications, but makes it the ideal candidate for static dashboards, signage, or low-power digital art.

6Color Dashboard Spectra

 

Regarding programming the display via the Arduino IDE, Seeed Studio provides a guide on how to do it at https://wiki.seeedstudio.com/epaper_ee04/ using their Seeed_GFX library, which is based on TFT_eSPI. I have encountered some limitations, such as the inability to perform hardware screen rotation, but for basic tasks like drawing pixels, rectangles, strings, and setting fonts, it works well.

The Challenge of SPECTRA 6 E-INK

Aside from the 6 native colors, I wanted to investigate whether it was possible to achieve more shades using techniques like dithering. This process involves simulating intermediate colors by creating specific pixel patterns, effectively “tricking” the eye into seeing more variety even though the terminal can only toggle between the six available colors. While dithering is commonly used in image processing to convert high-color photos into e-paper formats (like the Floyd-Steinberg algorithm), it is rarely applied directly to coding.

My goal was to research the application of dithering techniques to simulate a wider range of colors when drawing basic shapes: such as rectangles, lines, or filled logos. These are the exact graphical primitives provided by standard Arduino and ESP32 libraries.

Of all the patterns I tested (which you can see in the photos below), the one that gave me the best results was the simplest: a “50% checkerboard” between two colors. This follows a basic A-B-A-B pattern.

checkerboard_50

I also tried other patterns like Rotated Bayer, which worked well for certain colors, but for my specific needs but for my specific needs, it introduced noticeable geometric artifacts that distracted from the clean lines of the UI elements. While more complex algorithms like Rotated Bayer or Error Diffusion are excellent for photographic gradients, they often struggle with small-scale graphical primitives. The 50% checkerboard, on the other hand, maintained a perfect balance between color blending and structural clarity, making it the most reliable choice for drawing sharp, multi-tone shapes on the Spectra 6 display.

Dithering MethodTechnical Description
Checkerboard 50%Alternates pixels in a chessboard pattern to simulate a 50/50 blend. Simple and very fast to render.
Triple + WHITE 70/20/10Uses three colors with specific proportions (e.g., 70% color A, 20% color B, 10% white) to simulate lighter tones.
Triple + BLACK 70/20/10Same as above, but uses black instead of white to simulate darker or deeper shades.
Bayer 4×4Ordered dithering using a 4×4 matrix with predefined thresholds. Produces smooth and regular patterns.
Bayer RotatedA rotated variant of the Bayer 4×4 to avoid visible repetitive patterns. Improves visual dispersion.
Clustered 3 colors (WHITE)Groups similar pixels to form color “spots.” Frequently used in halftone-style printing.
CoarseFine (dens 30)Combines thick and thin patterns to control blend density. Useful for simulating textures.
ErrorDiffusion ApproxPropagates quantization error to neighboring pixels for smooth transitions. Classic example: Floyd–Steinberg.
Spectra 6 e-ink dithering patterns

With that pattern, I decided to mix all the colors available on the display.

As you can see, these resulting colors are quite effective for drawing various shapes with a polished look. Colors like Purple, Brown, and Sky Blue are very accurate; however, in my opinion, the blends mixed with white don’t quite manage to trick the eye enough.

Next, I ran some tests printing drawings to see how the colors behaved. While a specific color might look great in a geometric shape like a rectangle, it might not perform as well in other types of images.

Spectra 6 e-ink dithering patterns 2
Spectra 6 e-ink dithering patterns 3

As you can see, I have drawn five suns at the top using the display’s native pure colors, and at the bottom, the colors resulting from mixing them. Even when drawing suns, the colors remain very effective. In this way, we have managed to achieve illusory colors for:

 

ColorNative on display?Dithering
BlackYes
WhiteYes
RedYes
YellowYes
GreenYes
BlueYes
OrangeNoRed + Yellow
Light YellowNoYellow + White
LimeNoGreen + Yellow
PurpleNoRed + Blue
BrownNoRed + Green
CyanNoGreen + Blue
Light PinkNoRed + White

Conclusion

In summary, this kit is a great demonstration of how far e-ink technology has come in recent years. It’s not just about the six native colors, but also about what can be achieved by playing with patterns and color blending. The combination of the ESP32-S3 with the Spectra 6 display offers plenty of room for experimentation: ranging from information panels to more elaborate interfaces that take advantage of the low power consumption and the unique aesthetic of ePaper.

Throughout this post, I’ve highlighted what truly matters when working with these displays: color behavior, limitations, which combinations work best, and what to expect from the refresh rate. These are the details that make all the difference when you start designing icons, layouts, or dashboards that actually look good.

Ultimately, this kit is an excellent foundation for anyone looking to tinker with ePaper without getting bogged down in complexity. It allows you to learn, test ideas, and better understand how these multicolor panels function. Above all, it opens the door to projects that can look visually stunning if you play to the screen’s strengths.

What do you think of the results? The theory is clear, but practice is where it gets interesting. In my next post, I will explain how to convert images into arrays and display them as efficiently as possible. It’s a process with its own set of tricks, especially regarding multicolor ePaper, so I’ll break it down step-by-step so anyone can implement it easily.

This Post Has 6 Comments

  1. Ray

    Looking forward to your next post, I’m interested in how to achieve it.

    1. MyEmbeddedStuff

      Hi Patrick
      Orange is not natively supported. However, in the post I mention that it’s possible to achieve that color with dithering, but it’s not natively supported by the display.

Leave a Reply