Yes that is for sure !
I have managed successfully using VSPI default pins and Ethernet_Generic.h but i think also the standard Ethernet.h works.
Keep in mind that the I2S parallel mode is rather memory wasteful. I considered using 3 ports but 4 universes for each, and it sucked up a whopping 102Kb of RAM. so in the end i decided for single channel I2S instead. With shorter strips this is of course less of an issue. I just ran out of memory with the Ethernet port using some , and the Sd-card using 50Kb, i had Udp on both WiFi and Ethernet, and in the end i had no space left for a webserver and Http Updates anymore. So if you plan to use multiple strips, try and make them the same length.
I2S converts 2 bits into 1 byte, the nibble representing either a 0 or a 1 (eg 1000 = 0 & 1110 = 1) due to the nature of the WS281x signal. the pixelbuffer is also still needed before compile, so in the end 4 universes is 680 pixels * 3 = 2040 bytes * 5 equals 10200 bytes just for the output buffer, and in parallel mode all 8 channels get allocated.
This is the ethernet example i use
//#define W5500_RST_PORT 21 // i had it connected to the RST of the ESP32 before, but it is good to pull the //RST of the W5500 LOW for 1 ms before init
//#define ETHERNET_LARGE_BUFFERS
#define W5500_CS 5
#define SPI_FRQ 32000000
#include <WiFi.h>
#include <WebServer.h>
#include <SPI.h>
#include <EthernetWebServer.h>
#include "Ethernet_Generic.h"
// #include <EthernetUdp.h> // not needed yet
const char* ssid = "XXX";
const char* password = "xxxxxxxx";
EthernetWebServer ethernetServer(80);
WebServer wifiServer(80);
const int led = 2;
void handleEthernetRoot() {
ethernetServer.send(200, "text/plain", "Hello from ESP32 Ethernet!");
}
void handleWiFiRoot() {
wifiServer.send(200, "text/plain", "Hello from ESP32 WiFi!");
}
void setup() {
Serial.begin(115200);
delay(100);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
SPI.setFrequency(SPI_FRQ);
Ethernet.init (W5500_CS);
// start the ethernet connection and the server:
// Use DHCP dynamic IP
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x01};
//uint16_t index = millis() % NUMBER_OF_MAC;
// Use Static IP
//IPAddress ip(192, 168, 2, 222);
//Ethernet.begin(mac, ip);
Ethernet.begin(mac);
Serial.println("Currently Used SPI pinout:");
Serial.print("MOSI:");
Serial.println(MOSI);
Serial.print("MISO:");
Serial.println(MISO);
Serial.print("SCK:");
Serial.println(SCK);
Serial.print("CS/SS:");
Serial.println(W5500_CS);
ethernetServer.on("/", handleEthernetRoot);
ethernetServer.begin();
Serial.print("HTTP EthernetWebServer is @ IP : ");
Serial.println(Ethernet.localIP());
wifiServer.on("/", handleWiFiRoot);
wifiServer.begin();
Serial.print("HTTP WiFiWebServer is @ IP : ");
Serial.println(WiFi.localIP());
}
void loop() {
ethernetServer.handleClient();
wifiServer.handleClient();
}
This is a working ethernet example which actually run a webserver on both ethernet & wifi, and Udp can work on both (though do need a separate object)
You can keep an eye on memory usage using something like this
void ShowFreeHeap(String msg) {
static uint32_t Freeheap = esp_get_free_heap_size();
Serial.println("Free memory: " + String(esp_get_free_heap_size()) + " bytes");
Serial.println(msg + " : " + String(Freeheap - esp_get_free_heap_size()) + "bytes");
Freeheap = esp_get_free_heap_size();
}
Amazing to think that i actually ran out on an ESP32.