KUNJUNGI KAMI

KUNJUNGI KITA DI BUKALAPAK, TOKOPEDIA DAN SHOPEE

Memulai ESP-NOW (ESP8266 NodeMCU dengan Arduino IDE)

Pada artikel ini, kita akan membahas bagaimana cara menggunakan ESP-NOW untuk bertukar data antara board ESP8266 NodeMCU yang diprogram dengan Arduino IDE. ESP-NOW adalah protokol komunikasi tanpa koneksi yang dikembangkan oleh Espressif, yang memiliki fitur transmisi paket pendek dan dapat digunakan dengan board ESP8266 dan ESP32.


Kita akan memprogram board ESP8266 NodeMCU menggunakan Arduino IDE. Jadi, sebelum melanjutkan tutorial ini, Anda harus menginstal add-on ESP8266 di Arduino IDE Anda. Ikuti panduan berikut:

Install Board ESP8266 di Arduino IDE (Windows, Mac OS X, Linux)

PENGENALAMN ESP NOW


Video berikut memberikan pengantar tentang ESP-NOW. Video ini direkam untuk ESP32, tetapi sebagian besar konsepnya juga berlaku untuk board ESP8266 NodeMCU.




Menurut situs web Espressif, ESP-NOW adalah "protokol yang dikembangkan oleh Espressif, yang memungkinkan beberapa perangkat untuk berkomunikasi satu sama lain tanpa menggunakan Wi-Fi. Protokol ini mirip dengan konektivitas nirkabel 2.4GHz berdaya rendah (...). Pemasangan antara perangkat diperlukan sebelum komunikasi mereka. Setelah pemasangan selesai, koneksi menjadi aman dan peer-to-peer, tanpa memerlukan jabat tangan.

Ini berarti bahwa setelah memasangkan perangkat satu sama lain, koneksinya akan tetap terjaga. Dengan kata lain, jika salah satu board Anda tiba-tiba kehilangan daya atau diatur ulang, saat board tersebut dihidupkan ulang, ia akan secara otomatis terhubung ke board lainnya untuk melanjutkan komunikasi.

ESP-NOW mendukung fitur-fitur berikut:
  1. Komunikasi unicast terenkripsi dan tidak terenkripsi;
  2. Perangkat peer yang tercampur terenkripsi dan tidak terenkripsi;
  3. Dapat membawa payload hingga 250 byte;
  4. Fungsi callback pengiriman yang dapat diatur untuk menginformasikan lapisan aplikasi tentang keberhasilan atau kegagalan transmisi.
Teknologi ESP-NOW juga memiliki batasan berikut:

  1. Peer terenkripsi terbatas. Maksimal 10 peer terenkripsi didukung dalam mode Stasiun; maksimal 6 dalam mode SoftAP atau SoftAP + Stasiun;
  2. Beberapa peer tidak terenkripsi  dapat didukung, namun jumlah totalnya harus kurang dari 20, termasuk peer terenkripsi;
  3. Payload dibatasi hingga 250 byte.
Dengan kata lain, ESP-NOW adalah protokol komunikasi cepat yang dapat digunakan untuk bertukar pesan kecil (hingga 250 byte) antara board ESP8266.

ESP-NOW menawarkan fleksibilitas tinggi, memungkinkan Anda untuk mengatur komunikasi satu arah atau dua arah dalam berbagai skenario.

Komunikasi Satu Arah ESP-NOW


ESP-NOW memungkinkan komunikasi satu arah, contohnya:

  • Satu board ESP8266 mengirim data ke board ESP8266 lainnya.

Konfigurasi ini sangat mudah diterapkan dan cocok untuk mengirim data dari satu board ke board lainnya, seperti pembacaan sensor atau perintah ON dan OFF untuk mengontrol GPIO.


  • Master" ESP8266 mengirim data ke beberapa "slave" ESP8266

Dalam konfigurasi ini, satu board ESP8266 dapat mengirim perintah yang sama atau berbeda ke board ESP8266 lainnya. Konfigurasi ini ideal untuk membangun sesuatu seperti remote control. Anda dapat memiliki beberapa board ESP8266 di sekitar rumah yang dikendalikan oleh satu board ESP8266 utama.


  • Satu "slave" ESP8266 menerima data dari beberapa "master"

