ESP32 ve Arduino

ESP32 W5500 MQTT: Güvenilir Endüstriyel Düğümler İçin Kablolu Ethernet

Bir ESP32'yi W5500 SPI modülü veya LAN8720 PHY ile kablolu Ethernet'e bağlayın, kablo ve link olaylarını düzgünce yönetin ve Wi-Fi'a bağımlı kalmadan makine verilerini MQTT üzerinden yayınlayın.

esp32 w5500 mqtt panosunda W5500 Ethernet modülü ve ağ kablosu bağlı ESP32
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

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 telemetry topic'ine gider. Yapılandırma, firmware sürümü ve seri numaraları ise her bağlantıdan sonra bir kez retained olarak yayınlanan bir info topic'ine gider.
  • Durumları değiştiğinde yayınlayın. RUNNING, IDLE veya FAULT gibi 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 bir 41.2 açı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

  1. 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.
  2. 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.
  3. Statik IP veya DHCP rezervasyonu. Operasyon ekipleri cihazı bulabilmek ister. DHCP rezervasyonunu yönetmek genellikle sabit kodlanmış bir adresten daha kolaydır.
  4. Zaman damgaları için NTP. Endüstriyel ağlar public NTP'yi engelleyebilir; tesisin zaman sunucusunu kullanın.
  5. 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.
  6. Topic yapısı. İlk günden itibaren site/area/line/cell/device/telemetry gibi ISA-95 tarzı bir hiyerarşi kullanın; tek bir düğümden tüm tesise ölçeklenir.
  7. 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.

İlgili yazılar

ESP32 NTP MQTT Zaman Damgası: Her Mesaja Doğru Zaman Ekleyin

ESP32 saatini NTP ile eşitleyin, ISO 8601 ve epoch milisaniye zaman damgalarını biçimlendirin ve bunları MQTT payload'larına ekleyin; böylece ölçümler geç yayınlansa bile gerçek alınma zamanlarını korur.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.