ESP-NOW
ESP-NOW เป็นโปรโตคอลการสื่อสารไร้สายของ ESP8266 และ ESP32 ที่ออกแบบมาให้สามารถส่งข้อมูลระหว่างอุปกรณ์โดยตรงโดยไม่ต้องใช้ Wi-Fi หรืออินเทอร์เน็ต เหมาะสำหรับการสื่อสารแบบ Low Power และ Real-time โดย ESP-NOW ใช้คลื่นความถี่ 2.4 GHz ในการส่งข้อมูล ทำให้สามารถทำงานได้อย่างรวดเร็วและมีค่าหน่วงเวลาต่ำ
คุณสมบัติของ ESP-NOW
- การสื่อสารที่รวดเร็วและมีค่าหน่วงเวลาต่ำ
- ไม่ต้องเชื่อมต่อกับ Access Point หรืออินเทอร์เน็ต
- รองรับการส่งข้อมูลแบบ Unicast (ระบุอุปกรณ์เป้าหมาย) และ Broadcast (ส่งให้ทุกอุปกรณ์ที่รองรับ)
- ใช้พลังงานต่ำ เหมาะสำหรับอุปกรณ์ IoT
อุปกรณ์ที่ใช้
- ESP32 หรือ ESP8266 อย่างน้อย 2 ตัว
- Arduino IDE หรือ PlatformIO สำหรับเขียนโค้ด
การติดตั้งไลบรารีที่จำเป็น
- สำหรับ ESP32 ไลบรารี ESP-NOW มีมาให้แล้วใน ESP32 Core ดังนั้นไม่ต้องติดตั้งเพิ่มเติม
- สำหรับ ESP8266 ต้องติดตั้งไลบรารี espnow ผ่าน Arduino Library Manager
การดู MAC Address ของอุปกรณ์
ก่อนที่จะตั้งค่าให้ ESP-NOW ทำงาน เราต้องทราบ MAC Address ของอุปกรณ์แต่ละตัว โดยใช้โค้ดนี้:
#include <WiFi.h>
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
Serial.print("MAC Address: ");
Serial.println(WiFi.macAddress());
}
void loop() {}
1.อัพโหลดโค้ดนี้ไปยังอุปกรณ์แต่ละตัว
2.เปิด Serial Monitor และจด MAC Address ของแต่ละตัวไว้ เพื่อใช้ในการกำหนดค่าให้ Sender ส่งข้อมูลไปยัง Receiver ได้ถูกต้อง
โค้ดตัวอย่างการใช้งาน : ตั้งค่าอุปกรณ์ผู้ส่ง (Sender)
โค้ดนี้ส่งข้อความ “Hello ESP-NOW” ไปยังอุปกรณ์ผู้รับ
#include <esp_now.h>
#include <WiFi.h>
uint8_t receiverAddress[] = {0x24, 0x6F, 0x28, 0xA1, 0xB2, 0xC3}; // ใส่ MAC Address ของผู้รับ
typedef struct {
char message[32];
} Message;
Message myData;
void onSent(const uint8_t *macAddr, esp_now_send_status_t status) {
Serial.print("Delivery Status: ");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Success" : "Fail");
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
if (esp_now_init() != ESP_OK) {
Serial.println("ESP-NOW Initialization Failed");
return;
}
esp_now_register_send_cb(onSent);
esp_now_peer_info_t peerInfo = {};
memcpy(peerInfo.peer_addr, receiverAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
esp_now_add_peer(&peerInfo);
}
void loop() {
strcpy(myData.message, "Hello ESP-NOW");
esp_now_send(receiverAddress, (uint8_t *)&myData, sizeof(myData));
delay(1000);
}
โค้ดตัวอย่างการใช้งาน : ตั้งค่าอุปกรณ์ผู้รับ (Receiver)
โค้ดนี้รับและแสดงข้อความจาก ESP-NOW
#include <esp_now.h>
#include <WiFi.h>
typedef struct {
char message[32];
} Message;
void onReceive(const uint8_t * macAddr, const uint8_t *incomingData, int len) {
Message myData;
memcpy(&myData, incomingData, sizeof(myData));
Serial.print("Received: ");
Serial.println(myData.message);
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
if (esp_now_init() != ESP_OK) {
Serial.println("ESP-NOW Initialization Failed");
return;
}
esp_now_register_recv_cb(onReceive);
}
void loop() {
// ไม่มีการทำงานใน loop เพราะ ESP-NOW ใช้งาน callback function
}
การทดสอบ
- อัพโหลดโค้ด MAC Address ไปยังอุปกรณ์แต่ละตัวเพื่อจดบันทึก
- อัพโหลดโค้ด Sender และ Receiver ลงบน ESP32 หรือ ESP8266 ที่ใช้งาน
- เปิด Serial Monitor ทั้งสองอุปกรณ์
- อุปกรณ์ Sender จะส่ง “Hello ESP-NOW” ทุก ๆ วินาที
- อุปกรณ์ Receiver จะแสดงข้อความที่ได้รับใน Serial Monitor
สรุป
ESP-NOW เป็นโซลูชันที่ง่ายและมีประสิทธิภาพสำหรับการสื่อสารระหว่าง ESP32/ESP8266 โดยไม่ต้องใช้ Wi-Fi เหมาะสำหรับการส่งข้อมูลแบบ Low Power และ Real-time สามารถนำไปประยุกต์ใช้กับระบบเซ็นเซอร์หรืออุปกรณ์ควบคุมต่าง ๆ ได้อย่างง่ายดาย