Files
website/content/projects/garmin-eink/index.md
T
2026-02-20 16:14:45 +00:00

3.1 KiB

title, date, draft, image, summary, tags
title date draft image summary tags
Garmin Eink 2026-02-20T15:42:06Z false /projects/garmin-eink/featured.jpg Using an Eink display with an ESP32 to track and motivate me for a virtual running challenge
ESP32
Self-Hosting
<style> section img, .content img, article img { max-width: 50% !important; height: auto !important; display: block; margin: 2rem auto; border-radius: 8px; } </style>

📋 Project Highlights

  • Goal: Show my running progress on my desk
  • Tech Stack: Python, ESP32, C#
  • Outcome: A clean and simple setup that works reliably

For christmas my wife got me a virtual running challenge. I have to run 80km with a smart watch and at the end I get a nice Scooby-Doo medal. The issue is, now that everything requires its own app I forget to open it. My Garmin watch tracks all my running and syncs it to the running app but I wanted a way see my progress, clearly on my desk in the hope it will motivate me to get out and run more.

I had a waveshare 4.2" eink display in my drawer that ive been looking to find a good use for. A quick search only and I found a python wrapper that can pull data from Garmin connect and suddenly I had all the pieces to put this project together.


Step 1 - Getting the Garmin Data

I found this brilliant tool online called Python Garmin Connect that allows you to input your Garmin account details and pull specific data from their API. The tool was installed and setup up as a system service on my server and the results servered with a Caddy web server.

Step 2 - Displaying data on the eink screen

In VS Code I installed platform IO and connected my ESP32. The code was written to connect to wifi, grab the data from the web server and display it to the eink. I gave it a title and a progress bar with percentage to clearly show how much I have completed. I also added a Last Updated time stamp and logic to put the ESP to deep sleep and only update each morning after my typical workout time slot.

Early basic setup

I later decided it made more sense to show todays date at the botton my the page, making it double as a basic daily calender.

One of the greatest challenges was my desicion to include an image. An easier option would have been to buy an ESP32 with a micro SD card slot to give me an easier way of storing the image. Wanted to make this work without buying anything new I decided to stream the image from my Caddy server directly ro the display. With some AI magic I had a bash script that would convert any image I gave it to a resized monochrome bitmap suitable for the basic eink display. The great thing about using this approach is it makes changing the image for a different future challenge much easier.

Step 3 - The case

The case comes from printables and felt like the cleanest option.

🏁 Summary & Lessons Learned

Wrap up your project here. What would you do differently next time? This provides that "closing" feel for a future employer.

Early basic setup