Bir ESP32 W5500 MQTT düğümü Wi-Fi'ın yerine bir ağ kablosu koyar; metal bir kontrol panosunun içinde veya fabrika sahasında bu çoğu zaman "çoğunlukla çalışıyor" ile "sorunsuz çalışıyor" arasındaki farktır. Bu eğitimde bir ESP32'yi W5500 SPI modülüyle ya da WT32-ETH01 gibi kartlardaki LAN8720 PHY ile kablolu Ethernet'e bağlayacak, link-up ve link-down olaylarını yönetecek ve makine verilerini broker.connectmq.com'a yayınlayacaksınız. MQTT kodu neredeyse hiç değişmez; asıl ilginç iş ağ katmanındadır.
ESP32 MQTT İçin Neden Kablolu Ethernet?
Wi-Fi kullanışlıdır ama endüstriyel ortamlarda kırılgandır. Çelik muhafazalar sinyali perdeler, motorlar ve sürücüler gürültü üretir, BT departmanları kablosuz istemcileri kısıtlar ve erişim noktaları otomasyon ekibine haber verilmeden değiştirilir veya yeniden yapılandırılır. Ethernet bu değişkenlerin çoğunu ortadan kaldırır:
| Etken | Wi-Fi | Kablolu Ethernet |
|---|---|---|
| Metal pano içinde | Zayıf sinyal veya hiç sinyal yok | Etkilenmez |
| Sürücülerden kaynaklanan elektriksel gürültü | Bağlantıyı bozabilir | Ekranlı kabloyla genellikle dayanıklı |
| Cihazdaki kimlik bilgileri | SSID ve parola gerekir | Link katmanı için gerekmez |
| Gecikme tutarlılığı | Yüke ve girişime göre değişir | Sabit |
| Güç | Ayrı besleme | Uygun bir modülle isteğe bağlı PoE |
| Hareketlilik | Var | Yok |
Bunun bedeli kablolama ve biraz daha karmaşık bir donanım kurulumudur. Bir makineyi, bir sayacı veya bir Modbus RS-485 cihazını okuyup MQTT'ye aktaran sabit bir düğüm için kablolu Ethernet genellikle doğru tercihtir.
W5500 mü, LAN8720 mi?
Bir ESP32'ye Ethernet portu kazandırmanın iki yaygın yolu vardır.
| W5500 | LAN8720 | |
|---|---|---|
| Arayüz | SPI, her ESP32 türüyle çalışır | RMII, orijinal ESP32'nin dahili EMAC'ini gerektirir |
| Kullanılan pinler | 4 SPI pini artı kesme ve reset | Yaklaşık 10 sabit pin |
| Tipik donanım | Küçük W5500 modülü, birçok S3 Ethernet kartı | WT32-ETH01, Olimex ESP32-POE, LilyGO T-ETH |
| Veri hızı | MQTT için fazlasıyla yeterli | Daha yüksek, MQTT'nin ihtiyacından da fazla |
| Arduino-ESP32 3.x desteği | ETH.h içinde yerleşik |
ETH.h içinde yerleşik |
Her ikisi de Arduino-ESP32 3.x'teki ETH kütüphanesi tarafından doğal olarak desteklenir ve her ikisi de aynı lwIP ağ yığınına bağlanır. İşin püf noktası şudur: link bir IP adresi aldığında NetworkClient, PubSubClient, DNS ve TLS tamamen Wi-Fi'daki gibi çalışır. Core 2.x kullanıyorsanız yükseltin; ETH.h içindeki W5500 desteği 3.x ile geldi ve eski geçici çözüm kütüphanelerine artık gerek yok. Arduino-ESP32 dokümantasyonu ve core ile birlikte gelen ETH örnekleri desteklenen PHY'leri listeler.
W5500 Modülünün Bağlantısı
| W5500 pini | ESP32 pini | Not |
|---|---|---|
| MOSI | GPIO 23 | SPI veri çıkışı |
| MISO | GPIO 19 | SPI veri girişi |
| SCLK | GPIO 18 | SPI saati |
| SCS / CS | GPIO 5 | Chip select |
| INT | GPIO 4 | Kesme, önerilir |
| RST | GPIO 14 | Reset |
| 3.3V | 3V3 | Bazı modüllerde regülatörlü 5 V girişi vardır |
| GND | GND | Ortak toprak |
SPI kablolarını kısa tutun; breadboard üzerinde yaklaşık 10 cm'nin altında. W5500 iletim sırasında kayda değer akım çekebilir; bu yüzden onu zayıf bir USB-seri kart regülatöründen değil, sağlam bir 3,3 V hattından besleyin. Breadboard'daki link sorunlarının çoğu yazılımdan değil, güç veya kablolamadan kaynaklanır.
ESP32 W5500 MQTT Sketch'i
Bu sketch Arduino-ESP32 3.x ve PubSubClient kullanır. Ethernet durumunu olaylar üzerinden izler, MQTT'ye yalnızca link bir IP adresine sahip olduğunda bağlanır ve link hızı dahil telemetriyi her beş saniyede bir yayınlar.
#include <ETH.h>
#include <SPI.h>
#include <NetworkClient.h>
#include <PubSubClient.h>
// W5500 pins
#define ETH_PHY_TYPE ETH_PHY_W5500
#define ETH_PHY_ADDR 1
#define ETH_PHY_CS 5
#define ETH_PHY_IRQ 4
#define ETH_PHY_RST 14
#define ETH_SPI_SCK 18
#define ETH_SPI_MISO 19
#define ETH_SPI_MOSI 23
const char* MQTT_HOST = "broker.connectmq.com";
const uint16_t MQTT_PORT = 1883;
const char* CLIENT_ID = "eth-node-6b2d90";
const char* BASE = "connectmq/demo/eth-node-6b2d90";
NetworkClient net;
PubSubClient mqtt(net);
volatile bool ethReady = false;
unsigned long lastAttempt = 0, lastPublish = 0;
void onNetworkEvent(arduino_event_id_t event) {
switch (event) {
case ARDUINO_EVENT_ETH_START:
ETH.setHostname("eth-node-6b2d90");
break;
case ARDUINO_EVENT_ETH_CONNECTED:
Serial.println("Ethernet link up");
break;
case ARDUINO_EVENT_ETH_GOT_IP:
Serial.printf("IP %s, %u Mbps, %s duplex\n", ETH.localIP().toString().c_str(),
ETH.linkSpeed(), ETH.fullDuplex() ? "full" : "half");
ethReady = true;
break;
case ARDUINO_EVENT_ETH_LOST_IP:
case ARDUINO_EVENT_ETH_DISCONNECTED:
Serial.println("Ethernet link down");
ethReady = false;
break;
case ARDUINO_EVENT_ETH_STOP:
ethReady = false;
break;
default:
break;
}
}
void onMessage(char* topic, byte* payload, unsigned int length) {
Serial.printf("Command %s: %.*s\n", topic, (int)length, (const char*)payload);
}
bool connectMqtt() {
String status = String(BASE) + "/status";
if (!mqtt.connect(CLIENT_ID, nullptr, nullptr, status.c_str(), 1, true, "offline")) {
Serial.printf("MQTT failed, state=%d\n", mqtt.state());
return false;
}
mqtt.publish(status.c_str(), "online", true);
mqtt.subscribe((String(BASE) + "/cmd/#").c_str(), 1);
Serial.println("MQTT connected over Ethernet");
return true;
}
void setup() {
Serial.begin(115200);
Network.onEvent(onNetworkEvent);
SPI.begin(ETH_SPI_SCK, ETH_SPI_MISO, ETH_SPI_MOSI);
if (!ETH.begin(ETH_PHY_TYPE, ETH_PHY_ADDR, ETH_PHY_CS, ETH_PHY_IRQ, ETH_PHY_RST, SPI)) {
Serial.println("W5500 not detected, check wiring");
}
// Optional static IP for networks without DHCP:
// ETH.config(IPAddress(192,168,10,50), IPAddress(192,168,10,1),
// IPAddress(255,255,255,0), IPAddress(192,168,10,1));
mqtt.setServer(MQTT_HOST, MQTT_PORT);
mqtt.setCallback(onMessage);
mqtt.setKeepAlive(30);
mqtt.setSocketTimeout(5);
}
void loop() {
if (!ethReady) {
if (mqtt.connected()) mqtt.disconnect();
return;
}
if (!mqtt.connected()) {
if (millis() - lastAttempt > 5000) { lastAttempt = millis(); connectMqtt(); }
return;
}
mqtt.loop();
if (millis() - lastPublish > 5000) {
lastPublish = millis();
char json[128];
snprintf(json, sizeof(json), "{\"uptime\":%lu,\"link\":%u,\"heap\":%u}",
millis() / 1000, ETH.linkSpeed(), ESP.getFreeHeap());
mqtt.publish((String(BASE) + "/telemetry").c_str(), json);
}
}
Bunun yerine LAN8720 kartı kullanmak
Bir WT32-ETH01 veya benzeri bir LAN8720 kartında SPI satırlarını ve W5500 tanımlarını kaldırın ve Ethernet'i RMII parametreleriyle başlatın. WT32-ETH01 için yaygın değerler şunlardır:
// type, PHY address, MDC, MDIO, power pin, clock mode
ETH.begin(ETH_PHY_LAN8720, 1, 23, 18, 16, ETH_CLOCK_GPIO0_IN);
Diğer kartlar PHY adresi, güç pini ve saat modu bakımından farklılık gösterir; bu yüzden kartın şemasını veya üreticinin örneğini kontrol edin. ETH.begin()'den sonraki her şey, olaylar ve MQTT kodu dahil, aynı kalır.
Düğümü Test Edin
Kabloyu takın, seri monitörü açın ve IP ... Mbps satırını, ardından MQTT connected over Ethernet satırını arayın. Sonra herhangi bir bilgisayardan abone olun:
mosquitto_sub -h broker.connectmq.com -p 1883 -i watch-6b2d90 -v -t "connectmq/demo/eth-node-6b2d90/#"
Şimdi kabloyu yirmi saniyeliğine çekin ve geri takın. Seri log link down, kablo çıkarıldığı süre boyunca hiçbir MQTT bağlantı denemesi, ardından link up, yeni bir IP olayı ve yeniden bağlanma göstermelidir. Abone tarafında keep-alive süresi dolduğunda Last Will'den gelen status offline mesajını, toparlanmadan sonra da online mesajını göreceksiniz. Bu "kablo çekme testi" her yeni donanım tasarımında yapılmaya değer; kararlı bir link ile yapılan tezgâh testinin asla ortaya çıkarmadığı güç ve PHY sorunlarını yakalar.
Bu alıştırma için herkese açık MQTT test broker'ı yeterlidir, ancak verileri herkes tarafından okunabilir. Makine verilerinin yeri özel kimlik bilgileridir.
Makine Verilerini MQTT İçin Şekillendirmek
Sketch'teki telemetri bilerek minimal tutulmuştur. Gerçek bir makinede her mesaja neyin gireceğine ve ne sıklıkla gönderileceğine erkenden karar verin. Pratikte iyi işleyen birkaç kural:
- Hızlı ve yavaş verileri ayırın. Her saniye değişen sayaçlar, sıcaklıklar ve durumlar sabit aralıkla bir
telemetrytopic'ine gider. Yapılandırma, firmware sürümü ve seri numaraları ise her bağlantıdan sonra bir kez retained olarak yayınlanan birinfotopic'ine gider. - Durumları değiştiğinde yayınlayın.
RUNNING,IDLEveyaFAULTgibi bir makine durumu, her beş saniyede tekrarlanan bir değerden çok yalnızca değiştiğinde yayınlanan retained bir mesaj olarak daha kullanışlıdır. - Birim ve zaman damgası ekleyin.
{"spindleTempC":41.2,"ts":1760600000}kendini açıklar; yalın bir41.2açıklamaz. - Payload'ları küçük tutun. Kablolu Ethernet'te bol bant genişliği vardır; ancak broker, dashboard'larınız ve sonraki her veritabanı uzun mesajların bedelini öder.
Bir ConnectMQ broker'a yayın yapıyorsanız bu kurallar devreye alma sırasında canlı topic gezgininin okunmasını da çok kolaylaştırır; çünkü her makine birkaç anlamlı topic'ten oluşan düzenli bir dal olarak görünür.
Endüstriyel Kurulum Kontrol Listesi
- Giden güvenlik duvarı kuralları. Tesis ağları çoğu zaman varsayılan olarak her şeyi engeller. Broker sunucunuza giden TCP 8883 izni isteyin; bağlantıyı ESP32 başlattığı için gelen kurala ihtiyacınız yoktur.
- 8883'te TLS kullanın.
NetworkClientSecure, Ethernet üzerinde Wi-Fi'daki gibi çalışır; WiFiClientSecure ile ESP32 MQTT SSL rehberini izleyin ve sınıf adını değiştirin. - Statik IP veya DHCP rezervasyonu. Operasyon ekipleri cihazı bulabilmek ister. DHCP rezervasyonunu yönetmek genellikle sabit kodlanmış bir adresten daha kolaydır.
- Zaman damgaları için NTP. Endüstriyel ağlar public NTP'yi engelleyebilir; tesisin zaman sunucusunu kullanın.
- Watchdog. Olay güdümlü tasarımı ESP32 MQTT yeniden bağlanma mantığı yazısındaki backoff ve bir donanım watchdog'u ile birleştirin.
- Topic yapısı. İlk günden itibaren
site/area/line/cell/device/telemetrygibi ISA-95 tarzı bir hiyerarşi kullanın; tek bir düğümden tüm tesise ölçeklenir. - Güç ve topraklama. DIN rayı güç kaynakları ve sürücülerin bulunduğu yerlerde ekranlı kablo kullanın; ayrı bir güç hattına gerek kalmaması için PoE modüllerini değerlendirin.
Yedek: Hücresel Yedekli Ethernet
Uzak sahalar için bazı tasarımlar Ethernet'i yedek olarak bir hücresel modemle birleştirir. MQTT katmanı aynı kalır; firmware PubSubClient'a verdiği Client'ı değiştirir. SIM7600 4G LTE MQTT ile ESP32 rehberi hücresel tarafı gösterir.
Tek Düğümden Tüm Tesise
Birkaç düğüm yayın yapmaya başladığında broker tesis için ortak bir altyapı haline gelir. Barındırılan bir MQTT broker, OT ağında bir sunucu çalıştırma ve yamalama ihtiyacını ortadan kaldırır. ConnectMQ, ISA-95 ve Unified Namespace topic yapılarını otomatik olarak algılar; topic'leriniz bu yapıyı izlediğinde portalın cihazlar görünümü Ethernet düğümlerinizi saha, alan ve hatta göre gruplar, eşik uyarı kuralları da normal aralığın dışına çıkan bir değeri işaretleyebilir. Bulutta bir MQTT broker kullanmak ayrıca mühendisliğin ve uzaktan destek ekibinin tesise VPN erişimi olmadan aynı canlı verileri görmesini sağlar. Tam ESP32 öğrenme yolu için ESP32 IoT eğitimine bakın.
ConnectMQ ile Başlayın
app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun. Her Ethernet düğümüne kendi kimlik bilgilerini verin ve makine verilerinizin birkaç dakika içinde canlı topic gezgininde belirmesini izleyin.
Sık Sorulan Sorular
PubSubClient ESP32'de Ethernet üzerinden çalışır mı?
Evet. PubSubClient herhangi bir Arduino Client'ını kabul eder; Arduino-ESP32 3.x'te NetworkClient aynı ağ yığını üzerinden hem Wi-Fi hem de Ethernet ile çalışır.
W5500'ü ESP32-S3 veya ESP32-C3 ile kullanabilir miyim?
Evet. W5500 SPI üzerinden bağlandığı için boş SPI pinleri olan her ESP32 türünde çalışır. LAN8720 ise dahili EMAC gerektirir; bunlar arasında buna yalnızca orijinal ESP32 sahiptir.
W5500 için Arduino Ethernet kütüphanesine ihtiyacım var mı?
Arduino-ESP32 3.x'te hayır. Yerleşik ETH kütüphanesi W5500'ü doğrudan destekler ve lwIP ile entegredir; böylece DNS, TLS ve NetworkClient Wi-Fi'daki gibi davranır.
ESP32 Wi-Fi ve Ethernet'i aynı anda kullanabilir mi?
Evet, her iki arayüz de etkin olabilir. Firmware'inizin MQTT bağlantısını hangisinin taşıdığını bildiğinden ve her ikisinden gelen olayları işlediğinden emin olun.



