I am a big fan of dashboards. Beyond being a nice accessory for a workspace, they serve a practical purpose: they display useful information so you don't have to check your smartphone or open a web browser.
My first dashboard project used a Seeed Studio XIAO with a 7.5" E-Ink screen. It was a good starting point, but as I added more features, I quickly outgrew the screen size and the microcontroller's memory. I initially upgraded to an ESP32-S3, but even that wasn't enough.
Eventually, I had so much data that it wouldn't fit on one screen. I tried cycling through different "pages" on a timer, but this was inconvenient—often the information I needed wasn't currently visible. I didn't want to add manual buttons; my goal was to have all information available at a glance.
This led me to the Waveshare 10.85" E-Paper Display.
HardwareThe dimensions of this display are impressive: 259.76 × 91.68 mm. Technically, it consists of two 7.3" screens combined into one panel with a single driver.
The display comes with a HAT+ that allows easy connection to a Raspberry Pi. While it also supports SPI for microcontrollers, I chose the Raspberry Pi Zero 2 W for several reasons:
- Performance: I plan to use this device as a hub for other smart home services.
- Ease of Coding: Writing complex logic in Python is much faster and easier for me than C++ or MicroPython on an ESP32.
- Partial Refresh: This was the most important factor. Partial refresh allows you to update a specific part of the screen without the entire display blinking. This is critical for a dashboard where data updates frequently.
- Controller:Raspberry Pi Zero 2 W
- Display:Waveshare 10.85inch e-Paper display with driver HAT
Finding a ready-made case for this specific display was impossible, so I designed my own. I started by measuring the hardware and creating a 3D model reference, which you can find here: GrabCAD Library.
Initially, I designed a full enclosure to cover the entire device. However, I ran into a problem: the case was too large for my 3D printer (BambuLab P1S). I tried printing it diagonally, but the results were poor due to the large amount of support material needed.
Instead of looking for a larger printer, I redesigned the case. I took inspiration from the TRMNL display, which has a minimal, open look. However, the TRMNL design lacks rear support. Since a 10.85" E-Ink screen is fragile, I needed something sturdier.
My final design is a "frameless" style case, but with the support on the back. The display remained slim, with all the electronic components housed in the stand. This design fits easily on a standard 250x250mm print bed.
You can find the model for 3d printing below.
Assembly Guide- Disconnect the display cable from the HAT board.
- Gently insert the display into the front slot of the 3D-printed frame.
- Insert the rear support piece behind the display. Make sure the latch is at the top to secure the screen.
- Secure the latch with a small amount of hot glue or strong tape at the cutout points. Do not use super glue (cyanoacrylate), as the fumes can damage the display.
- Connect the HAT to the Raspberry Pi and attach the display cable.
- Mount the electronics onto the back of the case.
When I first set up the Raspberry Pi with the official Waveshare demo code, the full-screen refresh worked fine. However, I encountered a bug with the partial refresh function.
Because the hardware consists of two internal screens, the driver struggled when I tried to update an area that crossed the border between the left and right halves. If an image or text sat on this "seam, " it would be cut off or only appear on one side.
The issue was in the display_Partial function in the epd10in85.py library. I modified the library to correctly update the screen across both internal controllers. Now, images and text render correctly even if they overlap the center of the screen.
I started by creating a simple full-screen clock to test the setup. One tip: the library uses TrueType Collection (.ttc), you can easily convert it using free tools like FontForge.
Since I already had the previous display, my task was to rewrite the old code from ESP32 to Python. Considering the new architecture and resources available on the Pi Zero 2, I was able to refactor the code and implement true multithreading.
To achieve this, I use a VPS running Ubuntu that collects telemetry from my mobile apps in the App Store, interacts with various open and closed APIs, and more. While this could technically be handled by the Pi Zero itself, I prioritize availability which makes a virtual server the better choice for me. With this in mind, I have implemented several separate threads that update different activities on the dashboard.
This approach keeps the Pi Zero efficient and ensures the dashboard remains responsive.
I won’t provide a specific implementation here, as it is highly dependent on individual use cases and personal preferences. I’ll just list my widgets as examples - they might be interesting to others as well:
- A four-hour weather forecast
- Statistics for apps in the App Store
- Work task statistics from Jira
- Strava data for the current year and all-time
- Status of my BambuLab 3D printer
- A map showing my car’s current location
- Load and available resources of my VPS server
You can find the demo code and the fixed library driver here: GitHub: Waveshare-ePaper-10.85-demo
3d modelhttps://makerworld.com/en/models/2322517-epaper-dashboard-waveshare-10-85


_MsQPLY30wm.png?auto=compress%2Cformat&w=48&h=48&fit=fill&bg=ffffff)






Comments