Pelajari cara ESP32 berkomunikasi langsung satu sama lain tanpa router WiFi menggunakan protokol ESP-NOW â dari dasar hingga proyek jaringan sensor nirkabel
ESP-NOW adalah protokol komunikasi nirkabel yang dikembangkan oleh Espressif Systems, dirancang khusus untuk memungkinkan perangkat ESP32 dan ESP8266 berkomunikasi secara langsung (peer-to-peer) tanpa memerlukan koneksi WiFi tradisional ke router atau access point.
Protokol ini bekerja pada frekuensi 2.4 GHz menggunakan teknologi yang sama dengan WiFi (IEEE 802.11), tetapi dengan pendekatan yang jauh lebih ringan. ESP-NOW menghilangkan kebutuhan akan DHCP, TCP/IP stack, dan overhead jaringan WiFi biasa, sehingga menghasilkan latensi yang sangat rendah dan konsumsi daya yang minimal.
Diagram: Perbandingan WiFi Tradisional vs ESP-NOW
Perbandingan WiFi Tradisional vs ESP-NOW
Karakteristik Utama ESP-NOW
Parameter
Spesifikasi
Frekuesi
2.4 GHz (ISM Band)
Maksimum Payload
250 byte per paket
Peer Maksimum
20 perangkat terdaftar
Latensi
~2 milidetik
Jarak Efektif
~200m (open air), ~30m (indoor)
Enkripsi
AES-128 (opsional, 6 peer terenkripsi)
Kecepatan Data
1 Mbps (PHY rate)
Kompatibilitas
ESP32, ESP8266, ESP32-S2, ESP32-S3, ESP32-C3
Koneksi WiFi
Bisa dijalankan bersamaan dengan WiFi STA
đĄ Tips
ESP-NOW sangat cocok untuk proyek yang membutuhkan komunikasi cepat antar ESP32 tanpa infrastruktur jaringan. Misalnya: remote control drone, jaringan sensor pertanian, sistem notifikasi rumah, dan robot swarm. Bahkan, ESP-NOW bisa dijalankan bersamaan dengan WiFi STA, sehingga ESP32 bisa meneruskan data ke internet.
âĄ
ESP-NOW
Peer-to-Peer
â Tanpa Router
â Latensi ~2ms
â Sangat Hemat Daya
â Payload 250 byte
â Setup Instan
â Range Terbatas
â Tidak ada IP/TCP
Cepat & Ringan
đś
WiFi TCP/IP
Client-Server
â Perlu Router
â Latensi ~10-50ms
â Konsumsi Daya Tinggi
â Payload Tak Terbatas
â Setup Kompleks
â Range Lebih Jauh
â Kompatibel HTTP/MQTT
Universal
đĄ
LoRa
Long Range
â Tanpa Router
â Latensi Tinggi
â Sangat Hemat Daya
â Payload ~50 byte
â Perlu Modul Tambahan
â Range 10+ km
â Butuh LoRa Module
Jarak Jauh
2. Setup Peer ESP-NOW
Sebelum ESP32 dapat saling berkomunikasi via ESP-NOW, setiap perangkat harus mendaftarkan peer (perangkat tujuan) menggunakan MAC address-nya. Proses ini disebut pairing atau peer registration.
Langkah 1: Mendapatkan MAC Address ESP32
Setiap ESP32 memiliki MAC address unik 6-byte. Untuk mengetahuinya, upload kode berikut:
// ==================================================
// Proyek WSN: Gateway ESP-NOW -> MQTT
// Terima data dari semua node, kirim ke MQTT
// BeebaneLabs - https://beebanelabs.pages.dev
// ==================================================
#include "esp_now.h"
#include "WiFi.h"
#include "PubSubClient.h"
// === WiFi Config ===
const char* WIFI_SSID = "NamaWiFiAnda";
const char* WIFI_PASS = "PasswordWiFi";
// === MQTT Config ===
const char* MQTT_SERVER = "test.mosquitto.org";
const int MQTT_PORT = 1883;
const char* MQTT_TOPIC = "wsn/gateway/data";
const char* CLIENT_ID = "wsn_gateway_01";
// === Struct (sama dengan node) ===
typedef struct struct_wsn_data {
uint8_t node_id;
char node_name[16];
float suhu;
float kelembaban;
float heat_index;
int8_t wifi_rssi;
uint32_t uptime;
uint32_t packet_num;
} struct_wsn_data;
WiFiClient espClient;
PubSubClient mqtt(espClient);
// Buffer untuk data dari multiple node
struct_wsn_data nodeData[10]; // Max 10 node
bool nodeOnline[10] = {false};
void setupWiFi() {
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
Serial.print("WiFi: Connecting");
int attempts = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (++attempts > 40) {
Serial.println(" GAGAL!");
ESP.restart();
}
}
Serial.printf(" OK! IP: %s\n", WiFi.localIP().toString().c_str());
}
void hubungkanMQTT() {
while (!mqtt.connected()) {
Serial.print("MQTT: Connecting...");
if (mqtt.connect(CLIENT_ID)) {
Serial.println(" OK!");
} else {
Serial.printf(" FAIL (rc=%d)\n", mqtt.state());
delay(3000);
}
}
}
void onReceive(const uint8_t *mac_addr, const uint8_t *data, int len) {
if (len != sizeof(struct_wsn_data)) {
Serial.printf("[WARN] Ukuran data tidak sesuai: %d\n", len);
return;
}
struct_wsn_data rxData;
memcpy(&rxData, data, sizeof(rxData));
// Simpan data
if (rxData.node_id < 10) {
nodeData[rxData.node_id] = rxData;
nodeOnline[rxData.node_id] = true;
}
// Format MAC
char macStr[18];
snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X",
mac_addr[0], mac_addr[1], mac_addr[2],
mac_addr[3], mac_addr[4], mac_addr[5]);
Serial.printf("[RX] Node %d (%s) | %.1f°C | %.1f%% | #%lu\n",
rxData.node_id, rxData.node_name, rxData.suhu,
rxData.kelembaban, rxData.packet_num);
// Kirim ke MQTT
if (mqtt.connected()) {
char payload[256];
snprintf(payload, sizeof(payload),
"{\"node_id\":%d,\"node_name\":\"%s\","
"\"suhu\":%.1f,\"kelembaban\":%.1f,"
"\"heat_index\":%.1f,\"uptime\":%lu,"
"\"packet\":%lu,\"mac\":\"%s\"}",
rxData.node_id, rxData.node_name,
rxData.suhu, rxData.kelembaban,
rxData.heat_index, rxData.uptime,
rxData.packet_num, macStr);
// Publish ke topik per-node
char topic[64];
snprintf(topic, sizeof(topic), "wsn/node/%d/data", rxData.node_id);
if (mqtt.publish(topic, payload)) {
Serial.printf("[MQTT] Published ke %s\n", topic);
} else {
Serial.println("[MQTT] Gagal publish!");
}
// Juga publish ke topik utama
mqtt.publish(MQTT_TOPIC, payload);
}
}
void setup() {
Serial.begin(115200);
Serial.println("âââââââââââââââââââââââââââââââââââââââââ");
Serial.println("â WSN Gateway - ESP-NOW -> MQTT â");
Serial.println("â BeebaneLabs â");
Serial.println("âââââââââââââââââââââââââââââââââââââââââ");
setupWiFi();
mqtt.setServer(MQTT_SERVER, MQTT_PORT);
mqtt.setBufferSize(512);
hubungkanMQTT();
// Inisialisasi ESP-NOW (setelah WiFi)
if (esp_now_init() != ESP_OK) {
Serial.println("[FATAL] ESP-NOW init gagal!");
ESP.restart();
}
esp_now_register_recv_cb(onReceive);
Serial.println("[OK] Gateway siap menerima data dari node sensor!");
}
void loop() {
if (!mqtt.connected()) {
hubungkanMQTT();
}
mqtt.loop();
// Status check setiap 30 detik
static unsigned long lastStatus = 0;
if (millis() - lastStatus > 30000) {
lastStatus = millis();
Serial.println("âââââââââââââââââââââââââââââââââââ");
Serial.println(" STATUS NODE AKTIF ");
for (int i = 0; i < 10; i++) {
if (nodeOnline[i]) {
Serial.printf(" Node %d: %-14s | %.1f°C | %.1f%%\n",
nodeData[i].node_id, nodeData[i].node_name,
nodeData[i].suhu, nodeData[i].kelembaban);
}
}
Serial.printf(" Heap bebas: %lu bytes\n", ESP.getFreeHeap());
Serial.println("âââââââââââââââââââââââââââââââââââ");
}
}
Output Serial Monitor (Gateway):
âââââââââââââââââââââââââââââââââââââââââ
â WSN Gateway - ESP-NOW -> MQTT â
âââââââââââââââââââââââââââââââââââââââââ
WiFi: Connecting... OK! IP: 192.168.1.100
MQTT: Connecting... OK!
[OK] Gateway siap menerima data dari node sensor!
[RX] Node 1 (Ruang Tamu) | 28.5°C | 72.0% | #1
[MQTT] Published ke wsn/node/1/data
[RX] Node 2 (Gudang) | 31.2°C | 80.5% | #1
[MQTT] Published ke wsn/node/2/data
[RX] Node 3 (Kebun) | 29.8°C | 65.3% | #1
[MQTT] Published ke wsn/node/3/data
đĄ Tips Pengembangan
Untuk produksi, tambahkan fitur: 1) Deep sleep pada node sensor untuk menghemat baterai, 2) Auto-discovery node baru, 3) Dashboard Grafana untuk visualisasi, 4) Alert Telegram saat suhu melewati threshold, 5) OTA update firmware via ESP-NOW.
9. Quiz: Uji Pemahamanmu!
Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang ESP-NOW:
Pertanyaan 1: Berapa maksimum payload (data) yang bisa dikirim dalam satu paket ESP-NOW?
a) 128 byte
b) 250 byte
c) 512 byte
d) 1024 byte
Pertanyaan 2: Untuk mengirim data ke semua perangkat ESP-NOW dalam range (broadcast), MAC address apa yang digunakan?
a) 00:00:00:00:00:00
b) FF:FF:FF:FF:FF:FF
c) AA:BB:CC:DD:EE:FF
d) ESP-NOW tidak mendukung broadcast
Pertanyaan 3: Berapa maksimum peer terenkripsi yang bisa didaftarkan pada satu ESP32?
a) 4 peer
b) 6 peer
c) 10 peer
d) 20 peer
Pertanyaan 4: Apa yang WAJIB dilakukan di KEDUA ESP32 agar komunikasi ESP-NOW unicast berhasil?
a) Menggunakan SSID WiFi yang sama
b) Saling mendaftarkan MAC address sebagai peer
c) Menginstal library MQTT yang sama
d) Menggunakan sensor yang identik
Pertanyaan 5: Keunggulan utama ESP-NOW dibanding WiFi TCP/IP biasa adalah...
a) Payload tidak terbatas dan bisa mengirim file besar
b) Bisa terhubung ke internet langsung tanpa router
c) Latensi sangat rendah dan tidak perlu router WiFi