Yazılardaki ürünleri komponentci.net'te inceleyebilir, hemen sipariş verebilirsiniz.komponentci.net →
KomponentciBlog Mağaza

ESP-NOW ile ESP32'ler Arası Wi-Fi'sız Haberleşme

ESP-NOW ile ESP32'ler Arası Wi-Fi'sız Haberleşme
Kısa cevap

ESP-NOW, ESP32 kartlarının modem ya da internet olmadan, birbirinin MAC adresine doğrudan küçük veri paketleri göndermesini sağlayan bir Espressif protokolüdür. Bağlantı kurma aşaması olmadığı için gecikme düşüktür. Klasik ESP-NOW'da bir paket en fazla 250 bayttır; kurulum için alıcının MAC adresini öğrenip göndericiye eş olarak eklemek yeterlidir.

Bahçedeki bir sensörün değerini evdeki bir ekrana taşımak için her zaman Wi-Fi modeme ihtiyacınız yoktur. ESP32 kartları, ESP-NOW sayesinde birbirleriyle doğrudan konuşabilir. Bu yazıda ESP-NOW'un ne olduğunu, hangi durumlarda Wi-Fi ve Bluetooth'a göre avantaj sağladığını, MAC adresinin nasıl öğrenildiğini ve iki ESP32 arasında çalışan gönderici ile alıcı kodunu adım adım anlatıyoruz.

ESP-NOW nedir?

ESP-NOW, Espressif'in geliştirdiği, ESP32 ve ESP8266 kartlarının Wi-Fi radyosunu kullanarak bir erişim noktasına bağlanmadan birbirine kısa veri paketleri göndermesini sağlayan bağlantısız bir haberleşme protokolüdür. Her kart, karşı tarafı MAC adresiyle tanır.

ESP-NOW'da "bağlan, sonra konuş" aşaması yoktur. Gönderici paketi hazırlar ve doğrudan alıcının adresine yollar. Bu yüzden kart uykudan uyandıktan çok kısa süre sonra veri gönderebilir; pil ile çalışan sensörlerde bu önemli bir kazançtır. ESP32 ile yeni tanışıyorsanız önce ESP32 başlangıç rehberi yazımızla kurulumu tamamlayın.

ESP-NOW ne zaman tercih edilmeli?

ESP-NOW, iki ya da daha fazla ESP kartı arasında modem olmadan, kısa ve sık veri aktarmanız gerektiğinde tercih edilir. Telefona ya da internete veri göndermeniz gerekiyorsa tek başına yetmez. Aşağıdaki tablo yaygın seçenekleri karşılaştırır:

YöntemModem gerekir mi?Bağlantı kurmaPaket boyutuUygun iş
ESP-NOWHayırYok250 bayta kadarESP kartları arası sensör ve kumanda
Wi-Fi + HTTP / MQTTEvetAğa bağlanma gerekirBüyük veriİnternet, web paneli, bulut
BLEHayırBağlantı gerekirKüçük paketlerTelefonla haberleşme
nRF24L01HayırYok32 bayta kadarESP olmayan kartlar (Arduino)

Arduino Uno gibi Wi-Fi'ı olmayan kartlarla benzer bir sistem kurmak istiyorsanız nRF24L01 ile kablosuz haberleşme yazımıza bakabilirsiniz. Sık kullanılan bir yöntem de ikisini birleştirmektir: sensör kartları ESP-NOW ile bir ana karta veri yollar, ana kart da Wi-Fi ile internete aktarır.

ESP32'nin MAC adresi nasıl öğrenilir?

ESP32'nin MAC adresi, karta küçük bir kod yükleyip Seri Monitör'den okunarak öğrenilir. ESP-NOW'da alıcının istasyon (STA) arayüzüne ait MAC adresi kullanılır. Aşağıdaki kod Arduino-ESP32 çekirdeğinin 3.x sürümü içindir:

#include <WiFi.h>
#include <esp_mac.h>

void setup() {
  Serial.begin(115200);
  uint8_t m[6];
  esp_read_mac(m, ESP_MAC_WIFI_STA);
  Serial.printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\n",
                m[0], m[1], m[2], m[3], m[4], m[5]);
}

void loop() {}

Çıkan adresi not alın ve kartın üzerine küçük bir etiketle yazın. Birden fazla kartla çalışırken hangi adresin hangi karta ait olduğunu karıştırmak en yaygın hatadır.

ESP-NOW ile iki ESP32 adım adım nasıl haberleşir?

