E-paper displays are perfect for always-on information devices: they are readable in any light condition, consume almost no power when static, and feel more like paper than a screen.
In an era of fragmented information, connected devices often mean distraction. In this project, I built a completely offline desktop productivity tool that combines a 'weekly planner' with a 'Pomodoro timer' using a 7.5-inch black-and-white e-ink screen for high contrast and eye protection. It does not call any APIs, and all data is stored locally, providing you with a distraction-free working environment.
This project is designed to be:
- Beginner-friendly
- Easy to customize
- Expandable for future features
- Suitable for battery-powered operation
As you can see, the hardware required for this project is simple and requires no soldering. I will also include the corresponding purchase links at the end so you can easily obtain them. Let me briefly explain why I chose these components.
ESP32The ESP32 was selected for several reasons:
- Integrated Wi-Fi connectivity
- Excellent low-power capabilities
- Wide availability and strong community support
- Suitable performance for lightweight IoT applications
E-Paper displays are ideal for this type of project because:
- They consume no power when displaying static content
- The screen remains readable in bright environments
- Slow refresh rates encourage intentional, calm design
- They pair well with deep-sleep-driven firmware
PS: Why do I recommend buying the Seeed Studio development board directly? Because it's affordable and comes with comprehensive wiki documentation. If you encounter any unknown issues during the process, you can look them up yourself or ask for help in the community. As we all know, worry-free is the most important thing.
OK, LET'S GO!
Step 1: Hardware Assembly DiagramTo get the code running properly, you must configure the driver correctly:
- 1. Install the library: Download and install the Seeed_GFX library from GitHub.
- Seeed_GFX
- 2. Configuration file: Use the library's Online Configuration Tool to generate a User_Setup.h suitable for your 7.5-inch screen and XIAO pins.
- Online Configuration Tool
- 3. PSRAM tip: Although 7.5 inches doesn't reach the mandatory requirement of 10.3 inches, it is recommended to enable PSRAM support in the Arduino IDE to render color bitmaps more smoothly.
- 4. Core code implementation (The Code)The following code shows how to use the Unified API to layout left and right partitions and allow color differentiation for tasks.
#include <TFT_eSPI.h>
// Initialize the E-Paper object
EPaper epaper;
// Define color layout (Supported by 7.3" multi-color e-paper) [2]
#define COLOR_WORK TFT_RED // Red for work-related tasks
#define COLOR_LEISURE TFT_BLUE // Blue for leisure/meditation
#define COLOR_TEXT TFT_BLACK
#define COLOR_BG TFT_WHITE
// --- Logic Variables ---
int remainingMinutes = 25; // Initial countdown minutes
unsigned long lastUpdateMs = 0; // Stores the timestamp of the last refresh
const unsigned long ONE_MINUTE = 60000; // 60,000 milliseconds = 1 minute
char timeBuf[4]; // Buffer for the time string (e.g., "25:00")
void setup() {
// Initialize Serial for debugging
Serial.begin(115200);
// 1. Initialize the display [3]
epaper.begin();
// 2. Perform initial UI rendering
renderUI();
lastUpdateMs = millis();
// NOTE: For large screens like 7.3", ensure PSRAM is enabled in Arduino IDE
// to avoid memory allocation errors! [2]
}
void loop() {
// Check if one minute has passed
if (millis() - lastUpdateMs >= ONE_MINUTE) {
if (remainingMinutes > 0) {
remainingMinutes--; // Decrement the countdown
renderUI(); // Trigger a physical screen refresh [3]
}
lastUpdateMs = millis(); // Reset the timer
}
}
/**
* Core rendering function that draws the layout and countdown.
* It uses the Unified API for consistent drawing. [1]
*/
void renderUI() {
// 1. Clear the canvas (Prepare buffer)
epaper.fillScreen(COLOR_BG);
// --- Left Side: Weekly Plan (Static Layout) ---
// Draw a vertical divider at the center (assuming 800px width)
epaper.drawLine(400, 0, 400, 480, TFT_BLACK);
epaper.setTextColor(TFT_BLACK);
epaper.drawString("WEEKLY PLAN", 20, 20, 4);
epaper.setTextColor(TFT_BLACK);
epaper.drawString("09:00 - Deep Work (Coding)", 20, 80, 2);
epaper.setTextColor(TFT_BLACK);
epaper.drawString("12:00 - Garden Meditation", 20, 120, 2);
epaper.setTextColor(TFT_BLACK);
epaper.drawString("14:00 - Project Review", 20, 160, 2);
// --- Right Side: Pomodoro Countdown ---
epaper.setTextColor(TFT_BLACK);
epaper.drawString("POMODORO", 460, 20, 4);
// Generate the "XX:00" format string
sprintf(timeBuf, "%02d:00", remainingMinutes);
// Set text size and use font index 7 for large digits [3]
epaper.setTextSize(2);
epaper.drawString(timeBuf, 470, 200, 7);
epaper.setTextSize(1);
epaper.drawString("Stay Focused, No API needed.", 480, 400, 2);
// 3. Execute physical refresh
// E-Paper displays require an explicit update() to change pixels [3]
epaper.update();
}Compile the code and upload it to the motherboard to start enjoying your offline Pomodoro timer.
- Minimalist Design: Quickly create layouts using drawString() and drawLine() without the need for complex UI design software.
- Low Power Management: Utilize the EPaper class's auto-sleep feature, refreshing the screen once per minute according to the clock, eliminating battery anxiety and making it suitable for long-term desktop placement.
- Extensibility: This project supports not only black-and-white screens but also color displays, with the code allowing flexibility for color modifications. (remember to modify the corresponding e-paper driver in druve.h).
- Complete Privacy: The code hardcodes plans internally, requiring no Wi-Fi connection, ensuring the privacy of personal schedules.





Comments