Konfigurasi ini ideal jika Anda ingin mengumpulkan data dari beberapa sensor node ke dalam satu board ESP8266. Board ini kemudian dapat dikonfigurasi sebagai server web untuk menampilkan data dari semua board lain, misalnya.


Catatan: Dokumentasi ESP-NOW tidak secara eksplisit menggunakan istilah "pengirim/master" dan "penerima/slave". Setiap board ESP8266 dapat berfungsi sebagai pengirim atau penerima. Namun, untuk memperjelas, kita akan menggunakan istilah "pengirim" dan "penerima" atau "master" dan "slave" dalam penjelasan ini.

Komunikasi Dua Arah ESP-NOW

Dengan ESP-NOW, setiap board dapat menjadi pengirim dan penerima secara bersamaan. Ini memungkinkan Anda untuk membangun komunikasi dua arah antar board.

Sebagai contoh, Anda dapat mengatur dua board untuk saling berkomunikasi




Anda dapat menambahkan lebih banyak board ke konfigurasi ini dan membentuk jaringan (semua board ESP8266 saling berkomunikasi).


Singkatnya, ESP-NOW sangat ideal untuk membangun jaringan di mana beberapa board ESP8266 dapat saling bertukar data.

Mendapatkan  MAC Address Board ESP8266

Untuk berkomunikasi melalui ESP-NOW, Anda perlu mengetahui MAC Address  penerima ESP8266. Ini menentukan perangkat mana yang akan Anda kirimi informasi.

Setiap ESP8266 memiliki MAC Address unik, dan ini adalah cara kita mengidentifikasi setiap board untuk mengirim data menggunakan ESP-NOW (pelajari cara Mendapatkan dan Mengubah  MAC Address ESP8266).

Untuk mendapatkan  MAC Address board Anda, unggah kode berikut:

// Complete Instructions to Get and Change ESP MAC Address: https://RandomNerdTutorials.com/get-change-esp32-esp8266-mac-address-arduino/

#include <ESP8266WiFi.h>

void setup(){
Serial.begin(115200);
Serial.println();
Serial.print("ESP8266 Board MAC Address: ");
Serial.println(WiFi.macAddress());
}
void loop(){

}
Setelah mengunggah kode, buka Serial Monitor dengan baud rate 115200 dan tekan tombol RESET ESP8266. MAC Address  akan dicetak seperti berikut:




Simpan alamat MAC board Anda karena Anda akan membutuhkannya untuk mengirim data ke board yang tepat melalui ESP-NOW.

ESP-NOW: Komunikasi Satu Arah Titik ke Titik dengan ESP8266

Untuk mengenalkan  Anda dengan komunikasi nirkabel ESP-NOW, kita akan membuat proyek sederhana yang menunjukkan cara mengirim pesan dari satu ESP8266 ke ESP8266 lainnya. Satu ESP8266 akan bertindak sebagai "pengirim" dan ESP8266 lainnya akan menjadi "penerima".

Kita akan menggunakan struktur data yang berisi variabel bertipe char, int, float, String, dan boolean untuk demonstrasi ini. Namun, Anda dapat memodifikasi struktur ini untuk mengirim jenis variabel apa pun yang sesuai dengan proyek Anda, Aseperti pembacaan sensor atau variabel boolean untuk mengontrol perangkat (misalnya, menyalakan atau mematikan sesuatu).

Untuk memudahkan pemahaman, kita akan menyebut ESP8266 #1 sebagai "pengirim" dan ESP8266 #2 sebagai "penerima".

Berikut hal-hal yang perlu kita sertakan dalam sketsa "pengirim":

  1. Inisialisasi ESP-NOW: Siapkan ESP8266 #1 untuk berfungsi sebagai pengirim dalam komunikasi ESP-NOW.
  2. Registrasi Fungsi Callback Pengiriman Data: Buat fungsi bernama "OnDataSent" yang akan dijalankan ketika pesan berhasil dikirim. Fungsi ini akan memberi tahu kita apakah pesan berhasil dikirim ke penerima atau tidak.
  3. Tambahkan Perangkat Peer (Penerima): Masukkan alamat MAC ESP8266 #2 sebagai perangkat peer yang akan menerima pesan.
  4. Kirim Pesan ke Perangkat Peer: Kirim pesan yang berisi struktur data yang telah kita siapkan ke ESP8266 #2.

