# \[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 วินาที )
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lemon.honey.co.th/blogs/basic/basic-013-esp-now.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
