Skip to content

Repository files navigation

WLED 16.0.1 + WIZnet W5500 SPI Ethernet for the QuinLED Dig-Next-2

⚠️ EXPERIMENTAL

This is not an official WLED release and not the official QuinLED firmware. It is a local derivative of the WLED v16.0.1 stable release with SPI Ethernet support (WIZnet W5500) bolted on, tested on one Dig-Next-2 with one W5500 module. It may misbehave in ways the stock firmware does not. Back up your WLED configuration before flashing, expect breaking changes between releases, and report problems in this repository's issues, not to the WLED or QuinLED projects.

Wired Ethernet for the QuinLED Dig-Next-2: a W5500 SPI Ethernet module on the QEXT + Stemma QT headers, driven by the ESP-IDF esp_eth stack inside WLED. Boots straight into Ethernet, falls back to WiFi/AP exactly like stock WLED, and keeps all the Dig-Next-2 defaults (LED outputs, buttons, PDM microphone, Power Manager relays).

Downloads

Pre-built images and a standalone flash package are on the Releases page (marked as pre-release).

File Use it for
WLED-Dig-Next-2_W5500_<tag>_flash-package.zip Easiest. Unzip, run flash.bat (Windows) or flash.sh (Linux/macOS). Contains all images below plus espflash binaries, so nothing else has to be installed.
WLED_16.0.1_Dig-Next-2_W5500_factory_0x0.bin Fresh install: whole flash image (bootloader, 8 MB partition table, app) for address 0x0 after erasing the chip.
WLED_16.0.1_Dig-Next-2_W5500.bin Update: app image for address 0x10000, or OTA upload in the WLED web UI (Config → Security & Update → Manual OTA) from any WLED 16.x with a large enough app partition, e.g. the official QuinLED Dig-Next-2 firmware.
..._Dig-Next-2_W5500_debug*.bin Same firmware with WLED_DEBUG: boot log on the USB serial port (115200 baud). For bug reports.
..._ESP32_Ethernet_W5500*.bin Generic 4 MB classic-ESP32 test build, boots into the "W5500 SPI (custom pins)" profile on the same GPIOs.
SHA256SUMS.txt Checksums of all of the above.

Manual flashing with esptool (replace COM5):

esptool.py --chip esp32 --port COM5 --baud 921600 erase_flash
esptool.py --chip esp32 --port COM5 --baud 921600 write_flash -z --flash_mode dio --flash_size 8MB 0x0 WLED_16.0.1_Dig-Next-2_W5500_factory_0x0.bin

Writing the factory image without erasing first keeps the settings stored in the LittleFS partition.

Hardware

W5500 Dig-Next-2 header GPIO Notes
SCLK QEXT green 25
MOSI QEXT blue 32
MISO QEXT yellow 0 strapping pin; the W5500 leaves MISO high-Z while CS is inactive, so boot and USB flashing are unaffected
CS QEXT white 33
INT Stemma QT SDA 15 input, pull-up, falling edge; serviced by the driver's ISR
RST Stemma QT SCL 14 output; held low 1 ms (≥ 500 µs per datasheet), then 2 ms wait (≥ 1 ms) before the first SPI access
3V3 / GND QEXT or Stemma QT a W5500 module draws up to ~180 mA at 3.3 V

Consequences:

  • The Stemma QT / I2C port is not available while the Ethernet module is fitted; the build sets no I2C pins.
  • SPI runs on VSPI (SPI3) at 20 MHz. HSPI stays free for 2-wire (DotStar/APA102) LED output. The "global SPI" bus for usermods (LED settings → hardware setup) also lives on VSPI and cannot be used together with the W5500.
  • The Ethernet MAC is the ESP32's factory Ethernet MAC (ESP_MAC_ETH, WiFi MAC + 3), the same one the internal RMII EMAC would use.

What is in the firmware

Board profiles added to WLED's Ethernet table (Config → WiFi Setup → Ethernet type):

# Name Pins
16 QuinLED Dig-Next-2 (W5500) fixed, table above
17 W5500 SPI (custom pins) from -D WLED_W5500_SCLK/MOSI/MISO/CS/INT/RST at build time (defaults = table above)

Build environments (WLED/platformio_override.ini, WLED/platformio.ini):