Di sisi "penerima", sketsa ESP8266 #2 harus mencakup:

  1. Inisialisasi ESP-NOW: Siapkan ESP8266 #2 untuk berfungsi sebagai penerima dalam komunikasi ESP-NOW.
  2. Registrasi Fungsi Callback Penerimaan Data (OnDataRecv): Buat fungsi bernama "OnDataRecv" yang akan dijalankan ketika pesan diterima dari ESP8266 #1.
  3. Simpan Pesan dalam Callback: Di dalam fungsi "OnDataRecv", simpan pesan yang diterima ke dalam variabel untuk melakukan tindakan apa pun dengan informasi yang terkandung di dalamnya.
ESP-NOW memanfaatkan fungsi callback yang akan dijalankan ketika sebuah perangkat menerima pesan atau ketika pesan dikirim (fungsi ini memberi tahu Anda apakah pesan berhasil dikirim atau gagal).



Function Name and Description
esp_now_init() Initializes ESP-NOW. You must initialize Wi-Fi before initializing ESP-NOW. Returns 0, if succeed.
esp_now_set_self_role(role) the role can be: ESP_NOW_ROLE_IDLE = 0,
ESP_NOW_ROLE_CONTROLLER, ESP_NOW_ROLE_SLAVE, ESP_NOW_ROLE_COMBO, ESP_NOW_ROLE_MAX
esp_now_add_peer(uint8 mac_addr, uint8 role, uint8 channel, uint8 key, uint8 key_len) Call this function to pair a device.
esp_now_send(uint8 mac_address, uint8 data, int len) Send data with ESP-NOW.
esp_now_register_send_cb() Register a callback function that is triggered upon sending data. When a message is sent, a function is called – this function returns whether the delivery was successful or not.
esp_now_register_rcv_cb() Register a callback function that is triggered upon receiving data. When data is received via ESP-NOW, a function is called.

Sketsa Pengirim ESP8266 NodeMCU (ESP-NOW)

Berikut adalah kode untuk board pengirim ESP8266 NodeMCU. Salin kode ini ke Arduino IDE Anda, tetapi jangan langsung unggah. Anda perlu melakukan beberapa modifikasi agar kode ini berfungsi sesuai kebutuhan Anda.


/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp-now-esp8266-nodemcu-arduino-ide/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/

#include <ESP8266WiFi.h>
#include <espnow.h>

// REPLACE WITH RECEIVER MAC Address
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

// Structure example to send data
// Must match the receiver structure
typedef struct struct_message {
char a[32];
int b;
float c;
String d;
bool e;
} struct_message;

// Create a struct_message called myData
struct_message myData;

unsigned long lastTime = 0;
unsigned long timerDelay = 2000; // send readings timer

// Callback when data is sent
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
Serial.print("Last Packet Send Status: ");
if (sendStatus == 0){
Serial.println("Delivery success");
}
else{
Serial.println("Delivery fail");
}
}
void setup() {
// Init Serial Monitor
Serial.begin(115200);
// Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA);

// Init ESP-NOW
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW");
return;
}

// Once ESPNow is successfully Init, we will register for Send CB to
// get the status of Trasnmitted packet
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
esp_now_register_send_cb(OnDataSent);
// Register peer
esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
}
void loop() {
if ((millis() - lastTime) > timerDelay) {
// Set values to send
strcpy(myData.a, "THIS IS A CHAR");
myData.b = random(1,20);
myData.c = 1.2;
myData.d = "Hello";
myData.e = false;

// Send message via ESP-NOW
esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

lastTime = millis();
}
}

Cara Kerja Kode

Baris pertama kode program ini dimulai dengan perintah 