İki ESP32'yi haberleştirmek için alıcının MAC adresini göndericiye eş (peer) olarak eklersiniz; alıcı da gelen paketleri bir geri çağırma fonksiyonuyla okur. Örnek olarak ESP32-WROOM-32 CP2102 geliştirme kartı ya da ESP32 geliştirme kartı CP2102 38 pin kullanılabilir.

  1. Arduino IDE'ye Arduino-ESP32 çekirdeğinin 3.x sürümünü kurun.
  2. Alıcı olacak karta MAC adresi kodunu yükleyin ve adresi not alın.
  3. Gönderici kodundaki aliciMac dizisine bu adresi yazın.
  4. Alıcı kodunu alıcı karta, gönderici kodunu diğer karta yükleyin.
  5. Alıcı kartın Seri Monitör'ünü 115200 baud ile açın; her saniye bir paket görmelisiniz.
  6. Paket gelmiyorsa MAC adresini ve iki tarafın aynı Wi-Fi kanalında olduğunu kontrol edin.
ESP-NOW akış şeması: gönderici ESP32 alıcının MAC adresine 250 bayta kadar paket gönderir; gönderici WiFi.mode, esp_now_init, esp_now_add_peer ve esp_now_send adımlarını, alıcı esp_read_mac, WiFi.mode, esp_now_init ve esp_now_register_recv_cb adımlarını izler
Alıcının MAC adresi göndericiye eş olarak eklenir; paket en fazla 250 bayttır ve iki taraftaki veri yapısı aynı olmalıdır.

Gönderici kodu

#include <WiFi.h>
#include <esp_now.h>

uint8_t aliciMac[] = {0x24, 0x6F, 0x28, 0xAA, 0xBB, 0xCC}; // kendi aliciniz

typedef struct {
  int sayac;
  float sicaklik;
} Paket;

Paket p;

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  if (esp_now_init() != ESP_OK) {
    Serial.println("ESP-NOW baslatilamadi");
    return;
  }
  esp_now_peer_info_t es = {};
  memcpy(es.peer_addr, aliciMac, 6);
  es.channel = 0;      // 0 = kartin o anki kanali
  es.encrypt = false;
  esp_now_add_peer(&es);
}

void loop() {
  p.sayac++;
  p.sicaklik = 24.5;   // burada sensor okunabilir
  esp_err_t s = esp_now_send(aliciMac, (uint8_t*)&p, sizeof(p));
  Serial.println(s == ESP_OK ? "gonderildi" : "hata");
  delay(1000);
}

Alıcı kodu

#include <WiFi.h>
#include <esp_now.h>

typedef struct {
  int sayac;
  float sicaklik;
} Paket;

void veriGeldi(const esp_now_recv_info_t *bilgi, const uint8_t *veri, int uzunluk) {
  if (uzunluk != sizeof(Paket)) return;
  Paket p;
  memcpy(&p, veri, sizeof(p));
  Serial.printf("sayac=%d sicaklik=%.1f\n", p.sayac, p.sicaklik);
}

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  if (esp_now_init() != ESP_OK) return;
  esp_now_register_recv_cb(veriGeldi);
}

void loop() {}

İki taraftaki Paket yapısı birebir aynı olmalıdır. Alan ekler ya da sıralarını değiştirirseniz iki kodu birlikte güncelleyin. Arduino-ESP32'nin 2.x sürümünde alıcı fonksiyonunun ilk parametresi const uint8_t *mac biçimindedir; eski bir örnek derlenmiyorsa nedeni genellikle budur. ESP_OK yanıtı paketin gönderim kuyruğuna alındığını gösterir, alıcıya ulaştığını değil.

Kanal ve şifreleme nasıl ayarlanır?

ESP-NOW'da gönderici ve alıcı aynı Wi-Fi kanalında olmalıdır; şifreleme ise isteğe bağlıdır. Hiçbir kart modeme bağlı değilse ikisi de varsayılan kanalda kalır ve ek ayar gerekmez. Alıcı aynı anda bir modeme de bağlanıyorsa modemin kanalına geçer; bu durumda göndericiyi de aynı kanala ayarlamanız gerekir.

  • Eş eklerken channel = 0 kartın o anki kanalını kullanır.
  • Bir karta toplam en fazla 20 eş eklenebilir; şifreli eş sayısı bundan daha düşüktür.
  • Şifreleme için iki tarafta aynı anahtar (PMK ve LMK) tanımlanır ve eşte encrypt = true yapılır.
  • Adres olarak FF:FF:FF:FF:FF:FF kullanılırsa paket, aynı kanaldaki tüm ESP-NOW alıcılarına yayınlanır.

ESP-NOW menzili ne kadardır?

