← Projects
raspberry-pi intermediate Jul 15, 2026 ◑ 5 views ◯ 5 min read

Build a Raspberry Pi E-Ink Digital Photo Frame (Wired or Battery-Powered)

Build time: 1 day
Tools needed: 3D printer (optional, for enclosure)
Parts List
raspberry pie inkeinkphoto framepi zerowaveshareinkypythondiy

E-ink displays make genuinely great digital photo frames — unlike an LCD, they hold an image with zero power draw once drawn, look like actual printed paper instead of a glowing screen, and work beautifully in bright light where LCDs wash out. This build covers a Raspberry Pi driving an e-ink panel to cycle through a photo library, with options for both a plugged-in always-on frame and a battery-powered low-refresh version.

Hardware Needed

ComponentNotes Raspberry Pi Zero 2 WPlenty of power for this task and small enough to fit inside a slim frame — no need for a full-size Pi E-ink display HATWaveshare and Inky (Pimoroni) are the two common ecosystems — sizes from ~4" up to 13.3"+ depending on how large you want the frame. Color e-ink panels exist but have lower resolution/slower refresh than black-and-white/grayscale MicroSD card16GB+ is plenty since you're storing a photo library, not doing heavy compute Frame/enclosureA real picture frame with the backing modified to fit the Pi and panel, or a 3D printed enclosure — either works well PowerStandard micro-USB/USB-C power for an always-plugged-in build; a LiPo + charge board if going battery-powered with scheduled refreshes

Why E-Ink Specifically

Software Setup

  1. Flash Raspberry Pi OS Lite (headless, no desktop needed) to your SD card
  2. Enable SPI, which most e-ink HATs communicate over: sudo raspi-config → Interface Options → SPI → Enable
  3. Install your display's Python library — Waveshare and Inky both provide dedicated libraries with example scripts to get a test image displaying quickly
  4. Confirm the panel works with the manufacturer's demo script before writing any custom code — this isolates hardware/wiring issues from software issues early

Basic Display Script

Once your panel's library is confirmed working, a basic photo-cycling script follows this pattern (adjust import/init calls to match your specific display library):

from PIL import Image import time import os import random PHOTO_DIR = "/home/pi/photos" DISPLAY_SIZE = (800, 480) # match your panel's actual resolution def get_random_photo(): photos = [f for f in os.listdir(PHOTO_DIR) if f.lower().endswith(('.jpg', '.png'))] return random.choice(photos) def prepare_image(path): img = Image.open(path) img = img.convert('L') # grayscale, or appropriate mode for your panel img.thumbnail(DISPLAY_SIZE, Image.LANCZOS) # Center on a properly-sized canvas if the photo doesn't exactly match panel dimensions canvas = Image.new('L', DISPLAY_SIZE, 255) offset = ((DISPLAY_SIZE[0]-img.width)//2, (DISPLAY_SIZE[1]-img.height)//2) canvas.paste(img, offset) return canvas while True: photo = get_random_photo() img = prepare_image(os.path.join(PHOTO_DIR, photo)) # display.set_image(img) / display.show() — call matching your panel's library time.sleep(3600) # refresh once per hour

Refresh interval is worth thinking about deliberately — e-ink panels have a finite refresh cycle lifespan (typically rated for hundreds of thousands of refreshes, which sounds like a lot but adds up over years of frequent updates), so an hourly or even daily refresh is more appropriate for panel longevity than trying to update every few minutes.

Auto-Start on Boot

Set the script to run automatically via a systemd service so the frame starts displaying photos immediately on power-up without needing to SSH in and manually launch it:

sudo nano /etc/systemd/system/photoframe.service [Unit] Description=E-Ink Photo Frame After=network.target [Service] ExecStart=/usr/bin/python3 /home/pi/photoframe.py Restart=always User=pi [Install] WantedBy=multi-user.target sudo systemctl enable photoframe.service sudo systemctl start photoframe.service

Getting Photos Onto the Frame

A few options depending on how hands-off you want it:

Battery-Powered Version

If you want a fully wireless frame, the key changes:

Image Prep Tips

E-ink panels — especially grayscale ones — benefit from some preprocessing beyond a simple resize:

The hardware side is genuinely simple — most of the interesting work is in the image prep and refresh-scheduling logic, which is also where you can make this project distinctly yours: weather-reactive frames, "on this day" photo memories, or a shared family album that updates whenever someone adds a new photo remotely.