#include <ESP8266WiFi.h>
#include <espnow.h>
Pada baris berikutnya, Anda harus memasukkan  MAC Address  penerima ESP8266.
uint8_t broadcastAddress[] = {0x5C, 0xCF, 0x7F, 0x99, 0x9A, 0xEA};
Dalam kasus kita, alamat MAC penerima adalah: 5C:CF:7F:99:9A:EA, tetapi Anda perlu mengganti variabel tersebut dengan alamat MAC Anda sendiri.
Kemudian, buatlah sebuah struktur yang berisi jenis data yang ingin kita kirim. Kita sebut struktur ini sebagai struct_message dan ini berisi 5 jenis variabel yang berbeda. Anda dapat mengubahnya untuk mengirim jenis variabel apa pun yang Anda inginkan.
typedef struct struct_message {
char a[32];
int b;
float c;
String d;
bool e;
} struct_message;
Buat variabel baru bertipe struct_message yang disebut myData yang akan menyimpan nilai-nilai variabel.
struct_message myData;
Selanjutnya, tentukan fungsi OnDataSent(). Ini adalah fungsi callback yang akan dijalankan ketika pesan dikirim. Dalam kasus ini, pesan ini hanya mencetak apakah pesan berhasil dikirim atau tidak.
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
Serial.print("Last Packet Send Status: ");
if (sendStatus == 0){
Serial.println("Delivery success");
}
else{
Serial.println("Delivery fail");
}
}
Di dalam fungsi setup(), inisialisasi monitor serial untuk keperluan debugging:
Serial.begin(115200);
Atur perangkat sebagai stasiun Wi-Fi
WiFi.mode(WIFI_STA);
Siapkan ESP-NOW
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW");
return;
}
Konfigurasikan mode ESP8266:
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
Perangkat ini dapat diatur dengan peran berikut: ESP_NOW_ROLE_CONTROLLER, ESP_NOW_ROLE_SLAVE, ESP_NOW_ROLE_COMBO, ESP_NOW_ROLE_MAX.

Setelah berhasil menginisialisasi ESP-NOW, daftarkan fungsi callback yang akan dipanggil ketika pesan dikirim. Dalam kasus ini, kita mendaftarkan fungsi OnDataSent() yang telah dibuat sebelumnya.

esp_now_register_send_cb(OnDataSent);
Kemudian, pasangkan dengan perangkat ESP-NOW lainnya untuk mengirim data:
esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
Fungsi esp_now_add_peer menerima argumen berikut, dengan urutan sebagai berikut: alamat MAC, peran, saluran Wi-Fi, kunci, dan panjang kunci.

Di dalam loop(), kita akan mengirim pesan melalui ESP-NOW setiap 2 detik (Anda dapat mengubah waktu tunda ini pada variabel timerDelay). Pertama, kita atur nilai variabel sebagai berikut:

strcpy(myData.a, "THIS IS A CHAR");
myData.b = random(1,20);
myData.c = 1.2;
myData.d = "Hello";
myData.e = false;
Ingat bahwa myData adalah sebuah struktur. Di sini kita menetapkan nilai yang ingin kita kirim di dalam struktur tersebut. Sebagai contoh, baris pertama menetapkan sebuah karakter, baris kedua menetapkan angka Int acak, Float, String, dan variabel Boolean.

Kita membuat struktur seperti ini untuk menunjukkan kepada Anda cara mengirim tipe variabel yang paling umum. Anda dapat mengubah struktur tersebut untuk mengirim tipe data lainnya.

Terakhir, kirim pesan sebagai berikut:

esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
Fungsi loop() dijalankan setiap 2000 milidetik (2 detik).
if ((millis() - lastTime) > timerDelay) {
// Set values to send
strcpy(myData.a, "THIS IS A CHAR");
myData.b = random(1,20);
myData.c = 1.2;
myData.d = "Hello";
myData.e = false;

// Send message via ESP-NOW
esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

lastTime = millis();
}
Sketch Penerima ESP8266 NodeMCU (ESP-NOW)
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp-now-esp8266-nodemcu-arduino-ide/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/

#include <ESP8266WiFi.h>
#include <espnow.h>

// Structure example to receive data
// Must match the sender structure
typedef struct struct_message {
char a[32];
int b;
float c;
String d;
bool e;
} struct_message;

// Create a struct_message called myData
struct_message myData;

// Callback function that will be executed when data is received
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
memcpy(&myData, incomingData, sizeof(myData));
Serial.print("Bytes received: ");
Serial.println(len);
Serial.print("Char: ");
Serial.println(myData.a);
Serial.print("Int: ");
Serial.println(myData.b);
Serial.print("Float: ");
Serial.println(myData.c);
Serial.print("String: ");
Serial.println(myData.d);
Serial.print("Bool: ");
Serial.println(myData.e);
Serial.println();
}
void setup() {
// Initialize Serial Monitor
Serial.begin(115200);
// Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA);

// Init ESP-NOW
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW");
return;
}
// Once ESPNow is successfully Init, we will register for recv CB to
// get recv packer info
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
esp_now_register_recv_cb(OnDataRecv);
}