ESP-NOW'un sabit bir menzili yoktur; mesafeyi anten türü, duvarlar, kartın yerleşimi ve çevredeki 2,4 GHz yoğunluğu belirler. Aynı protokol, açık alanda ev içine göre çok daha uzağa ulaşır. Bu yüzden menzili kendi ortamınızda, gönderici kodundaki sayaç değerlerinin atlayıp atlamadığına bakarak ölçmeniz en doğrusudur.

  • Kartı metal kutu içine koymayın; PCB antenin çevresinde boşluk bırakın.
  • Uzun mesafe için harici antenli ESP32-WROOM-32U modülü ile 2,4 GHz uFL konektörlü PCB anten kullanabilirsiniz.
  • Kartları yerden yükseğe ve birbirini görecek biçimde yerleştirin.
  • Espressif'in uzun menzil (LR) Wi-Fi modu iki tarafta da açılırsa menzil artabilir; veri hızı ise düşer.

ESP-NOW destekli kartların tamamını geliştirme kartları kategorisinde bulabilirsiniz. USB-C girişli bir kart istiyorsanız ESP32 Type-C 30 pin geliştirme kartı da aynı kodla çalışır.

Sık sorulan sorular

ESP-NOW internet bağlantısı gerektirir mi?

Hayır, ESP-NOW internet ya da modem gerektirmez. Kartlar Wi-Fi radyosunu kullanır, ancak bir ağa bağlanmadan doğrudan birbirine paket gönderir. Bu sayede modemin olmadığı bahçe, tarla ya da depo gibi yerlerde de çalışır. Toplanan verileri internete taşımak isterseniz zincire Wi-Fi'a bağlı bir ana kart eklemeniz gerekir.

ESP-NOW ile Wi-Fi aynı anda kullanılabilir mi?

Evet, ESP-NOW ve Wi-Fi aynı kartta birlikte kullanılabilir. Bunun için kart istasyon modunda modeme bağlanır ve ESP-NOW da başlatılır. Tek koşul kanaldır: kart modemin kanalına geçtiği için ona veri gönderen diğer kartların da aynı kanalı kullanması gerekir. Modem kanalı otomatik değişirse bağlantı kesilebilir, bu yüzden modemde sabit kanal seçmek işinizi kolaylaştırır.

Bir gönderici birden fazla alıcıya veri gönderebilir mi?

Evet, bir gönderici birden fazla alıcıya veri gönderebilir. Her alıcıyı ayrı eş olarak ekleyip paketleri tek tek adreslerine yollayabilirsiniz. Ya da hedef adres olarak FF:FF:FF:FF:FF:FF yayın adresini kullanırsınız; bu durumda aynı kanaldaki tüm alıcılar paketi alır. Yayın paketlerinde teslim onayı olmadığını ve şifreleme kullanılamadığını unutmayın.

ESP8266 ile ESP32 ESP-NOW ile haberleşebilir mi?

Evet, ESP8266 ve ESP32 ESP-NOW ile birbirine veri gönderebilir; protokol aynıdır. Fark yazılım tarafındadır: ESP8266'da espnow.h kütüphanesi ve farklı fonksiyon adları kullanılır. Ayrıca iki kartta veri yapısının bellek düzeni aynı olmalıdır. Karışık sistemlerde yapıya tek tip alanlar koymak ve boyutu iki tarafta da yazdırıp karşılaştırmak hataları önler.

Paketin alıcıya ulaştığını nasıl anlarım?

Paketin ulaştığını gönderim geri çağırma fonksiyonuyla anlarsınız. esp_now_register_send_cb ile kaydedilen bu fonksiyon, alıcı paketi aldığında başarı, almadığında hata durumu bildirir. Fonksiyonun parametre tipi Arduino-ESP32 sürümüne göre değiştiği için kurulu sürümün örnek kodlarındaki imzayı kullanın. Basit projelerde alıcıdaki sayaç değerlerinin atlanıp atlanmadığına bakmak da yeterlidir.

Özet

  • ESP-NOW, ESP kartlarının modem olmadan MAC adresiyle doğrudan haberleşmesini sağlar.
  • Klasik ESP-NOW'da bir paket en fazla 250 bayttır; kısa sensör ve kumanda verileri için uygundur.
  • Alıcının STA MAC adresi öğrenilir, göndericiye eş olarak eklenir ve iki tarafta aynı veri yapısı kullanılır.
  • Gönderici ve alıcı aynı Wi-Fi kanalında olmalıdır; modeme bağlı kartlarda kanal modeme göre belirlenir.
  • Menzil ortama bağlıdır; harici antenli modül ve iyi yerleşim mesafeyi artırır.

Bu yazıdaki ürünler

Diğer yazılar