ESP32-S3 Smart Display Portal with W5500 Ethernet and WS2812 LED Control
A comprehensive IoT display portal combining ESP32-S3 with W5500 hardware TCP/IP for stable ethernet connectivity, 4" TFT display, and addressable LED control


DFRobot - WS2812B LED Strip
x 1
Introduction
This project builds a wired display and LED control portal using an ESP32-S3 microcontroller, a WIZnet W5500 Ethernet Controller, a 4″ ST7796 SPI TFT display, and WS2812 LED strips. It favors wired reliability and low latency over Wi-Fi, making it ideal for dashboards, visual controllers, or industrial indicators. Planned extensions include HTTP/REST APIs, PC applications, and smart home integration.
WIZnet Product Integration
The WIZnet W5500 is connected to the ESP32-S3 via SPI and handles Ethernet communications through its hardware TCP/IP stack. With support for multiple sockets, large internal buffers, and low-latency operation, the W5500 enables deterministic and reliable networking without burdening the MCU.
The intended data path is:
ESP32-S3 MCU → SPI → W5500 → Wired LAN → HTTP/REST clients or servers.
Technical Implementation
Hardware
SPI Bus Allocation: The W5500 and TFT display both use SPI, requiring chip-select management. When using WS2812 LEDs, the led_strip
RMT backend is recommended to avoid bus conflicts.
Critical Signals:
- W5500: MOSI, MISO, SCLK, CS, optional INT/RST, 3.3 V logic.
- ST7796 TFT: SCK, MOSI, CS, DC, RST, BL.
- WS2812: Data line (5 V logic recommended), 5 V power, common ground.
Power: High-current LED strips need a separate 5 V power rail with a large electrolytic capacitor near the strip to stabilize voltage.
Software
- LED Control: Uses the
led_strip
component. The RMT backend is preferred for precision and independence from SPI devices. - Display: The ST7796 TFT can be driven via an ESP-IDF-compatible driver or with GUI libraries such as LVGL for advanced UIs.
- Networking (Planned): Configuration of the W5500 for DHCP/static IP, automatic reconnection, and an HTTP/REST API service for remote control.
Reproduction Steps
- Clone the repository and set the target:
idf.py set-target esp32s3
. - Install required components via the ESP-IDF Component Manager.
- Configure LED pin and LED count in project settings.
- Build, flash, and monitor with
idf.py build flash monitor
. - Connect LEDs to a proper 5 V power supply.
Block Diagram
- ESP32-S3 → SPI → TFT Display
- ESP32-S3 → SPI → WIZnet W5500 → LAN
- ESP32-S3 → RMT → WS2812 LEDs
Core Features and Performance
Implemented
- ESP-IDF scaffolding for ESP32-S3.
- WS2812 LED control with presets and button interaction.
Planned
- W5500 Ethernet support.
- HTTP/REST API endpoints.
- Multi-strip LED control.
- Display configuration and UI rendering.
- PC application and Home Assistant integration.
Performance (future measurement plan)
- LED frame rates vs. LED count and brightness.
- Ethernet latency and reconnect time.
- TFT refresh rate with partial and full updates.
Code Analysis
The repository includes a minimal LED pipeline based on the
led_strip
component. The get-started blink example shows the core loop—initialize the strip, set a pixel color, and refresh—providing a clean baseline for later features (Ethernet control, REST API, and TFT UI). This snippet captures the essential update flow we build upon.
// path: test_examples/get-started/blink/main/blink_example.c
// func: app_main | purpose: init LED strip and blink one pixel
void app_main(void) {
led_strip_handle_t strip;
led_strip_config_t cfg = {
.strip_gpio_num = CONFIG_BLINK_GPIO,
.max_leds = 1,
};
led_strip_rmt_config_t rmt = {
.clk_src = RMT_CLK_SRC_DEFAULT,
.resolution_hz = 10 * 1000 * 1000
};
led_strip_new_rmt_device(&cfg, &rmt, &strip);
while (true) {
led_strip_set_pixel(strip, 0, 16, 16, 16); // dim white
led_strip_refresh(strip);
vTaskDelay(pdMS_TO_TICKS(500));
led_strip_clear(strip);
led_strip_refresh(strip);
vTaskDelay(pdMS_TO_TICKS(500));
}
}
Applications and Use Cases
- Home Dashboard: Ethernet-connected control panel with LED status indicators.
- Event Visuals: Real-time LED animations for shows and interactive installations.
- Industrial Indicators: Low-latency wired display with LED alarms.
- PC Companion: Desktop application controlling presets over Ethernet.
- Smart Home Integration: Planned HTTP/REST hooks for Home Assistant.
- Extension Ideas
- Add LVGL-based GUI with efficient SPI updates.
- Implement robust DHCP/static IP fallback and reconnection.
- Add OTA update capability over Ethernet.
- Harden security with token authentication and HTTPS gateways.
Safety Notes
- High current demand from LED strips requires careful power design.
- Always use a common ground between MCU and LED supply.
- Avoid SPI conflicts by using RMT for WS2812 instead of SPI backend.
Conclusion
- This project demonstrates how WIZnet W5500 can add reliable wired networking to an ESP32-S3-based LED and display portal. With the LED control loop working and Ethernet plus HTTP/REST planned, it offers makers a strong foundation for stable dashboards, installations, and automation hubs.
- Call to action: Clone the repository, assemble the hardware, and contribute to expanding Ethernet and HTTP functionality for a fully networked portal.