- Add Slint-based ESP32 UI firmware project - Support ESP32-S3 and ESP32-C3 targets - Include ST7789 display driver support - Add touch controller support (XPT2046, FT6X36) - Include pin configuration and hardware requirements - Add build scripts and cargo configuration Co-authored-by: ZeroClaw Agent <zeroclaw_agent@zeroclaw.local>
5.1 KiB
5.1 KiB
ZeroClaw ESP32 UI Firmware
Slint-based graphical interface for ZeroClaw AI assistant on ESP32.
Features
- Modern UI: Declarative interface built with Slint UI framework
- Touch Support: Compatible with resistive (XPT2046) and capacitive (FT6X36) touch panels
- Display Options: Support for ST7789, ILI9341, and SSD1306 displays
- Connectivity: WiFi and Bluetooth Low Energy support
- Memory Efficient: Optimized for ESP32's limited RAM (~520KB)
Hardware Requirements
Recommended: ESP32-S3
- SoC: ESP32-S3 (Xtensa LX7 dual-core, 240MHz)
- RAM: 512KB SRAM + 8MB PSRAM (optional but recommended)
- Display: 2.8" 320x240 TFT LCD (ST7789 or ILI9341)
- Touch: XPT2046 resistive or FT6X36 capacitive
- Storage: 4MB+ Flash
Alternative: ESP32-C3
- SoC: ESP32-C3 (RISC-V single-core, 160MHz)
- RAM: 400KB SRAM
- Display: 1.14" 135x240 TFT (ST7789)
- Note: Limited to simpler UI due to RAM constraints
Project Structure
firmware/zeroclaw-esp32-ui/
├── Cargo.toml # Rust dependencies
├── build.rs # Build script for Slint compilation
├── .cargo/
│ └── config.toml # Cross-compilation settings
├── ui/
│ └── main.slint # Slint UI definition
└── src/
└── main.rs # Application entry point
Prerequisites
-
Rust toolchain with ESP32 support:
cargo install espup espup install source ~/export-esp.sh -
Additional tools:
cargo install espflash cargo-espflash -
Hardware setup:
- Connect display to SPI pins (see pin configuration below)
- Ensure proper power supply (3.3V logic level)
Pin Configuration
Default pin mapping for ESP32-S3 with ST7789 display and FT6X36 capacitive touch:
Display (SPI)
| Function | GPIO Pin | Description |
|---|---|---|
| SPI SCK | GPIO 6 | SPI Clock |
| SPI MOSI | GPIO 7 | SPI Data Out |
| SPI MISO | GPIO 8 | SPI Data In (optional) |
| SPI CS | GPIO 10 | Chip Select |
| DC | GPIO 4 | Data/Command |
| RST | GPIO 3 | Reset |
| Backlight | GPIO 5 | Display backlight |
Touch Controller (I2C)
| Function | GPIO Pin | Description |
|---|---|---|
| I2C SDA | GPIO 1 | I2C Data |
| I2C SCL | GPIO 2 | I2C Clock |
| INT | GPIO 11 | Touch interrupt |
Hardware Connections
ESP32-S3 ST7789 Display FT6X36 Touch
----------- --------------- -------------
GPIO 6 ──────────► SCK
GPIO 7 ──────────► MOSI
GPIO 10 ──────────► CS
GPIO 4 ──────────► DC
GPIO 3 ──────────► RST
GPIO 5 ──────────► BACKLIGHT (via resistor)
GPIO 1 ──────────► SDA
GPIO 2 ──────────► SCL
GPIO 11 ◄────────── INT
Note: Use 3.3V for power. ST7789 typically requires 3.3V logic level.
Building
Standard build for ESP32-S3:
cd firmware/zeroclaw-esp32-ui
cargo build --release
Flash to device:
cargo espflash flash --release --monitor
Build for ESP32-C3 (RISC-V):
rustup target add riscv32imc-esp-espidf
cargo build --release --target riscv32imc-esp-espidf
Feature flags:
# Use ILI9341 display instead of ST7789
cargo build --release --features display-ili9341
# Enable WiFi support
cargo build --release --features wifi
# Enable touch support
cargo build --release --features touch-xpt2046
UI Design
The interface is defined in ui/main.slint with the following components:
- StatusBar: Shows connection status and app title
- MessageList: Displays conversation history
- InputBar: Text input with send button
- MainWindow: Root container with vertical layout
Customizing the UI
Edit ui/main.slint and rebuild:
cargo build --release
The build script automatically compiles Slint files.
Memory Optimization
For ESP32 (non-S3) with limited RAM:
-
Reduce display buffer size in
main.rs:const DISPLAY_WIDTH: usize = 240; const DISPLAY_HEIGHT: usize = 135; -
Use smaller font sizes in Slint UI
-
Enable release optimizations (already in Cargo.toml):
opt-level = "s"(optimize for size)lto = true(link-time optimization)
Troubleshooting
Display shows garbage
- Check SPI connections and pin mapping
- Verify display orientation in
Builder::with_orientation() - Try different baud rates (26MHz is default)
Out of memory
- Reduce Slint window size
- Disable unused features
- Consider ESP32-S3 with PSRAM
Touch not working
- Verify touch controller is properly wired
- Check I2C/SPI address configuration
- Ensure interrupt pin is correctly connected
License
MIT - See root LICENSE file