void loop() {
}

Cara Kerja Kode

Mirip dengan pengirim, mulailah dengan menyertakan library:
#include <esp_now.h>
#include <WiFi.h>
Buat struktur untuk menerima data. Struktur ini harus sama dengan yang didefinisikan dalam skrip pengirim.
typedef struct struct_message {
char a[32];
int b;
float c;
String d;
bool e;
} struct_message;
Buat variabel bertipe struct_message bernama myData.
struct_message myData;
Buat fungsi callback yang akan dipanggil ketika ESP8266 menerima data melalui ESP-NOW. Fungsi tersebut bernama onDataRecv() dan harus menerima beberapa parameter sebagai berikut:
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
Kita copy konten variabel data incomingData ke dalam variabel myData.
memcpy(&myData, incomingData, sizeof(myData));
cSekarang, struktur myData mengandung beberapa variabel di dalamnya dengan nilai-nilai yang dikirim oleh ESP8266 pengirim. Untuk mengakses variabel a, misalnya, kita hanya perlu memanggil myData.a. 
Dalam contoh ini, kita cukup mencetak data yang diterima, tetapi dalam aplikasi praktis Anda dapat mencetak data tersebut pada layar, misalnya.
Serial.print("Bytes received: ");
Serial.println(len);
Serial.print("Char: ");
Serial.println(myData.a);
Serial.print("Int: ");
Serial.println(myData.b);
Serial.print("Float: ");
Serial.println(myData.c);
Serial.print("String: ");
Serial.println(myData.d);
Serial.print("Bool: ");
Serial.println(myData.e);
Serial.println();
}
Di dalam fungsi setup(), inisialisasi komunikasi Serial untuk keperluan debugging.
Serial.begin(115200);
Atur perangkat sebagai stasiun Wi-Fi:
WiFi.mode(WIFI_STA);
Siapkan ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
Konfigurasikan mode ESP8266
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
Daftarkan untuk fungsi callback yang akan dipanggil ketika data diterima. Dalam kasus ini, kita mendaftarkan untuk fungsi OnDataRecv() yang telah dibuat sebelumnya.
esp_now_register_recv_cb(OnDataRecv);

Pengujian Komunikasi ESP-NOW

Unggah skrip pengirim ke salah satu board dan skrip penerima ke board lainnya. Jangan lupa masukkan alamat MAC penerima pada skrip pengirim.

Sekarang, buka dua jendela Arduino IDE. Satu untuk penerima, dan satu lagi untuk pengirim. Buka Serial Monitor untuk setiap board. Ini harus berupa port COM yang berbeda untuk setiap board.

Berikut ini yang akan Anda lihat di sisi pengirim:


Dan inilah yang akan Anda lihat di sisi penerima. Perhatikan bahwa variabel Int berubah antara setiap pembacaan yang diterima (karena kita mengaturnya menjadi angka acak di sisi pengirim).


Kami telah menguji jangkauan komunikasi antara kedua papan, dan kami dapat memperoleh komunikasi yang stabil hingga 140 meter (sekitar 459 kaki) di lapangan terbuka. Dalam percobaan ini, kedua antena ESP8266 yang terpasang saling berhadapan.


Penutup 

Dalam tutorial ini, Anda telah belajar cara menggunakan ESP-NOW dengan papan ESP8266 NodeMCU. Sekarang, Anda dapat menggabungkan sketch pengirim dan penerima sehingga Anda memiliki komunikasi dua arah (masing-masing papan bertindak sebagai server dan pengirim pada saat yang bersamaan). Anda juga dapat menggunakan lebih banyak papan untuk memiliki komunikasi antara beberapa papan.

Papan ESP8266 dan ESP32 dapat berkomunikasi satu sama lain menggunakan protokol komunikasi ESP-NOW. Anda hanya perlu mengunggah sketch yang tepat ke setiap papan. Untuk mempelajari cara menggunakan ESP-NOW dengan ESP32, Anda dapat membaca panduan pengantar ESP-NOW kami untuk ESP32.

Kami harap tutorial ini bermanfaat bagi Anda. Untuk mempelajari lebih lanjut tentang papan ESP8266

Referensi "Getting Started with ESP-NOW (ESP8266 NodeMCU with Arduino IDE)", Last Minute Engineer, https://randomnerdtutorials.com/esp-now-esp8266-nodemcu-arduino-ide/