env Release name Board Content
dig-next-2-eth Dig-Next-2_W5500 ESP32-PICO-V3-02, 8 MB flash, 2 MB PSRAM Ethernet profile 16 preselected; LED1/LED2 on GPIO 2/4; buttons 34/35; PDM mic SD 7 / WS 8; usermods audioreactive (enabled by default), PowerManager v1.3.0 (relays 5/20/21/22 named External Relay, 5A_1, 10A_1, 5A_2, master AC relay, take-over mode), sht; AP name QuinLED-AP. Derived from the [env:dig-next-2] in the Power Manager repository.
dig-next-2-eth-debug Dig-Next-2_W5500_debug same + WLED_DEBUG serial logging
esp32_eth_w5500 ESP32_Ethernet_W5500 any classic ESP32, 4 MB generic test build, profile 17 preselected, no board-specific defaults

Existing WLED environments (esp32_eth and friends) are untouched; the SPI code is only compiled with -D WLED_USE_ETHERNET_SPI.

Verification status

Tested on 2026-09-01 on a Dig-Next-2 (chip reports ESP32-PICO-V3-02 rev 3.1) with a W5500 module, after a full chip erase and the factory image:

  • Boot log (debug build): initE: W5500 started on SPI host 2 @ 20MHz (SCLK 25, MOSI 32, MISO 0, CS 33, INT 15, RST 14), ETH-E: Connected, DHCP lease about 3 s after boot, the temporary AP closed automatically.
  • 20/20 pings at 0–1 ms; 40/40 HTTP /json/state requests, 27 ms average.
  • Ethernet type 16 shown in WiFi settings; GPIO 25/32/0/33/15/14 listed as reserved on the LED settings page; Power Manager and AudioReactive present in /json/info.
  • The release build was verified the same way over HTTP.

Not tested yet: LED output, buttons, relays and the microphone on this build (unchanged code, but not exercised), static IP on Ethernet, cable unplug/replug behaviour, DotStar/2-wire LEDs together with the W5500, long-term stability. Windows did not resolve wled-xxxxxx.local via mDNS during the test although the board reports mDNS started; the IP address works directly.

Building from source

Requirements: PlatformIO Core 6.x, Node.js (WLED builds its web UI with it), Python 3. Windows batch files are provided; the underlying pio run commands work everywhere.

build.bat                        :: builds dig-next-2-eth, dig-next-2-eth-debug and esp32_eth_w5500, collects images in firmware\<env>\
build.bat dig-next-2-eth         :: one environment
flash.bat dig-next-2-eth COM5    :: erase + factory image with PlatformIO's esptool (flash.bat [env] [COMx] [full|app])
python scripts\make_flash_package.py v16.0.1-w5500-beta.1   :: standalone zip + release assets in dist\

