Projects / Hardware & Firmware

Today's Paper

A battery-powered 6″ e-paper display in a 10×15 cm IKEA picture frame, with a custom ESP32 board, low-power firmware and a server that renders what it shows.

ESP32 ESP-IDF KiCad PCB Design E-paper Low Power Python
Today's Paper
The finished frame showing a weather forecast rendered by the server.

Overview

Today’s Paper is an ordinary 10×15 cm IKEA picture frame with a 6″ e-paper panel where the photo would go. It shows a calendar, a weather forecast, the school lunch menu or a comic strip, and changes screens on a schedule. E-paper keeps its image without power, so the frame sleeps almost all the time. The design goal is one year on a single charge at two updates per day.

I built the whole system: the hardware, the ESP32 firmware and the server that renders what the frame shows.

Hardware

Behind the panel, a 3D-printed insert holds a custom ESP32 board, a LiPo battery and a Qi receiver. A ring of magnets in the back cover centers a MagSafe-style charger over the coil, and also holds the frame on a table stand. Pogo pads let me flash the board without opening the frame.

The frame opened from the back, showing the LiPo battery, the green main board, the Qi receiver coil and the display flex cable inside a 3D-printed insert.

With the back cover removed: battery, main board, Qi coil and the display flex cable.

The board is a 4-layer PCB that I designed in KiCad. Besides the ESP32, it has its own e-paper power supply (TPS65185, generating the panel’s +22 V / −20 V / ±15 V rails and VCOM) and a Li-ion charger with status outputs.

3D render of the main board with the ESP32-WROVER module and the TPS65185 e-paper power IC.

The main board, rendered from the KiCad design.

Because the device sleeps almost all the time, sleep current matters more than the energy used during an update, and the power design is built around that:

  • Power path: a P-MOSFET and a Schottky diode switch the system supply between the battery and external power. On battery, the MOSFET connects the cell with almost no voltage drop. When a Qi charger or USB is connected, the board runs from that supply, so the battery is only being charged.
  • Low standby losses: the ESP32 runs from an MCP1700 LDO (1.6 µA typical quiescent current). The battery voltage is measured through a 13 MΩ divider that draws about 0.3 µA, with a 100 nF capacitor on its output supplying the ADC’s sampling charge, so the high impedance doesn’t hurt accuracy.
  • Accurate wake-ups: the ESP32’s RTC runs from an external 32.768 kHz crystal instead of the internal RC oscillator, so the frame still wakes up when the server scheduled it, even after hours of sleep.
  • Monitoring: on every wake-up the frame reports its battery voltage and temperature to the server, which logs them. That way I can follow battery drain over months without touching the device.

The log shows the result: one charge lasts about 1,500 screen updates.

Line chart of battery voltage against screen updates for six charge cycles of one frame. Every cycle starts near 4.1 V, stays between 3.9 and 3.7 V for most of the charge, and drops to empty at about 3.0 V after 1,477 to 1,833 updates.

Battery voltage from the server log over six charge cycles of one frame, smoothed with a rolling median. One cycle was recharged at 3.35 V, just before empty.

Main schematic sheet: ESP32-WROVER, PCA9535 I/O expander, CH340C USB-serial and the 34-pin display connector.

The top-level schematic sheet. Click for the full 3-sheet PDF.

Firmware and server

The firmware (C++, ESP-IDF) wakes up, downloads a pre-rendered image, draws it and goes back to deep sleep. When external power is connected, it handles BLE WiFi provisioning and over-the-air updates instead, so those never run on battery.

The server (Python, FastAPI) renders each frame’s screens ahead of time from Jinja templates, in the panel’s native grayscale format. It also tells the frame when to wake up next, so the schedule lives entirely on the server and the device stays simple.

More

The full details are in the documentation and the PCB, firmware and server repositories.