Work with EEZ Studio

This guide walks you through designing a professional user interface with the visual design tool EEZ Studio, generating LVGL code, and deploying it to a Seeed ePaper product through the Arduino IDE. The flow is the same for every supported board — the only differences are display resolution and the driver configuration constant, which we surface in tabs.
Compatible Hardware
| reTerminal E1001 / E1002 / E1003 / E1004 | XIAO ePaper Display Board (ESP32-S3) – EE04 |
|---|---|
![]() | ![]() |
| 7.5" mono / 7.3" Spectra 6 / 10.3" mono / 13.3" Spectra 6 | Universal driver — pair with any of our 24-pin or 50-pin Seeed ePaper screens |
What is EEZ Studio?
EEZ Studio is a modern visual programming and UI design environment originally built for test & measurement instruments and embedded devices. It combines drag-and-drop GUI design, scripting, and device integration tools, allowing developers, engineers, and makers to quickly create professional interfaces without starting from scratch.
In short, EEZ Studio acts as a bridge between hardware and software, enabling you to design, prototype, and deploy user experiences more efficiently.
Why use EEZ Studio?
- Visual interface design — create complex UIs with a WYSIWYG editor.
- Rapid prototyping — quickly test and validate design ideas.
- Cross-platform — build apps that run on multiple OSs and embedded targets.
- Hardware integration — directly connect lab instruments, IoT devices, and custom boards.
- Open source — community-driven toolset with optional premium support.
EEZ Studio vs. SquareLine Studio
Both are GUI design tools but they target slightly different audiences:
| Aspect | EEZ Studio | SquareLine Studio |
|---|---|---|
| Primary purpose | Test & measurement instruments, embedded systems, hardware/software integration | Embedded GUIs, especially with LVGL |
| Target users | Engineers, product developers, makers, lab/test instrument designers | Embedded UI developers, hobbyists, IoT product designers |
| Hardware integration | Direct integration with instruments, measurement devices, automation | UI generation focused, less external device integration |
| Open source | Community-driven, transparent, extensible (premium support available) | Closed-source, commercial product with licensing |
| Workflow | Prototype, simulate, and control real devices from one environment | Primarily generates UI code to be compiled into an embedded project |
Step 1: Install EEZ Studio
Download EEZ Studio for your operating system from the official site.


Step 2: Create an LVGL Project
At the top of the EEZ Studio interface, click CREATE. Select the LVGL template on the left:
- Name — give your project a name (we'll use
EEZ_UIin this article). - LVGL Version — pick
9.xfrom the dropdown. - Location — choose where to save the project files.

Project Settings
Click the ⚙️ icon on the toolbar to open Project Settings.
Under General → Build:
- LVGL include: enter
lvgl.hso generated code references LVGL correctly during build.

