Training Dashboard Evolved – E-Paper Meets AI

by rsappiawf in Circuits > Arduino

136 Views, 3 Favorites, 0 Comments

Training Dashboard Evolved – E-Paper Meets AI

PSX_20250606_104607.jpg
small_PSX_20250526_184955.png
small_PSX_20250526_185126.png

After a first dive into the world of e-paper with a simple Solar E-Ink Weather Station, I’m back — and this time with something bigger, smarter, and definitely more personal.

This project is a smart training dashboard powered by a 7.5" e-paper display, a Waveshare ESP32 driver, and a Raspberry Pi running the backend.

It’s designed for athletes (and data nerds like me) who live in the Strava + Garmin universe — and who wish both platforms would just get along for once.

⚠️ Please don’t judge the training stats too harshly — I’ve been injured for a while 😅. The design, not the distance, is what counts here!

Supplies

WhatsApp Bild 2025-05-29 um 21.44.05_c31d30ff.png

Main Components:

  1. 7.5” e-paper display (800x480, black-white-red)
  2. For the prototype phase
  3. Waveshare ESP32 e-Paper driver board
  4. Raspberry Pi (used as a backend to fetch data, fuse info, and generate images via Python)
  5. Python scripts that fetch and process training + weather data, generate the final dashboard image, and send it to the ESP32 for display

The ESP32 acts as a display driver and image receiver, while all the logic, rendering and data aggregation happens on the Pi.

I will be updating the list according to the project phases.

Concept & Motivation

Like many endurance athletes, I use both Strava and Garmin to track my training. Each platform is great — but together they’re even better.

The goal of this project was to create a dedicated display that combines both data sources into a clean, ambient, always-on dashboard.

I didn’t want another screen to scroll or another app to check — just a passive, daily snapshot that lives quietly on my desk and reflects my training rhythm.

Selecting Components

PSX_20250526_185126.png

For the prototyping I chose the following hardware:

  1. 7.5” e-paper display (800×480, black/white/red) – big enough to display detailed data
  2. Waveshare ESP32 e-Paper driver board – perfect for low-power updates and wireless image transfer
  3. Raspberry Pi 5 – used as the backend for pulling, merging and rendering data

Optional:

  1. 3D-printed case (coming soon!)
  2. Power supply via USB (wall charger or battery bank)


Backend & Data Fusion (Python)

The Raspberry Pi is in charge of all the logic on the backend side. Here's what happens under the hood (in progress):

  1. A Python script runs on a schedule (hourly or daily)
  2. It connects to both Strava and Garmin APIs (or data exports)
  3. It fetches and merges data into a common format
  4. Based on the day (active vs. rest), it renders a dashboard image using Pillow
  5. The image is saved as a BMP and sent wirelessly to the ESP32

This part is where most of the "magic" happens — especially the fusion logic.

The raspberry Pi is just a quick and dirty solution that in the future will be replaced by a solution on the cloud.

ESP32 Display Receiver

small_PSX_20250526_185206.png

The ESP32 listens for a new image, downloads it, and sends it to the e-paper display.

Using the Waveshare libraries and examples as a base, I trimmed the code down to a simple "fetch-and-display" cycle:

  1. Connect to WiFi
  2. Download latest image from the Pi
  3. Update the display with the new BMP
  4. Go to deep sleep until the next refresh

This keeps power usage very low and the update process clean and efficient. Here I am implementing a similar solution to the one I did for my Solar E-Ink Weather Station which by the way has been running for several months without even being exposed to direct sunlight!

Dashboard Layouts & Modes

dashboardact.png
dashboard.png

The dashboard currently adapts its layout based on the type of day — active or recovery — and presents a variety of key training and environmental metrics in a clean, low-distraction format.

Each layout is rendered in either light or dark mode, depending on your visual preference.

Here’s what’s already implemented:

Daily Logic: Two Main Layout Modes

  1. Active Day: shows your most recent activity, core metrics, and weather for the upcoming days.
  2. Recovery Day: focuses on training load evolution and a broader overview of trends and progress.

Current Dashboard Elements

Monthly calendar

  1. Displays the current month with active days marked in red, offering an immediate visual overview of your activity streaks or gaps.

Radar chart

  1. A circular diagram compares time and distance across the last 4 weeks and the current month, helping identify focus areas or imbalance between activity types.

Recovery metrics

  1. Includes recovery time and chronic load from high-intensity sessions, giving a clearer view of how strained (or fresh) your body might be.

Weekly intensity stats

  1. Displays the current week's accumulated low- and high-intensity minutes, based on data pulled from Strava/Garmin.

Weather forecast

  1. A dedicated section shows the next four days of weather for the location set in the configuration file — including icons for clarity.

Each element has been designed with readability on e-paper in mind, using black/white/red only, and keeping typography and layout minimal.

  1. More layouts and additional visualizations are on the roadmap (see Step 6!), but even in its current state, the dashboard gives a rich and actionable overview of your training journey.

Framed Version

PSX_20250606_104422.jpg
PSX_20250606_104628.jpg

After refining the electronics and dashboard layout, I’ve now completed the physical build of the project.

