Merhabalar!

Bugün sizlerle ESP32 kartları arasında Wi-Fi router’a ihtiyaç duymadan, doğrudan cihazdan cihaza haberleşmeyi sağlayan ESP-NOW protokolünü inceleyeceğiz. MicroPython 1.28 ile gelen espnow modülü sayesinde bu protokolü Python ile kullanmak artık çok kolay. Ben bu protokolü birkaç haftadır sensör projelerimde kullanıyorum ve gerçekten Wi-Fi’ye göre çok daha hızlı ve güvenilir olduğunu söyleyebilirim. Bu yazıda iki ESP32 kartı arasında DHT22 sıcaklık sensöründen veri gönderen bir P2P sensör ağı kuracağız.

ESP-NOW Nedir?

ESP-NOW, Espressif tarafından geliştirilen ve ESP32/ESP8266 çiplerinde bulunan özel bir kablosuz haberleşme protokolüdür. Normal Wi-Fi’nin aksine bir router’a (erişim noktasına) ihtiyaç duymaz. Cihazlar doğrudan birbiriyle konuşur, Bluetooth Low Energy gibi ama 2.4 GHz Wi-Fi radyosunu kullanarak.

ESP-NOW’ün başlıca özellikleri şunlardır:

  • Router gerekmez cihazlar doğrudan peer-to-peer (P2P) haberleşir
  • Düşük gecikme Wi-Fi connection establishment aşaması yok, veri anında iletilir
  • Maksimum 250 byte payload küçük veri paketleri için ideal (sensör verisi, komutlar)
  • Şifreli iletişim CCMP/AES-256 ile şifreleme desteği
  • ~20 metre menzil kapalı alanda pratik menzil
  • 250’ye kadar peer bir cihaz 250 farklı cihazla eşleşebilir
  • Wi-Fi ile paralel çalışabilir aynı radyo kullanılır ama çakışma yok

Bu özellikler ESP-NOW’u IoT sensör ağları, uzaktan kumanda ve cihazlar arası senkronizasyon için mükemmel kılar.

1. Gerekli Malzemeler

Bu projeyi takip etmek için şunlara ihtiyacınız var:

  • 2 adet ESP32 geliştirme kartı (herhangi bir ESP32 varyantı olur örn.: DevKit, NodeMCU-32S vb.)
  • 1 adet DHT22 veya DHT11 sıcaklık/nem sensörü
  • Jumper kablolar ve breadboard
  • USB kablo (programlama için)
  • Thonny IDE (MicroPython geliştirme için)
  • MicroPython 1.28 veya üstü firmware

MicroPython 1.28 sürümü espnow modülünü standart olarak içerir. Daha eski sürümlerde bu modül yok, bu yüzden firmware güncellemeniz gerekir.

2. MicroPython Firmware Yükleme

Öncelikle her iki ESP32’ye de MicroPython 1.28+ yüklememiz gerekiyor. esptool ile yapalım:

pip install esptool

ESP32’yi USB ile bilgisayara bağlayın ve port’u tespit edin. macOS’ta genellikle /dev/cu.usbserial-*, Linux’ta /dev/ttyUSB0 olur.

Firmware’i indirin (MicroPython resmi sitesinden ESP32 Generic v1.28.0 bin dosyasını):

esptool.py --port /dev/cu.usbserial-0001 erase_flash
esptool.py --port /dev/cu.usbserial-0001 --baud 460800 write_flash -z 0x1000 esp32-20260406-v1.28.0.bin

İki kartı da aynı şekilde flash’layın. Thonny IDE’yi açıp kartlara bağlanarak REPL prompt’unu görebildiğinizi doğrulayın:

MicroPython v1.28.0 on 2026-04-06; ESP32 module with ESP32
Type "help()" for more information.
>>>

3. MAC Adreslerini Öğrenme

ESP-NOW’da cihazlar birbirlerini MAC adresleri ile tanır. Önce her iki kartın MAC adresini öğrenelim. Her iki kartta da şu kodu çalıştırın:

import network
import espnow

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
mac = wlan.config('mac')
print("MAC adresim:", mac)

Çıktı şuna benzer olacaktır:

MAC adresim: b'\x08:\x3a:\xf2:\x01:\x04:\x1c'

Sender kartın MAC adresini not edin — receiver kartta peer olarak eklerken bu adresi kullanacağız. Receiver’ın MAC adresini de sender’da peer olarak eklemek için not edin.

4. Sender (Verici) Kodu

Sender kartımızda DHT22 sensörü bağlı olacak. DHT22’nin data pin’ini GPIO15’e bağlayın, VCC’yi 3.3V’a, GND’yi toprağa. Sıcaklık verisini okuyup ESP-NOW ile receiver’a gönderecek.

Sender kodunu sender.py olarak kaydedin ve main.py olarak çalıştırın:

import network
import espnow
import machine
import dht
import time

# Wi-Fi radyosunu aktif et (baglanmiyoruz, sadece radyo lazim)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)

# Receiver'in MAC adresi (kendinize gore degistirin)
RECEIVER_MAC = b'\x24\x6f\x28\xaa\xbb\xcc'

# ESP-NOW baslat
e = espnow.ESPNow()
e.active(True)
e.add_peer(RECEIVER_MAC)

# DHT22 sensör - GPIO15
sensor = dht.DHT22(machine.Pin(15))

print("Sender baslatildi, veri gonderiliyor...")