Under General → Display, set the resolution for your hardware:
- reTerminal E1001 / E1002
- EE04 + 5.83" mono
- Display width: 800
- Display height: 480
(7.5" mono on E1001 and 7.3" Spectra 6 on E1002 share the same 800×480 resolution.)
- Display width: 648
- Display height: 480
(Match the values to whichever Seeed ePaper screen you have plugged into the EE04. The example below uses the 5.83" 648×480 monochrome screen.)

Step 3: Design the UI
UI design directly determines the user experience. EEZ Studio lets you rapidly assemble interfaces by dragging and dropping components and using Styles, Fonts, Bitmaps, Themes, and Groups to control the visual result.
Recommended online resources:
- Coolors — color palette generator
- PeisekA — color chart
- iconfont — icon library
- Google Fonts — free fonts
The right-hand sidebar:

- Styles — visual attributes for unifying and reusing interface elements.
- Bitmaps — backgrounds, icons, logos.
- Fonts — text rendering and multilingual support.
- Themes — light/dark and other top-level styles.
- Groups — layout helpers.
Example layout (Hello World + Panel + Image + Line + Label)
For this tutorial we'll build a simple homepage from five components:
- Panel
- Label
- Line
- Checkbox
- Image

Step 1. Change the canvas background colour — select the canvas, check Color, pick a hex value.

Step 2. Drag a Panel onto the canvas, adjust its width/height, and pick a colour.

Step 3. Add bitmaps via the right-hand Bitmaps panel, name them, then drag the Image widget to the canvas and bind your bitmap.



Step 4. Add a Line from the Visualiser group and configure its Points.

Step 5. Add a Label, pick the colour, then add fonts via the right-hand Fonts panel.



Step 4: Generate Code
After the design is complete:
- Save — click the floppy disk icon next to OPEN.
- Preview — click Run to launch the simulator and preview the UI.
- Compile / Build — click the ✓ icon to check for errors, then the wrench icon to generate UI code, image data, and font data.

A green Build successful message confirms code generation. The output goes to the src/ui folder of your project (you can rename it to src/EEZ_UI if you prefer).
Step 5: Set up the Arduino IDE
To deploy the EEZ Studio output to your Seeed ePaper device, set up the Arduino IDE with ESP32 support.
If this is your first time using Arduino, refer to Getting Started with Arduino first.
-
Install the Arduino IDE.
-
Add ESP32 board support: in File → Preferences, add to Additional Boards Manager URLs:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json -
Install the ESP32 package: Tools → Board → Boards Manager, search for
esp32, install the Espressif Systems package. -
Select the board for your hardware:
- reTerminal E1001 / E1002
- EE04 + 5.83" mono
Tools → Board → ESP32 Arduino → XIAO_ESP32S3
Tools → Board → ESP32 Arduino → XIAO_ESP32S3_PLUS
Also enable OPI PSRAM under the Tools menu.

-
Connect the device via USB-C and select the correct serial port from Tools → Port.
Step 6: Install the Seeed_GFX Library
We use the Seeed_GFX library, which provides comprehensive support for Seeed display devices.
-
Download from GitHub:
-
Sketch → Include Library → Add .ZIP Library and select the downloaded ZIP.
noteIf you previously installed
TFT_eSPI, temporarily remove or rename it from your Arduino libraries folder to avoid conflicts —Seeed_GFXis a fork ofTFT_eSPIwith additional features for Seeed displays. -
Open the right example sketch:
- For colour displays: File → Examples → Seeed_GFX → ePaper → Colorful → HelloWorld
- For monochrome displays: File → Examples → Seeed_GFX → ePaper → Basic → HelloWorld
-
Create a
driver.hfile in the same folder as your sketch (use the new-tab arrow in Arduino IDE). -
Go to the Seeed GFX Configuration Tool, select your hardware, copy the generated configuration, and paste it into
driver.h. The exact contents differ per hardware:
- reTerminal E1001 / E1002
- EE04 + 5.83" mono
For reTerminal E1001 (7.5" black & white, UC8179):
#define BOARD_SCREEN_COMBO 520 // reTerminal E1001 (UC8179)

For reTerminal E1002 (7.3" full colour, UC8179C):
#define BOARD_SCREEN_COMBO 521 // reTerminal E1002 (UC8179C)

For EE04 + 5.83" monochrome (UC8179):
#define BOARD_SCREEN_COMBO 503 // 5.83 inch monochrome ePaper Screen (UC8179)
#define USE_XIAO_EPAPER_DISPLAY_BOARD_EE04


If you swap to a different screen size on the EE04, regenerate driver.h from the configuration tool and keep the USE_XIAO_EPAPER_DISPLAY_BOARD_EE04 line.
If you make the wrong choice, the screen will display nothing — double-check the screen + driver-board combination.
Step 7: Deploy the EEZ Studio Project to Arduino
Add the EEZ Studio output and the platform driver helpers to your sketch folder, then upload.
Required driver files (all hardware)
Download these helper files and place them next to your .ino:
For EE04 you also need lv_conf.h and the LVGL library — see the EE04 tab below.

Copy the EEZ_UI output
Copy the generated EEZ_UI folder (from your EEZ Studio project's src/) into the Arduino libraries folder (typically ~/Documents/Arduino/Libraries).

Sketch and upload
- reTerminal E1001 / E1002
- EE04 + 5.83" mono
Reference sketch — three buttons (KEY0/KEY1/KEY2) cycle three pages: HOME, Workstation, Plant.
Complete reference code: E1002-EEZStudioCode.zip
#include <TFT_eSPI.h>
#include <lvgl.h>
#include <ui.h>
#include "e1002_display.h"
const int BUTTON_KEY0 = 3;
const int BUTTON_KEY1 = 4;
const int BUTTON_KEY2 = 5;
int32_t page_index;
bool lastKey0State = HIGH;
bool lastKey1State = HIGH;
bool lastKey2State = HIGH;
e1002_driver_t e1002_driver;
void setup()
{
String LVGL_Arduino = "Automotive Dashboard Demo - LVGL ";
LVGL_Arduino += String('V') + lv_version_major() + "." + lv_version_minor() +
"." + lv_version_patch();
Serial.begin(115200);
Serial.println(LVGL_Arduino);
Serial.println("Initializing 6-color e-paper display...");
e1002_display_init(&e1002_driver);
pinMode(BUTTON_KEY0, INPUT_PULLUP);
pinMode(BUTTON_KEY1, INPUT_PULLUP);
pinMode(BUTTON_KEY2, INPUT_PULLUP);
lastKey0State = digitalRead(BUTTON_KEY0);
lastKey1State = digitalRead(BUTTON_KEY1);
lastKey2State = digitalRead(BUTTON_KEY2);
ui_init();
page_index = SCREEN_ID_HOME;
loadScreen((ScreensEnum)page_index);
Serial.println("Boot: Main Screen");
}
void loop()
{
lv_timer_handler();
ui_tick();
delay(50);
bool currentKey0State = digitalRead(BUTTON_KEY0);
bool currentKey1State = digitalRead(BUTTON_KEY1);
bool currentKey2State = digitalRead(BUTTON_KEY2);
if (lastKey0State == HIGH && currentKey0State == LOW) {
page_index = SCREEN_ID_HOME;
loadScreen((ScreensEnum)page_index);
Serial.println("Switched to Main Screen");
delay(50);
}
if (lastKey1State == HIGH && currentKey1State == LOW) {
page_index = SCREEN_ID_WORKSTATION;
loadScreen((ScreensEnum)page_index);
Serial.println("Switched to Plant Screen");
delay(50);
}
if (lastKey2State == HIGH && currentKey2State == LOW) {
page_index = SCREEN_ID_PLANT;
loadScreen((ScreensEnum)page_index);
Serial.println("Switched to Setting Screen");
delay(50);
}
lastKey0State = currentKey0State;
lastKey1State = currentKey1State;
lastKey2State = currentKey2State;
if (e1002_display_should_refresh(&e1002_driver))
{
Serial.println("Refreshing e-paper display...");
e1002_display_refresh(&e1002_driver);
Serial.println("Display refresh complete");
}
delay(10);
}
Notes:
e1002_display_init()initialises the e-ink display hardware.pinMode(..., INPUT_PULLUP)configures button pins with internal pull-ups.ui_init()andloadScreen()initialise LVGL and load a specific screen.lv_timer_handler()processes LVGL timers and animations.- The
if (lastKeyXState == HIGH && currentKeyXState == LOW)blocks debounce a HIGH→LOW edge and update the page. e1002_display_should_refresh()/e1002_display_refresh()manage e-ink refresh on demand.
Resulting screens
| Home Page | Workstation Page | Photo Page |
|---|---|---|
![]() | ![]() | ![]() |
For EE04 you also need:
e1002_display.cppe1002_display.hlv_conf.h- The LVGL library installed in Arduino IDE

Copy the generated EEZ_UI folder into ~/Documents/Arduino/Libraries.

Reference sketch — three onboard buttons (KEY1/KEY2/KEY3 = pins 2 / 3 / 5) cycle three pages: Smart, Industry, Game.
Complete reference code: EEZ_UI_EE04.zip
#include <TFT_eSPI.h>
#include <lvgl.h>
#include <ui.h>
#include "e1002_display.h"
const int BUTTON_KEY1 = 2;
const int BUTTON_KEY2 = 3;
const int BUTTON_KEY3 = 5;
int32_t page_index;
bool lastKey0State = HIGH;
bool lastKey1State = HIGH;
bool lastKey2State = HIGH;
unsigned long lastDebounceTime0 = 0;
unsigned long lastDebounceTime1 = 0;
unsigned long lastDebounceTime2 = 0;
const unsigned long debounceDelay = 120;
e1002_driver_t e1002_driver;
unsigned long lastFullRefreshTime = 0;
const unsigned long fullRefreshCooldown = 1500;
bool buttonPressed(int pin, bool &lastState, unsigned long &lastDebounceTime)
{
bool currentState = digitalRead(pin);
if (lastState == HIGH && currentState == LOW &&
(millis() - lastDebounceTime) > debounceDelay)
{
lastDebounceTime = millis();
lastState = currentState;
return true;
}
lastState = currentState;
return false;
}
void switchPage(ScreensEnum targetScreen, const char *pageName)
{
if (millis() - lastFullRefreshTime < fullRefreshCooldown)
{
Serial.println("[Skip] Refresh cooling down...");
return;
}
Serial.printf("Switching to %s ...\n", pageName);
e1002_driver.epd->fillScreen(TFT_WHITE);
e1002_driver.epd->update();
loadScreen(targetScreen);
e1002_display_refresh(&e1002_driver);
lastFullRefreshTime = millis();
Serial.printf("[OK] %s refreshed.\n", pageName);
}
void setup()
{
Serial.begin(115200);
String LVGL_Arduino = "Smart Home Dashboard - LVGL ";
LVGL_Arduino += String('V') + lv_version_major() + "." +
lv_version_minor() + "." + lv_version_patch();
Serial.println(LVGL_Arduino);
Serial.println("Initializing e-paper display...");
e1002_display_init(&e1002_driver);
pinMode(BUTTON_KEY1, INPUT_PULLUP);
pinMode(BUTTON_KEY2, INPUT_PULLUP);
pinMode(BUTTON_KEY3, INPUT_PULLUP);
ui_init();
page_index = SCREEN_ID_SMART;
loadScreen((ScreensEnum)page_index);
e1002_display_refresh(&e1002_driver);
Serial.println("Boot: Main Screen");
}
void loop()
{
lv_timer_handler();
ui_tick();
if (buttonPressed(BUTTON_KEY1, lastKey0State, lastDebounceTime0))
{
page_index = SCREEN_ID_SMART;
switchPage((ScreensEnum)page_index, "Main Screen");
}
if (buttonPressed(BUTTON_KEY2, lastKey1State, lastDebounceTime1))
{
page_index = SCREEN_ID_INDUSTRY;
switchPage((ScreensEnum)page_index, "Plant Screen");
}
if (buttonPressed(BUTTON_KEY3, lastKey2State, lastDebounceTime2))
{
page_index = SCREEN_ID_GAME;
switchPage((ScreensEnum)page_index, "Workstation Screen");
}
if (e1002_display_should_refresh(&e1002_driver))
{
Serial.println("Refreshing e-paper display...");
e1002_display_refresh(&e1002_driver);
Serial.println("Display refresh complete");
}
delay(10);
}
Resulting screens
| Smart | Industry | Game |
|---|---|---|
![]() | ![]() | ![]() |
Reference & Resources
- reTerminal E1001 / E1002
- EE04 + 5.83" mono
Tech Support & Product Discussion
Thank you for choosing our products! We are here to provide you with different support to ensure that your experience with our products is as smooth as possible. We offer several communication channels to cater to different preferences and needs.






