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).
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.binWriting the factory image without erasing first keeps the settings stored in the LittleFS partition.
| 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.
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.
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/staterequests, 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.
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.
| 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 |
- WLED 16.x builds on the Tasmota arduino-esp32 2.0.18 core (ESP-IDF 4.4.8). Its
ETH.hhas no SPI path, and the prebuiltlibesp_eth.awas compiled withoutCONFIG_ETH_SPI_ETHERNET_W5500on 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, theesp_ethmediator). ETHClass2replaces the core'sETHobject in SPI builds. It exposes the RMIIbegin()with the exact signature of the core's class (so WLED's RMII code is unchanged) plus abegin(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 intoinitEthernetRMII()), W5500 profiles takeinitEthernetSPI(), which reserves the six pins in the pin manager, performs the datasheet reset sequence, and starts the driver withrst = -1so 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, whereETH.begin(ETH_PHY_W5500, ...)exists natively. That is the "experimental W5500 code" mentioned for WLED 17 and does not apply to 16.x.
| 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.
- 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 itsui-patchscript, 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.
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.