scripts/serial_capture.py COMx 60 (run with PlatformIO's Python, which has pyserial) resets the board and captures the boot log.

Repository layout

Path Content
WLED/ WLED v16.0.1 source tree with the changes below. The first commit of this repository is the unmodified upstream tag, so git diff <first-commit> HEAD -- WLED shows every change.
WLED/lib/esp_eth_w5500/ ESP-IDF v4.4.8 W5500 MAC/PHY driver, compiled into the project (see why)
WLED/lib/ETHClass2/ Ethernet class with RMII + SPI (W5500) support for arduino-esp32 2.0.x
WLED/usermods/PowerManager/ local copy of wled-usermod-powermanager v1.3.0
WLED/platformio_override.ini the Dig-Next-2 environments
WLED-16.0.1-W5500.patch the same changes as one git apply-able patch against the upstream v16.0.1 tag
build.bat, flash.bat, scripts/ build, image assembly, flashing, serial capture, packaging, and patch_wled_core.py (re-applies the core edits to a fresh 16.0.x checkout, anchor based)
package/ templates for the standalone flash package

How it works

  • WLED 16.x builds on the Tasmota arduino-esp32 2.0.18 core (ESP-IDF 4.4.8). Its ETH.h has no SPI path, and the prebuilt libesp_eth.a was compiled without CONFIG_ETH_SPI_ETHERNET_W5500 on every target (verified in the sdkconfig headers and the archives). Other W5500 forks solve this with a custom-built framework package; this repository instead compiles the two IDF 4.4.8 driver files inside the project. They only use public IDF APIs (spi_master, gpio, the esp_eth mediator).
  • ETHClass2 replaces the core's ETH object in SPI builds. It exposes the RMII begin() with the exact signature of the core's class (so WLED's RMII code is unchanged) plus a begin(ETH_PHY_W5500, ...) that sets up the SPI bus and device, the W5500 MAC/PHY, the netif and the event plumbing WLED already uses.
  • In WLED, initEthernet() reads the board profile: RMII profiles take the original code path (moved verbatim into initEthernetRMII()), W5500 profiles take initEthernetSPI(), which reserves the six pins in the pin manager, performs the datasheet reset sequence, and starts the driver with rst = -1 so the driver's own 100 µs reset pulse is skipped.
  • Upstream WLED main (17.0-dev) has since moved to ESP-IDF 5 / arduino-esp32 3.x, where ETH.begin(ETH_PHY_W5500, ...) exists natively. That is the "experimental W5500 code" mentioned for WLED 17 and does not apply to 16.x.

Changes to WLED (all in WLED/)

File Change
wled00/wled_ethernet.h six eth_spi_* fields appended to ethernet_settings; WLED_W5500_* pin/host/clock/reset defaults; ETH_PHY_W5500 placeholder in non-SPI builds
wled00/network.cpp profiles 16 and 17; initEthernet() split into initEthernetRMII() (verbatim) and initEthernetSPI()
wled00/const.h WLED_NUM_ETH_TYPES 16 → 18, two new WLED_ETH_* ids
wled00/wled.h, wled00/src/dependencies/network/Network.h include ETHClass2.h instead of <ETH.h> in SPI builds
wled00/cfg.cpp, wled00/xml.cpp reserved-pin reporting for SPI profiles; non-SPI builds hide the two entries from the dropdown
wled00/data/settings_wifi.htm the two dropdown entries
wled00/data/index.js, fcn_declare.h, um_manager.cpp, wled_server.cpp Power Manager's optional web-UI injection hook (design by @blazoncek, proposed upstream in wled/WLED#5741)
.gitignore platformio_override.ini is tracked in this repository
platformio.ini [env:esp32_eth_w5500]

New build flags: WLED_USE_ETHERNET_SPI (implies WLED_USE_ETHERNET), WLED_W5500_SCLK/MOSI/MISO/CS/INT/RST, WLED_W5500_SPI_HOST, WLED_W5500_SPI_MHZ, WLED_W5500_RST_LOW_US, WLED_W5500_RST_WAIT_MS.

Known limitations

  • I2C (Stemma QT) is unavailable, see Hardware.
  • The usermod "global SPI" bus cannot be used together with the W5500.
  • Pins of the two W5500 profiles are compile-time only; there is no UI to edit them (the WLED-MM implementation has one).
  • The Power Manager copy is pinned to the version listed above. Newer versions are drop-in (replace WLED/usermods/PowerManager/, re-run its ui-patch script, rebuild).
  • SPI Ethernet is slower than the RMII Ethernet of the Dig-Octa/QuinLED-ESP32-Ethernet boards. Fine for control, web UI, DDP/Art-Net/E1.31 at normal rates; not benchmarked at the limits.

Credits and licenses

This repository is mostly other people's work, assembled and adapted:

Component Origin License
WLED wled/WLED v16.0.1, Christian Schwinne and contributors. The RMII Ethernet code that the SPI path sits next to was written by @henrygab (wled/WLED#2123). EUPL-1.2
WLED/lib/esp_eth_w5500 ESP-IDF v4.4.8 components/esp_eth/src/esp_eth_{mac,phy}_w5500.c, w5500.h, Espressif Systems. Copied verbatim; build guards and a small declarations header added. Apache-2.0
WLED/lib/ETHClass2 arduino-esp32 ETH.cpp (Arduino / Espressif), whose 3.x SPI support was back-ported as ETHClass2 by LilyGO (Lewis He, LilyGO-T-ETH-Series) and broken out by @troyhacks (troyhacks/ETHClass2). Reduced to RMII + W5500, restructured, error handling and MAC selection changed. LGPL-2.1-or-later
WLED integration (network.cpp, wled_ethernet.h, config/UI bits) New code, following the design of @troyhacks' WLED-MM pull request MoonModules/WLED-MM#320 "W5500 Support for ALL boards": SPI pin fields on the board struct, ETH_PHY_W5500 table entries, the SPI/RMII branch in initEthernet(). EUPL-1.2
WLED/usermods/PowerManager intermittech/wled-usermod-powermanager v1.3.0 (Quindor, @blazoncek); UI injection hook by @blazoncek EUPL-1.2
Dig-Next-2 build environment examples/platformio_override.ini of the Power Manager repository; pinout from the Dig-Next-2 pinout guide
Flash package espflash 4.6.0 binaries, esp-rs contributors, unmodified MIT OR Apache-2.0
Build/flash/packaging scripts this repository EUPL-1.2

mdethmers/W5500_WLED (troyhacks' branch plus one environment) was used for reading only. Thanks to all of the above; the mistakes are ours.

License of this repository: EUPL-1.2, like WLED. Third-party components keep their own licenses as listed.

About

[EXPERIMENTAL] WLED 16.0.1 with WIZnet W5500 SPI Ethernet for the QuinLED Dig-Next-2. Local derivative build, not an official WLED or QuinLED release.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages