PoE (Power over Ethernet) to standard, który pozwala na przesyłanie zarówno danych, jak i zasilania przez jeden kabel Ethernet. ESP32-PoE2 od Olimex to płytka zgodna z tym standardem, oferująca dwa rodzaje łączności: bezprzewodową (Wi-Fi) oraz przewodową (Ethernet, przez układ LAN8720). Właśnie tę płytkę chciałbym tu pokazać.
ESP32-PoE2 to projekt open source i open hardware od Olimex. Pełne źródła projektu (w tym PCB w KiCad) są dostępne na GitHubie. Swój egzemplarz kupiłem za 120 zł. Wybrałem wersję z dodatkową pamięcią, czyli bazującą na ESP32-WROVER-E-N4R8 z 4 MB Flash i 8 MB PSRAM.
TPS2378PW realizuje zasilanie PoE i jest zgodny ze standardem IEEE 802.3. Wymagane jest napięcie wejściowe co najmniej 37 V. Sama płytka jest w stanie zasilać zewnętrzne układy – posiada wyjścia 24 V / 0.75 A lub 12 V / 1.5 A, a także 5 V / 1.5 A oraz 3.3 V / 1 A, przy łącznej mocy wyjściowej do 25 W.
Uwaga: ESP32-POE2 nie posiada separacji galwanicznej od zasilania Ethernet, co może powodować pętle masy. Podczas programowania przez USB należy odłączyć kabel Ethernet (jeśli PoE jest aktywne). Podłączanie zewnętrznego zasilania może być niebezpieczne - zaleca się użycie Olimex USB-ISO w celu ochrony komputera i płytki.
Z dodatkowych peryferiów, mamy tu złącze na kartę microSD, wbudowany konwerter USB na UART do programowania (CH340), kontroler BL4054 do pracy z baterią LiPo, oraz bogate złącza, w tym Olimexowe UEXT.
Schemat:
Płytkę programuje w PlatformIO, i to w tym środowisku pokażę kilka przykładów.
Hello World LAN8720
Płytkę tę najbardziej wyróżnia LAN8720 i to na nim się tutaj skupię. Najpierw platformio.ini - biblioteki PIO mają już profil tej płytki (esp32-poe-iso), jest również tam gotowa biblioteka do LAN8720.
[env:esp32-poe-iso]
platform = espressif32
board = esp32-poe-iso
framework = arduino
monitor_speed = 115200
build_flags =
-D ETH_PHY_TYPE=ETH_PHY_LAN8720
-D ETH_PHY_ADDR=0
-D ETH_PHY_MDC=23
-D ETH_PHY_MDIO=18
-D ETH_PHY_POWER=12
-D ETH_CLK_MODE=ETH_CLOCK_GPIO0_OUT
-D BOARD_HAS_PSRAM
-mfix-esp32-psram-cache-issue
W głównym pliku z kodem, main.cpp, trzeba załączyć nagłówek ETH.h, potem można dodać callback do obsługi zdarzeń, a nawet podłączyć socket pod docelowy host. To pozwoli sprawdzić, czy łączność jest dostępna:
Kod: C / C++
Sprawdziłem odpowiedź do nazwy domenowej google.com - funkcja connect sama zamienia ją na IP.
Rezultat:
ets Jul 29 2019 12:21:46
rst:0x1 (POWERON_RESET),boot:0x1b (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:184
load:0x40078000,len:12680
load:0x40080400,len:2908
entry 0x400805c4
Olimex ESP32-POE2 Ethernet Test (v2.x compat)...
ETH Started
ETH Connected
ETH Got IP
ETH IP: 192.168.0.137
Connecting to google.com
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Content-Security-Policy-Report-Only: object-src 'none';base-uri 'self';script-sr
c 'nonce-rvcm1L9GDkZjYCPWad4kQw' 'strict-dynamic' 'report-sample' 'unsafe-eval'
'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other
-hp
Date: Thu, 29 Jan 2026 18:19:25 GMT
Expires: Sat, 28 Feb 2026 18:19:25 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<
TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<
A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
Closing connection
Płytka poprawnie otrzymuje IP przez DHCP od routera, a potem udaje się jej zamienić nazwę hosta na IP i wysłać tam prosty pakiet HTTP. Odpowiedź też zostaje odebrana, widzimy tu, że Google próbuje nas przekierować. ESP również pojawia się na liście klientów DHCP routera.
Serwer HTTP
Zastanawiało mnie jeszcze, czy można zrobić coś przeciwnego - nie nawiązywanie połączenia, lecz oczekiwanie na nie. W ten sposób przygotowałem prosty serwer, który nasłuchuje na porcie 80 (HTTP) i odbiera pakiety przez przewód LAN:
#include <Arduino.h>
#include <ETH.h>
#include <WebServer.h>
#include <WiFi.h>
WebServer server(80);
static bool eth_connected = false;
// In v2.x, the event handler uses WiFiEvent_t and the signature is slightly
// different
void onEvent(WiFiEvent_t event) {
switch (event) {
case ARDUINO_EVENT_ETH_START:
Serial.println("ETH Started");
ETH.setHostname("esp32-ethernet");
break;
case ARDUINO_EVENT_ETH_GOT_IP:
Serial.println("ETH Got IP");
Serial.print("ETH IP: ");
Serial.println(ETH.localIP());
eth_connected = true;
server.begin();
Serial.println("HTTP server started");
break;
case ARDUINO_EVENT_ETH_DISCONNECTED:
Serial.println("ETH Disconnected");
eth_connected = false;
break;
case ARDUINO_EVENT_ETH_STOP:
Serial.println("ETH Stopped");
eth_connected = false;
break;
default:
break;
}
}
void handleRoot() {
String html = "<!DOCTYPE html><html><head><title>ESP32-POE2</title>";
html += "<style>body { font-family: Arial; text-align: center; margin-top: "
"50px; }";
html += "h1 { color: #0066cc; }</style></head><body>";
html += "<h1>Hello World from ESP32-POE2!</h1>";
html += "<p>Ethernet connection is stable and server is running.</p>";
html += "<p>Uptime: " + String(millis() / 1000) + " seconds</p>";
html += "</body></html>";
server.send(200, "text/html", html);
}
void setup() {
Serial.begin(115200);
Serial.println("Olimex ESP32-POE2 Ethernet Test (v2.x compat)...");
WiFi.onEvent(onEvent);
server.on("/", handleRoot);
// PHY address: 0
// Power pin: 12
// MDC pin: 23
// MDIO pin: 18
// PHY type: ETH_PHY_LAN8720
ETH.begin(0, 12, 23, 18, ETH_PHY_LAN8720, ETH_CLOCK_GPIO0_OUT);
}
void loop() {
if (eth_connected) {
server.handleClient();
}
}
Biblioteki wszystko obsługują - serwer jest dostępny bez Wi-Fi:
Podsumowanie
To niewątpliwie ciekawa płytka, zwłaszcza jak zamierzamy korzystać z PoE. Obecność PSRAM też jest plusem. Co więcej, wszystko jest łatwe w uruchomieniu - mamy pod to gotowe biblioteki, wystarczy skonfigurować piny. Nie było problemu ze zmapowaniem przewodowego Ethernetu pod serwer HTTP czy tam z nawiązaniem połączenia ze światem zewnętrznym.
Samego PoE nie testowałem, gdyż nie mam takiego zasilacza, ale być może jeszcze do tego wrócę.
Czy korzystaliście już z PoE w projektach? Czy widzicie potencjał dla takiej płytki?
Fajne? Ranking DIY Pomogłem? Kup mi kawę.