The e-paper display is now housed inside a wooden photo frame, giving it a clean and polished look — perfect for sitting permanently on my desk.

To hold everything together neatly, I designed a custom 3D-printed support that integrates seamlessly into the back of the frame. It secures the ESP32 and provides cable routing while keeping the device compact and minimalistic.

Everything still runs as described:

  1. Raspberry Pi backend processes Strava, Garmin and weather data
  2. The image is generated and pulled periodically by the ESP32
  3. Displayed on a 7.5" tri-color Waveshare e-paper screen

This new version feels much closer to a finished product — and it’s even more satisfying to use daily.

Web Layout Editor + Error Screen (June 2025)

error_screen.jpg
PSX_20250615_200522.jpg

The project keeps evolving!

Two recent additions I’ve implemented:

🖱️ Web-based Layout Editor:

I created a simple browser-based interface that lets me visually rearrange the widgets on the dashboard. This makes it much easier to test and refine the layout without manually editing JSON files.

💥 Custom Error Screen:

Because sometimes things go wrong… and when they do, my e-paper dashboard now displays a playful “technical difficulties” screen. It brings a bit of fun to unexpected glitches and makes testing more enjoyable 😄

These changes are aimed at improving flexibility and user-friendliness — and yes, I plan to publish parts of the project on GitHub soon for those interested.

📸 Swipe through the new photos to see the layout editor running on an iPad and the custom error screen in action.

AI Meets the Dashboard

dashboard.bmp
DSC_0545.jpg
DSC_0547.jpg

After som nigths coding and refining the layout, visual style, and backend logic, I felt something was still missing — a more personal, emotional layer.

This latest update introduces just that: a touch of intelligence and motivation powered by AI.

A small fox now appears on the dashboard, quietly generating motivational phrases tailored to your real-world context. These messages consider your latest activity (distance, pace, duration), training readiness, recovery feedback, sleep quality, current weather, and overall activity load — and respond accordingly.

This isn’t random text generation. The messages are produced locally by a lightweight model (Gemma 2B, quantized), running entirely on the Raspberry Pi 5 (4GB). There’s no cloud involved — everything happens on-device.

So far, the results are exciting: thoughtful, playful comments that match the data on screen and reflect your current state. It’s a unique fusion of three areas I care deeply about: sport, AI, and e-paper technology.

Here’s how the little fox reacted after I went for a quick walk — still injured 🥲, and not exactly well-rested or fully recovered:

Generated prompt:

"You are a witty and upbeat fox companion. Barking is not your thing. Speak casually, as if reacting to a friend’s day — avoid sounding like you're fulfilling a request. The user just wrapped up a short 1km hike in 16 minutes. It was cloudy and cool (~16°C). They’ve been told to ease up a bit: current recovery signals are low, sleep was rough, and overall training load has been on the light side. Celebrate the small effort — and offer gentle encouragement to get more rest and find the right moment to build momentum again."

Output:

"Your muscles are thanking you for the hike, but they're definitely ready for some pampering. Take a breather and let the clouds clear your mind."

Other outputs to the same script:

"Well done on your 4.9km ride in 14 minutes! But listen up, you little champ. Your body is a bit beat, so let's give it a rest for a bit. Relax, recharge, and get ready for another go! "
"Feeling fresh and invigorated? The clouds have parted, the sun's peeking through, and you're ready to chase some adventure! Remember, even a short walk can make a world of difference. So, hop out there and give your body the rest it deserves!"

The AI doesn’t just cheer you on. It gently reminds you when it’s time to rest — and that too is part of staying motivated.

📷 I've included a couple of images from this rest day layout. More examples from activity days — along with generated phrases — will follow in future updates.

This project is still evolving! The next steps will focus on refining this integration and making the system even more modular and extensible.

What’s Next (Future Plans)

This is just the beginning.

The core dashboard is already functional, but I’m actively developing new features and refining the overall experience. Here’s what’s currently in progress or on the roadmap:

Customization & Layouts

  1. Activity-specific views: Different data focus depending on whether you’re running, cycling, recovering, etc.

Backend Evolution

  1. I’m evaluating cloud-based options to offload the backend, so that a Raspberry Pi won’t be required for everyone.
  2. This would make the setup more accessible and allow it to run on simpler hardware (or even mobile-triggered updates).

Data Fusion Logic

  1. I’m refining how Strava and Garmin data are combined to generate meaningful, unified insights, especially when the same activity appears in both platforms.
  2. The merging process will become smarter and more configurable.

Public Release

  1. A lightweight version of the code (with mock data and basic layout) is in the works.
  2. Perfect for users who want to try the concept without full API integration.

Hardware & Design

  1. A custom ESP32 board is also on the drawing board — the goal is to have it fit seamlessly into the frame, both visually and mechanically.

Power Optimization

  1. I previously worked on deep sleep routines and low-power strategies for my paper ink weather station, and I’m bringing those learnings here.
  2. Fine-tuning Wi-Fi usage, update intervals, and display refresh cycles to get the most out of each mAh.


Stay tuned — this Instructable will be regularly updated as new features and improvements come to life. And if you’re interested in contributing or testing the public version once it’s ready, feel free to comment or reach out!