การสื่อสารระหว่าง ESP แบบไร้สายด้วย ESP-NOW

การสื่อสารระหว่าง ESP แบบไร้สายด้วย ESP-NOW

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 สามารถนำไปประยุกต์ใช้กับระบบเซ็นเซอร์หรืออุปกรณ์ควบคุมต่าง ๆ ได้อย่างง่ายดาย

BESTการสื่อสารระหว่าง ESP แบบไร้สายด้วย ESP-NOW

Related Posts