E-paper displays are beloved by makers for their ultra-low power consumption and sunlight-readable contrast — but their notorious slow full refresh (1–3 seconds with a black flash) makes them seem unsuitable for e-paper partial refresh dynamic content applications. The good news is that modern e-paper controllers like the SSD1680, UC8151, and GDEH0154D67 support partial refresh mode, which updates only a specified region of the screen in as little as 200–500 ms with no visible flicker. This guide explains exactly how partial refresh works and how to implement it in your Arduino or ESP32 project.
How E-Paper Displays Work
E-paper (also called e-ink) displays use a fundamentally different physical mechanism from LCD and OLED panels. Each pixel contains millions of tiny microcapsules filled with a clear fluid containing white titanium dioxide particles (positively charged) and black carbon particles (negatively charged). An electric field applied to each pixel pushes one set of particles to the front (visible) face and the other to the back, creating black or white pixels.
This bistable nature is what makes e-paper special: once a pixel is set, it holds its state with zero power consumption. You only consume power when changing pixels. A Kindle can display a book page for weeks on a single charge because reading doesn’t require refreshing the screen.
However, this same electrokinetic mechanism is also why e-paper is slow. Moving charged particles through viscous fluid takes time, and a complete reset requires driving particles back to a neutral state before setting them to the new pattern — this causes the characteristic black flicker during a full refresh.
Full Refresh vs Partial Refresh
Understanding the difference between the two refresh modes is essential for building effective e-paper projects.
Full Refresh
Full refresh drives every pixel through a complete cycle: clear to white, flash to black, then set to the final pattern. This ensures perfect image quality with maximum contrast and no ghosting. The process typically takes 1–3 seconds and produces a visible black flash. Full refresh is required periodically to prevent image retention (ghosting) that accumulates from repeated partial refreshes.
Partial Refresh
Partial refresh updates only the pixels within a specified rectangular region, skipping the full clear-and-set cycle. Instead of driving particles from white-to-black-to-final, partial refresh applies a shorter waveform that moves particles directly between states without the intermediate reset. This enables:
- Update times of 200–600ms (vs 1,500–3,000ms for full)
- No full-screen black flash — only the updated region flickers briefly
- Updates to specific zones while keeping the rest of the image unchanged
The trade-off: Repeated partial refreshes cause ghosting — a faint shadow of previous content visible beneath new content. Most manufacturers recommend performing a full refresh every 5–10 partial refreshes to clear accumulated ghosting.
Which E-Paper Displays Support Partial Refresh?
Not all e-paper displays support partial refresh. Here is a guide to common modules available in India:
Displays with Good Partial Refresh Support
- Waveshare 2.9″ (SSD1680/IL3820): One of the most popular e-paper modules for Arduino. Supports partial refresh on the full display area. Update time: ~250ms partial, ~2s full.
- Waveshare 1.54″ (SSD1681): 200×200 pixels, fast partial refresh. Good for name badges and small status displays.
- GDEH0154D67 (Good Display 1.54″): Well-documented partial refresh waveform, widely used in maker community.
- Waveshare 4.2″ (SSD1619): Larger display with partial refresh support. Ideal for smart home panels.
Displays with Limited or No Partial Refresh
- Multi-colour e-paper (3-colour: black/white/red or yellow): The colour pigment panels (with red or yellow particles) generally do NOT support partial refresh due to the complexity of driving three particle types simultaneously. Always do full refresh for these.
- Very cheap no-brand modules: May not have published waveform tables. Test before committing to a build.
Implementing Partial Refresh with GxEPD2
The GxEPD2 library by ZinggJM is the gold standard for e-paper displays on Arduino and ESP32. It correctly handles partial refresh for all supported displays and includes a display-class hierarchy that abstracts the hardware details.
Installation
Install GxEPD2 and Adafruit GFX from the Arduino Library Manager. Search “GxEPD2” and install the library by ZinggJM. It supports over 50 e-paper display models.
Basic Partial Refresh Example
#include <GxEPD2_BW.h>
#include <Fonts/FreeMonoBold12pt7b.h>
// For Waveshare 2.9" 296x128
GxEPD2_BW<GxEPD2_290_T94_V2, GxEPD2_290_T94_V2::HEIGHT> display(
GxEPD2_290_T94_V2(/*CS*/ 5, /*DC*/ 17, /*RST*/ 16, /*BUSY*/ 4));
void setup() {
display.init(115200);
display.setRotation(1);
// Draw static content with full refresh
display.firstPage();
do {
display.fillScreen(GxEPD_WHITE);
display.setFont(&FreeMonoBold12pt7b);
display.setTextColor(GxEPD_BLACK);
display.setCursor(5, 30);
display.print("Temp: ");
display.setCursor(5, 60);
display.print("25.4 C");
} while (display.nextPage());
}
void updateTemperature(float temp) {
// Only update the temperature value area
display.setPartialWindow(0, 40, 200, 30);
display.firstPage();
do {
display.fillScreen(GxEPD_WHITE);
display.setFont(&FreeMonoBold12pt7b);
display.setTextColor(GxEPD_BLACK);
display.setCursor(5, 60);
display.print(temp, 1);
display.print(" C");
} while (display.nextPage());
}
The key call is display.setPartialWindow(x, y, width, height). Only the pixels within this rectangle will be updated. The rest of the display image remains as-is — no redrawing required.
Managing the Full Refresh Cycle
int partialCount = 0;
void loop() {
float temp = readSensor();
if (partialCount >= 10) {
// Full refresh to clear ghosting
displayFullScreen(temp);
partialCount = 0;
} else {
updateTemperature(temp);
partialCount++;
}
esp_deep_sleep(60 * 1000000ULL); // Sleep 60 seconds
}
DHT11 Digital Relative Humidity and Temperature Sensor Module
Read temperature and humidity to display on your e-paper screen. The DHT11’s low-power operation makes it an ideal companion for battery-powered e-paper projects.
Dynamic Content Strategies
To make the most of partial refresh for dynamic content, plan your screen layout carefully:
Zone-Based Layout
Divide your e-paper display into static and dynamic zones. For a weather station:
- Static zone (top 30%): City name, labels like “Temp:”, “Humidity:”, icons — refreshed with full update only on boot or daily reset.
- Dynamic zone (bottom 70%): Actual values — refreshed with partial update on each reading cycle.
Never include static text in a partial update region unless you clear and redraw it each time. Any partial update that doesn’t redraw an element will erase it from the partial window area.
Clock Display
For a clock on e-paper, update only the seconds region every second (or skip seconds entirely and update minutes only). Update the hours region separately. This minimises power consumption compared to a full-screen refresh every second.
Temperature Updates
For a battery-powered temperature logger, wake from deep sleep every 60 seconds, read the sensor, update only the temperature value partial window, then return to deep sleep. With good power management, this can achieve months of battery life on a 18650 cell.
DHT20 SIP Packaged Temperature and Humidity Sensor
The DHT20 uses I2C with minimal power draw, making it ideal for battery-powered e-paper display projects where every milliamp matters.
Power and Battery Considerations
E-paper’s biggest selling point for Indian outdoor projects (solar-powered weather stations, garden monitors, remote signage) is its extremely low power profile. Here’s what to expect:
- Display idle (image held): 0 mW — truly zero power when not refreshing
- Full refresh (2.9″ Waveshare): ~26 mA for ~2 seconds = ~14 mAh per 1,000 full refreshes
- Partial refresh: ~30 mA for ~250ms = ~2 mAh per 1,000 partial refreshes
- ESP32 deep sleep: ~10–20 µA
For a sensor that wakes every 5 minutes and does a partial refresh, the ESP32 active time (~30mA × 3 seconds) dominates power consumption — not the display refresh. Use light sleep instead of deep sleep if you need faster response, or optimise the sensor reading and SPI transfer to complete in under 500ms.
A 3,000 mAh 18650 battery with the above power profile can last approximately 6–12 months in a real-world outdoor installation — a figure that LCD or OLED displays simply cannot match.
Project Ideas Using Partial Refresh
- E-paper desk clock: Partial update for seconds/minutes, full refresh once per hour. Mount in a 3D-printed wooden-look frame for a minimal desk aesthetic.
- Smart home energy monitor: Show current power consumption (from ACS712 current sensor) in the centre zone, updated every 30 seconds. Static labels around it refreshed only when layout changes.
- Garden humidity sensor display: Solar-powered ESP32 with capacitive soil moisture sensor. Wake every 30 minutes, read moisture, partial-update the display, send data to cloud, sleep. Lasts an entire season on a small solar panel.
- Queue number display: For small Indian shops or clinics, a battery-powered e-paper display showing the current token number. Partial refresh makes number changes look snappy without the distraction of a full-screen flash.
- Price tag display: A 2.9″ e-paper module with partial refresh can update prices instantly while the product name/barcode zones remain static — no need for full refresh on every price change.
GY-BME280-3.3 Precision Altimeter Atmospheric Pressure Sensor Module
Combine temperature, humidity, and pressure readings on your e-paper display. The BME280’s low standby current pairs perfectly with the e-paper zero-idle-power advantage.
Frequently Asked Questions
How often should I do a full refresh to prevent ghosting?
Most manufacturers recommend a full refresh every 5–10 partial refreshes, or at least once per hour for continuously updating displays. GxEPD2 has a built-in counter you can use to trigger automatic full refreshes at your chosen interval.
Does partial refresh work with all e-paper displays?
No. Only displays with a partial-refresh-capable controller and a published partial-refresh waveform support this feature. Multi-colour displays (black/white/red) generally do not support partial refresh. Always check the datasheet or GxEPD2’s supported display list before purchasing.
Why is my partial refresh leaving ghost images?
This is normal behaviour when partial refreshes accumulate. Perform a full refresh to clear ghost images. If ghosting appears after just 1–2 partial refreshes, your partial refresh waveform may be too short. Some displays need temperature-compensated waveforms — GxEPD2 handles this automatically on supported panels.
Can I use partial refresh to animate content on e-paper?
Simple animations at 2–5 FPS are possible with very fast e-paper panels and partial refresh. Waveshare’s 2.9″ T94 V2 achieves ~4 FPS partial updates. This is enough for simple progress bars, scrolling text, or a smooth clock animation — not video, but usable for UI transitions.
Is e-paper good for Indian outdoor projects?
Absolutely. E-paper is one of the best choices for outdoor Indian use: it is sunlight-readable (reflective, not emissive), requires no backlight power, and works at temperatures from -20°C to +70°C (wide enough for most Indian climates). Pair with proper IP-rated enclosures and a small solar panel for truly maintenance-free outdoor installations.
Add comment