[BASIC] 013 ESP NOW (ส่งข้อมูลระหว่างบอร์ด)

สวัสดีครับ สำหรับหัวข้อบทเรียนพื้นฐานบนบอร์ด HONEYLemon ที่ใช้งานผ่าน arduino library โดยเป็นการใช้งานเกี่ยวกับการสื่อสารไร้สายผ่าน ESP NOW

สำหรับ ESP-NOW นั้นเป็นโพรโตคอลที่พัฒนาโดย Espressif System เพื่อใช้ในการติดต่อสื่อสารโดยไม่จำเป็นต้องมีตัวกลาง ยกตัวอย่างเช่น Access Point หรือ Router เลย โดยสามารถเชื่อมต่อกันตรงๆ และใช้งานได้ทั้งส่งไปยังปลายทางที่กำหนด หรือใช้การ Broadcast ก็ได้เช่นกัน เหมาะสำหรับการนำมาทำงานร่วมกันเป็นกลุ่มของการสื่อสารโดยใช้ความถี่ 2.4GHz

ส่งข้อมูลได้ครั้งละ 250 byte ต่อครั้ง (payload)

ใช้งานพร้อมกันได้สูงสุด 20 ตัว

สำหรับการใช้งานนั้นทางผู้พัฒนาบอร์ด HONEYLemon ได้มีการสร้างฟังก์ชั่นให้สามารถใช้งานสำหรับการสื่อสารได้ง่ายขึ้น โดยมีคำสั่งเบื้องต้นดังนี้

lemon.setupESPNOW(); // สำหรับ setup ให้สามารถใช้งาน esp-now ได้
lemon.espnow_send(); // สำหรับการส่งไปหาอุปกรณ์ปลายทาง
lemon.espnow_broadcast(); // สำหรับการส่งไปหาอุปกรณ์ปลายทางแบบ broadcast(ส่งทุกตัว)

วิธีการใช้งาน

1.สร้างฟังก์ชั่นสำหรับรับข้อมูลก่อน

void espnowRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) {
char macStr[22];
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.print(macStr);
Serial.write(data, data_len);
Serial.println();
}

2.ทำการ setup เพื่อใช้งาน ESP NOW

void setup(){
...
lemon.setupESPNOW(); // เพื่อเตรียมความพร้อมใช้งาน ESP NOW
esp_now_register_recv_cb(espnowRecv); // ฟังก์ชั่น callback เรียกเมื่อมีข้อความเข้ามา
...
}

3.ทำการส่งข้อมูลแบบ broadcast ไปหาอุปกรณ์ทุกตัว

...
lemon.espnow_broadcast("Hello World!");
...

หรือหากต้องการส่งไปหาตัวใดตัวหนึ่งในระบบก็สามารถทำได้แต่ต้องทราบ Mac Address ของอุปกรณ์ปลายทางที่ต้องการส่งก่อน โดยบอร์ด HONEYLemon สามารถพิมพ์คำสั่งได้เลย

...
Serial.println("My MAC Address : "+lemon.getMAC());
...

แนะนำว่าควรนำไปไว้ใน void setup() เพื่อใช้ในการดูว่า Mac Address ของบอร์ดนั้นๆ

และสำหรับการส่งไปหาอุปกรณ์ปลายทางเฉพาะบอร์ดสามารถใช้คำสั่งได้ดังนี้

...
lemon.espnow_send("FF:FF:FF:FF:FF:FF","Hello World!");
// แก้ FF:FF:FF:FF:FF:FF เป็น MAC Address ปลายทาง
...

ตัวอย่าง source code

/*
Basic : การเขียนโปรแกรมสื่อสารไร้สายด้วย ESP-NOW
*/
#include <HONEYLemon.h>
// ฟังก์ชั่นสำหรับการรับข้อมูลสำหรับ ESP-NOW
void espnowRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) {
char macStr[22];
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.print(macStr);
Serial.write(data, data_len);
Serial.println();
}
void setup()
{
lemon.begin(); // เรียกใช้งานฟังก์ชั่นเริ่มต้นของบอร์ด HONEYLemon
Serial.begin(115200); // เรียกใช้งาน Serial
lemon.debug(Serial); // ขอดู debug ของบอร์ด HONEYLemon ผ่าน Serial
Serial.println("My MAC Address : "+lemon.getMAC()); // แสดง MAC Address ของตัวเอง
lemon.setupESPNOW(); // เรียกใช้งาน ESP-NOW
esp_now_register_recv_cb(espnowRecv); // เมื่อมีข้อมูลส่งกลับมาจะให้เรียกฟังก์ชั่น espnowRecv
}
void loop()
{
// lemon.espnow_send("FF:FF:FF:FF:FF:FF","Hello World!")); // ส่งคำว่า Hello World! ไปหาอุปกรณ์ MAC Addess ปลายทางผ่าน ESP-NOW
lemon.espnow_broadcast("Hello World!"); // ส่งคำว่า Hello World! ไปหาอุปกรณ์ทุกตัวผ่าน ESP-NOW
delay(1000); // รอ 1000 มิลลิวินาที ( 1 วินาที )
}