Pengiriman dilakukan oleh LOLIN32 dengan MCU ESP32 sedangkan penerimaan dilakukan oleh ESP01 dengan MCU ESP8266. Potokol pengiriman menggunakan ESP-NOW. ESP-NOW adalah salah satu protokol hibungan WiFi yang dibesut oleh Espressif.
Skrip Pengiriman yang dibenamkan di LOLIN32
#ifdef ESP32
#include <esp_now.h>
#include <WiFi.h>
#else
#include <espnow.h>
#include <ESP8266WiFi.h>
typedef enum {ESP_NOW_SEND_SUCCESS = 0, ESP_NOW_SEND_FAIL};
typedef enum {ESP_OK = 0} esp_err_t;
#endif
// Ganti dengan MAC penerima
uint8_t broadcastAddress[] = {0x50, 0x02, 0x91, 0xFE, 0x4C, 0x01};
// ID harus unik
const int id = 1;
// struktur untuk pengiriman data harus sama dengan struktur pada penerima
typedef struct struct_message {
int id;
int x;
int y;
} struct_message;
struct_message myData;
// callback saat data dikirim
#ifdef ESP32
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status)
#else
void OnDataSent(uint8_t *mac_addr, uint8_t status)
#endif
{
Serial.print("Status pengiriman:\t");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Sukses" : "Gagal");
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
// Init ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Gagal inisialisasi ESP-NOW");
return;
}
#ifdef ESP32
#else
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
#endif
// registrasi ke penerima dan cek status paket
esp_now_register_send_cb(OnDataSent);
// Registrasi peer
#ifdef ESP32
esp_now_peer_info_t peerInfo;
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
// Menambahkan diri peer
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Gagal menambahkan peer");
return;
}
#else
if (esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0) != ESP_OK) {
Serial.println("Gagal menambahkan peer");
return;
}
#endif
}
void loop() {
// Nilai untuk dikirim
myData.id = 1;
myData.x = random(0, 50);
myData.y = random(0, 50);
Serial.print("x:"); Serial.println(myData.x, DEC);
Serial.print("y:"); Serial.println(myData.y, DEC);
// Kirim pesan
#ifdef ESP32
esp_err_t result;
#else
int result;
#endif
result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
if (result == ESP_OK) {
Serial.println("Permintaan pengiriman berhasil");
}
else {
Serial.println("Gagal mengirim data");
}
delay(10000);
}
Skrip penerima yang dibenamkan di ESP01
#ifdef ESP32
#include <esp_now.h>
#include <WiFi.h>
#else
#include <espnow.h>
#include <ESP8266WiFi.h>
#define ESP_OK 0
#endif
// struktur untuk pengiriman data harus sama dengan struktur pada penerima
typedef struct struct_message {
int id;
int x;
int y;
}struct_message;
struct_message myData;
// Membuat struktur untuk tiap board
struct_message board1;
struct_message boardsStruct[3] = {board1};
// callback saat data diterima
#ifdef ESP32
void OnDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len)
#else
void OnDataRecv(uint8_t * mac_addr, uint8_t *incomingData, uint8_t len)
#endif
{
char macStr[18];
Serial.print("Paket diterima dari: ");
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.println(macStr);
memcpy(&myData, incomingData, sizeof(myData));
Serial.printf("Board ID %u: %u bytes\n", myData.id, len);
// Update the structures with the new incoming data
boardsStruct[myData.id-1].x = myData.x;
boardsStruct[myData.id-1].y = myData.y;
Serial.printf("x value: %d \n", boardsStruct[myData.id-1].x);
Serial.printf("y value: %d \n", boardsStruct[myData.id-1].y);
Serial.println();
}
void setup(){
Serial.begin(74880);
Serial.println();
Serial.print("ESP Board MAC Address: ");
Serial.println(WiFi.macAddress());
WiFi.mode(WIFI_STA);
//Init ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
//daftrakan callback
esp_now_register_recv_cb(OnDataRecv);
}
void loop() {
// Mengakses data dari setiap board
//Serial.println(boardsStruct[0].x,DEC);
delay(1000);
}