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:
PENGENALAMN ESP NOW
- Komunikasi unicast terenkripsi dan tidak terenkripsi;
- Perangkat peer yang tercampur terenkripsi dan tidak terenkripsi;
- Dapat membawa payload hingga 250 byte;
- Fungsi callback pengiriman yang dapat diatur untuk menginformasikan lapisan aplikasi tentang keberhasilan atau kegagalan transmisi.
- Peer terenkripsi terbatas. Maksimal 10 peer terenkripsi didukung dalam mode Stasiun; maksimal 6 dalam mode SoftAP atau SoftAP + Stasiun;
- Beberapa peer tidak terenkripsi dapat didukung, namun jumlah totalnya harus kurang dari 20, termasuk peer terenkripsi;
- Payload dibatasi hingga 250 byte.
Komunikasi Satu Arah ESP-NOW
- Master" ESP8266 mengirim data ke beberapa "slave" ESP8266
- Satu "slave" ESP8266 menerima data dari beberapa "master"
Komunikasi Dua Arah ESP-NOW
Mendapatkan MAC Address Board ESP8266
// 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(){
}
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":
- Inisialisasi ESP-NOW: Siapkan ESP8266 #1 untuk berfungsi sebagai pengirim dalam komunikasi ESP-NOW.
- 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.
- Tambahkan Perangkat Peer (Penerima): Masukkan alamat MAC ESP8266 #2 sebagai perangkat peer yang akan menerima pesan.
- 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:
- Inisialisasi ESP-NOW: Siapkan ESP8266 #2 untuk berfungsi sebagai penerima dalam komunikasi ESP-NOW.
- Registrasi Fungsi Callback Penerimaan Data (OnDataRecv): Buat fungsi bernama "OnDataRecv" yang akan dijalankan ketika pesan diterima dari ESP8266 #1.
- 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.
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. |
/* 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 Addressuint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
// Structure example to send data// Must match the receiver structuretypedef struct struct_message { char a[32]; int b; float c; String d; bool e;} struct_message;
// Create a struct_message called myDatastruct_message myData;
unsigned long lastTime = 0; unsigned long timerDelay = 2000; // send readings timer
// Callback when data is sentvoid 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
#include <ESP8266WiFi.h>#include <espnow.h>
uint8_t broadcastAddress[] = {0x5C, 0xCF, 0x7F, 0x99, 0x9A, 0xEA};
typedef struct struct_message { char a[32]; int b; float c; String d; bool e;} struct_message;
struct_message myData;
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"); }}
Serial.begin(115200);
WiFi.mode(WIFI_STA);
if (esp_now_init() != 0) { Serial.println("Error initializing ESP-NOW"); return;}
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
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);
esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
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;
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));
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();}
/* 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 structuretypedef struct struct_message { char a[32]; int b; float c; String d; bool e;} struct_message;
// Create a struct_message called myDatastruct_message myData;
// Callback function that will be executed when data is receivedvoid 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
#include <esp_now.h>#include <WiFi.h>
typedef struct struct_message { char a[32]; int b; float c; String d; bool e;} struct_message;
struct_message myData;
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int 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();}
Serial.begin(115200);
WiFi.mode(WIFI_STA);
if (esp_now_init() != ESP_OK) { Serial.println("Error initializing ESP-NOW"); return;}
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
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.