while True:
    try:
        sensor.measure()
        sicaklik = sensor.temperature()
        nem = sensor.humidity()
        
        # Veriyi paketle: "T:24.5,H:55.2" formati
        mesaj = "T:{:.1f},H:{:.1f}".format(sicaklik, nem).encode('utf-8')
        e.send(RECEIVER_MAC, mesaj)
        print("Gonderildi:", mesaj)
    except OSError as err:
        print("Sensor hatasi:", err)
    
    time.sleep(5)

Bu kod her 5 saniyede bir sıcaklık ve nem verisini okur, T:24.5,H:55.2 formatında bir byte string’e çevirir ve ESP-NOW ile gönderir. e.send() fonksiyonu senkron çalışır ve veri gönderilene kadar bekler.

5. Receiver (Alıcı) Kodu

Receiver kartı ise gelen verileri dinler ve ekrana yazdırır. Bu kodu receiver.py olarak kaydedin ve main.py olarak çalıştırın:

import network
import espnow
import time

# Wi-Fi radyosunu aktif et
wlan = network.WLAN(network.STA_IF)
wlan.active(True)

# ESP-NOW baslat
e = espnow.ESPNow()
e.active(True)

# Callback ile veri dinle
def on_recv(sender_mac, msg):
    # msg byte olarak gelir, decode et
    veri = msg.decode('utf-8')
    print("Gelen veri:", veri)
    
    # Parse et
    parcalar = veri.split(',')
    sicaklik = float(parcalar[0].split(':')[1])
    nem = float(parcalar[1].split(':')[1])
    print("Sicaklik: {:.1f} C".format(sicaklik))
    print("Nem: {:.1f} %".format(nem))

e.on_recv(on_recv)

# Sender'in MAC adresini peer olarak ekle
SENDER_MAC = b'\x08\x3a\xf2\x01\x04\x1c'
e.add_peer(SENDER_MAC)

print("Receiver baslatildi, veri bekleniyor...")

# Ana dongu - callback'ler arka planda calisir
while True:
    time.sleep(1)

Receiver’da on_recv callback fonksiyonu, her mesaj geldiğinde otomatik olarak çağrılır. Callback içinde gelen byte verisini decode edip parse ediyoruz.

6. Çift Yönlü Haberleşme (Opsiyonel)

Şimdiye kadar tek yönlü (sender -> receiver) bir yapı kurduk. Ama ESP-NOW çift yönlü çalışabilir. Her iki kart da hem sender hem receiver olabilir. Bunu için her iki tarafta da on_recv callback tanımlayın ve e.send() ile veri gönderin:

# Her iki kartta da
e.on_recv(lambda mac, msg: print("Gelen:", msg.decode('utf-8')))

# Her iki kartta da gonderme yapabilirsiniz
e.send(peer_mac, b'ping')

Bu şekilde iki kart arasında iki yönlü haberleşme kurulabilir — örneğin biri sensör verisi gönderir, diğeri komut/alarm gönderir.

7. Troubleshooting

“import espnow: ModuleNotFoundError”

MicroPython 1.28’den eski bir sürüm kullanıyorsunuz. Firmware’i güncelleyin:

esptool.py --port /dev/cu.usbserial-0001 erase_flash
esptool.py --port /dev/cu.usbserial-0001 --baud 460800 write_flash -z 0x1000 esp32-20260406-v1.28.0.bin

MAC adresi yanlış görünüyor

MAC adresi byte formatında gelir (b'\x08\x3a...'). Peer eklerken aynı byte formatını kullanmalısınız. String olarak yazmasanız bile çalışır ama tutarlılık için wlan.config('mac') çıktısını direkt kopyalayın.

Peer eklenemiyor: “ESPNowPeerListFull”

ESP-NOW maksimum 250 peer destekler. Eğer bu hatayı alıyorsanız gereksiz peer’ları temizleyin:

# Tüm peer'lari kaldir
e.peers_table.clear()
# veya tek tek
e.del_peer(peer_mac)

Veri gelmiyor ama hata da yok

Olası nedenler:

  • Her iki kartın Wi-Fi radyosu aktif mi? wlan.active(True) yaptığınızdan emin olun
  • MAC adresleri doğru mu? Receiver’da sender’ın MAC’ini, sender’da receiver’ın MAC’ini peer olarak eklediniz mi?
  • Mesafeyi kontrol edin, 20 metreden uzaklaşmayın
  • DHT22 okuma hatası: sensor.measure() çağrısı arasında en az 2 saniye olmalı

MemoryError

ESP-NOW buffer dolmuş olabilir. Mesaj gönderme hızını azaltın (time.sleep süresini artırın) veya callback içinde uzun işlem yapmayın. Callback’te sadece veriyi alıp global bir değişkene yazıp ana döngüde işlem yapın.

Wi-Fi ve ESP-NOW aynı anda

ESP-NOW Wi-Fi bağlantısı gerektirmez ama Wi-Fi radyosu aktif olmalıdır. Eğer aynı anda Wi-Fi network’e de bağlanmak istiyorsanız (wlan.connect()), ESP-NOW ve Wi-Fi station modu paralel çalışabilir ama kanal numarasının aynı olması gerekir. Aksi takdirde çakışma olabilir.

Sonuç

ESP-NOW, ESP32 kartlar arasında hızlı, güvenilir ve kolay bir P2P haberleşme protokolü sunar. Wi-Fi router’a ihtiyaç duymadan, düşük gecikme ile sensör verisi aktarmak için ideal. MicroPython 1.28 ile gelen espnow modülü sayesinde Python ile kullanmak da oldukça pratik ve C/C++ ile uğraşmadan birkaç satır kodla iki cihaz arasında veri transferi yapabilirsiniz.

Okuduğunuz için teşekkür ederim!