For a long while now I’ve had a weather/calendar/status display on the wall in my kitchen. Powered by a Raspberry Pi, it updates every few minutes. Recently I started thinking about extending the interface, adding a few buttons to choose which “page” might be active at any given time.
My hope was that I would be able to do a quick update to the display while the button “selection” UI was being interacted with. The term for this in the eInk/ePaper world is “partial update.”
After spending a lot of time researching and experimenting, I haven’t yet been successful, though I learned a lot in the process. At this point I need to pause my project, but I thought it might be worthwhile to jot down my notes thus far, in case they might be helpful to anyone else trying to do the same sort of thing.
Last Updated January 2023
My Display
I have a 7.5” ePaper display (Black/White, 800x480) and board from Waveshare. The Spec Doc (PDF) is available on their site.
Most of the displays that Waveshare sells seem to be manufactured by Good Displays, then Waveshare builds some boards and code, and sells/distributes.
The Code
Waveshare provides demo code and documentation for this display (and their other displays) on wiki on their website.
My status display uses some Ruby libraries to generate a BMP image, which is then transferred as-is to the display every few minutes.
How These Displays Work
This video by Applied Sciences on YouTube is a great place to start in understanding how these displays work, and how they can be manipulated.
The fundamental principle to understand is that the display uses pulses of AC power to create a charge differential that pulls the white/black capsules to different sides of the silos they float in. The pulses are necessary because applying a constant DC voltage would induce a charge in the structure of the display itself, and further refreshes would not be possible anymore. So these waveforms must be effective both in moving the ink capsules, as well as avoiding unnecessary charge inducement. To some extend these waveforms are a “secret sauce” of good display drivers (and, from what I can tell at least, a good part of the reason that Kindle displays seem so far ahead of the rest of the eInk world — they’re using complicated, probably very high frequency updates, maybe driven by hardware of a higher complexity than these other hobbyist boards; I’d love to know more).
Partial/Fast Updates
Most of these displays can be manipulated in such a way that you can update only a subsection of the display, at a higher rate than is possible when refreshing all the pixels at once. (See Waveshare sample code for some examples on some of their smaller displays).
Custom LUTs
When a screen refresh is performed, the display executes a series of AC pulses based on stored waveform data. The waveforms vary depending on the pixel transition. White -> White, White -> Black, Black -> White, etc. can all have different waveforms in use.
The Waveshare boards support overriding the waveforms with custom LookUp Tables (LUTs). The format is complicated, but you can find documentation in their spec docs; the Applied Sciences video is another good reference for these.
GxEPD
ZinggJM has some custom code supporting many, many panels; many of these have custom LUTs for doing fast/partial updates. It’s worth digging into those for examples of how LUTs work; or, if you’re satisfied, just use his code to drive your display(s).
Other Resources
This huge thread in the Arduino forums has a ton of little gems and tidbits about using these displays.
This is another fast-update project with code that might be helpful.
This is the code that Ben Krasnow (Applied Sciences) shared in his video.