First variation.
The first attempt I did in a project like this was using a Frameo ↗ digital photo frame to render images from my image server. Out of the box this uses a proprietary application to choose which photos to render, but most digital photo frames use Android under the hood in order to run their software.
By sideloading the digital photo frame, I was able to run just plain Android and use a web view to render Immich Kiosk ↗. I followed these instructions ↗.
Immich Kiosk pulls images from an album on my Immich ↗ server (a sort of self-hosted Google Photos) on my Ansible Homelab ↗.
This was a cool experiment and I find myself seeing photos from particularly meaningful moments of my life in passing all of the time. I wanted to go a little further and experiment with e-ink.
Make the desk a little more alive.
I’ve built a framed e-ink colour display that is built around Seeed Studio’s XIAO ePaper DIY Kit EE02 and its 13.3-inch Spectra 6 panel ↗. It sits in an IKEA RÖDALM ↗ wood-effect 31 × 41 cm frame and is mounted above my desk.
The panel refreshes slowly. For most typical applications, it wouldn’t be a great fit, but for an art display it works well as it is deliberately a slow experience. The frame can change with the day, a calendar cue, a weather event, or a manual button press with ease. This makes it a great fit for a desk display, and provides a great experimental way to try the e-ink tech out.
Another great part of an e-ink display is that it uses very little power, only drawing power when it needs to refresh. This means it can run on a small battery for days at a time, or even be powered by a solar cell.
Now, this isn’t the first of these panels to be used like this, and you’ll see a number of other examples in the inspiration section ↗ below, but for me this also represents a base experiment on which I’ll build for other aspects of my home and rural property usage. For example, the low power usage makes it a fantastic possibility for something like a greenhouse ↗ display powered by the sun.
A rotation of art.
The first experiment I wanted to try with the frame was a selection of illustrations, art, and other content that could show on a time-loop. For this, I launched aitjcize/esp32-photoframe ↗ onto the frame and aitjcize/esp32-photoframe-server ↗ on my Ansible Homelab ↗.
These two software packages, when combined, provide me with a good base to start experimenting with which colours, styles, and images look good with the limited 6 colours in the frame. There’s also Home Assistant ↗ integration, which means that I could automate changes easily in the future.
It was fairly straightforward to get started. The online web app is able to flash the frame’s built-in ESP32 device for me using esp32-photoframe/#flash ↗.
- Connect the board over USB-C.
- Click Install firmware and select the serial port.
- Wait for the flash to complete (about a minute).
- The device restarts and starts a PhotoFrame-XXXX WiFi AP.
- Connect, configure WiFi, you’re on.
Once it’s set up, you can connect it to the server software ↗ to upload images. I tried a number of images to start in order to figure out how colours work with the frame.
The first image.
I started by uploading freely available pictures from Unsplash ↗. The first one I chose, at random, was “Pastel spheres on gradient background” by Milad Fakurian ↗. It’s a bright and airy illustration with soft gradients.
The image rendered on the screen, however, it wasn’t very pleasant. You lose a lot of the gradients, you lose a lot of the depth, and the image is just generally washed out. This is something I expected to see when I chose the image to display, knowing that the frame only had six colours. It kind of was the first test to see just how washed out something with a large gradient of colours would feel.
Vintage illustrations.
Knowing that illustrations with rich gradients were not going to render well, I thought that I’d try more vintage illustrations, you know, travel posters or flora and different fauna.
These types of images tend to be from a time when a lot of screen printing or block printing was used and so instead of there being a number of gradients or different colours throughout there are solid blocks of colour. This lends itself well to a limited colour environment such as an e-ink screen.
I found that these images ended up rendering pretty well overall, but they still seemed dim. I also noticed that we needed to add in a better bleed concept as the screen is covered by the mat around the edges.
Bleed and Colour Algorithms.
First things first, I wanted to get the image better centred in the frame. Right now the left and right were pretty decent, but the top and bottom definitely were cut off too much. The first step here was a Python script that outputs a 1200×1600 image (matching the e-ink screen’s spec) for display by:
- scales the image to fit inside the frame while keeping aspect ratio
- centers the image
- fills the surrounding area with a smooth paper-coloured gradient sampled from the image’s existing margin.
After creating the bleed script, the next step was to experiment with better colour algorithms. This is called dithering. The Seeedstudio frame originally comes installed with Sensecraft software ↗, which also has image dithering tools.
Image Dithering
Image dithering is an algorithmic technique that uses patterns of dots to form colours that don’t actually exist when you have a limited palette of colours. This is achieved by tricking the eye into seeing missing colours, shades, or even smooth gradients. This is a perfect technique to use when you have only six colours, but most images show a lot more.
There are two algorithms I ended up using in this experiment. They are:
- Bayer 8x8: It uses a matrix to essentially cross-hatch the image algorithmically by comparing brightness against an 8x8 matrix, allowing fewer colours to be used but the overall colour count to be reduced
- Floyd-Steinberg: It uses an algorithm to go left to right, top to bottom, to scan each pixel. For each pixel, it will choose the closest matching colour from the limited palette available.
These two algorithms seem to help brighten the image, while some of the original attempts resulted in a more grey background. Using better dithering algorithms allowed a better overall image to be shown.
The Hong Kong poster above can be found at the Hong Kong Baptist University Library’s Art Collection ↗.
You may notice that the dithered image looks a lot brighter on a computer screen, almost like the image is ruined. The greens are very neon, the other colours are extremely bright, and it feels like the original image was lost. But this is because the computer screen can render it much brighter and a much more varied image. An e-ink screen, limited to six colours, is not able to do this, and so the image looks much better. Of course the image is materially changed. We lose some of the colour that we had in the original, but the overall vibe is kept, it’s bright, and it’s displayed well.
Next steps.
Well, the main goal is always having art on the display. I think there are a number of useful cues that I can leverage to better use it as kind of a notification area. For example, an upcoming calendar event when I’m present at the desk could trigger a refresh of the screen to give that notification, or at least put a banner up across the bottom. Severe weather alerts could also trigger something to show, or downtime on a Homelab service ↗.
The goal, however, is not a dashboard, especially with the high refresh time. The possibilities are numerous, and I’ll aim to find a balance between calm and informative.
- I still need to choose a battery. I wanted to wait to see how much depth in the frame I’ll be allowed to get as large a battery as possible. Right now I’m finding the USB cable with the nylon braiding doesn’t look out of place, though, so I may just leave it plugged in.
- I want to experiment with other cues, especially if I choose to leave it plugged in.
Conversation
Add a note.
Questions, corrections, and useful tangents are welcome. Sign in to join the conversation.