ESP32
Intermediate

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.
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.
Everything runs on one Waveshare board: a 1.54-inch 200 × 200 e-paper display, an ESP32-S3, an audio codec and a speaker.
The whole program is a single Arduino sketch of about 300 lines. On power-up, four things happen in order:
After that first sync, the clock runs on the ESP32's internal real-time clock. No network, no cloud.
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.
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.
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.
If you build one, tag me or drop a comment. I'd love to see it.