ESP32

Intermediate

I Built a Talking E-Paper Clock with an ESP32

Talking e-paper clock on a desk
Build This
Build time

Estimated cost

What You'll Need
  • Waveshare ESP32-S3 1.54" e-paper board (200 × 200, ES8311 codec, speaker)
  • USB-C cable for flashing

Watch It In Action

Most clocks just sit there silently. This one talks every hour and every half hour. I wanted something that felt alive on my desk, like a little timekeeper keeping me company while I work.

What it shows

  • The current time in big numbers
  • The full date: day of the week, month, date and year
  • A large day-of-month number you can read from across the room
  • A progress bar across the top that shrinks every minute and refills on the hour

On the hour it says something like "5:00", and on the half hour, "5:30". It uses 12-hour format with distinct AM and PM announcements, so 5 AM and 5 PM sound different.

The hardware

Everything runs on one Waveshare board: a 1.54-inch 200 × 200 e-paper display, an ESP32-S3, an audio codec and a speaker.

What happens at boot

The whole program is a single Arduino sketch of about 300 lines. On power-up, four things happen in order:

  1. Enable the e-paper power.
  2. Initialize the display over SPI.
  3. Wake up the audio codec.
  4. Connect to Wi-Fi, sync with an NTP server, draw the clock face, then turn Wi-Fi off.

After that first sync, the clock runs on the ESP32's internal real-time clock. No network, no cloud.

The pin that will silently break your build

GPIO 6 (e-paper power) and GPIO 42 (audio power) are both active-low on this board. Drive them LOW to turn the panel and speaker on. If your display is stuck on the factory image with no errors, check this first.

How it talks

The audio is pre-recorded, not synthesized. I generated 15 clips: 1 through 12, AM, PM and 30. They're stored as PCM in the ESP32's flash using the huge_app partition. To speak, it streams the right combination of clips, which takes about 2 seconds. The announcement plays after the screen updates, so the display already shows the new time when you hear it.

Beating e-paper ghosting

After a few partial updates, e-paper shows faint remnants of old text. So I use partial refreshes most of the time, because they're fast and don't flicker, and force a full refresh every 30th update. That clears the ghosting completely.

What I'd add next

  • Temperature and humidity: there's a sensor on the same I2C bus.
  • The onboard RTC chip: it drifts less than the ESP32's internal clock, so it could stay accurate for weeks without resyncing.
  • Deep sleep between minutes: right now the ESP32 stays awake polling the time. The e-paper holds its image, so it would look the same on microamps instead of milliamps.

If you build one, tag me or drop a comment. I'd love to see it.