ESP8266 ESP32 สื่อสาร 2.4G แบบประหยัดพลังงาน ด้วยโปรโตคอล ESP-NOWESP-NOW คือการสื่อสารแลกเปลี่ยนข้อมูลระหว่างบอร์ด ESP32 ESP8266 สามารถเขียนโปรแกรมควบคุมได้ด้วย Arduino IDE การสื่อสารแบบ ESP-NOW เป็นโปรโตคอลที่พัฒนาโดย Espressif สำหรับส่งข้อมูลขนาดเล็กแบบประหยัดพลังงานด้วยความถี่ 2.4G ทำให้อุปกรณ์คุยกันได้โดยตรงแบบไม่ต้องผ่านตัวกลาง สามารถสื่อสารได้ทั้งแบบ อุปกรณ์และอุปกรณ์ หรือแบบหลายอุปกรณ์แบบเครือข่ายได้พร้อมกัน
ความสามารถของ ESP-NOW
- สื่อสารแบบไร้สายความถี่ 2.4G แบบประหยัดพลังงาน
- สร้างเครือข่ายการรับส่งสัญญาณแบบไร้สาย
- จ่ายไฟแล้วเชื่อมต่ออัตโนมัติ ไม่ต้องตั้งค่าใหม่
- เข้า/ถอดรหัสข้อมูล สื่อสารระหว่างบอร์ด
- ส่งแพ็คเกจข้อมูลสูงสุดครั้งละ 250 ไบต์
- เชื่อมต่อได้สูงสุด 20 โหนด
- มีฟังก์ชั่นตรวจสอบสถานะการรับและส่งข้อมูล
- ระยะส่ง ESP32/ESP8266 ประมาณ 100-200 เมตร ขึ้นกับอุปกรณ์และสภาพแวดล้อม
ESP-NOW การใช้งานส่งข้อมูลระหว่างบอร์ด ESP32
คำสั่งในการสั่งงาน ESP-NOW
- แต่ละบอร์ดจะมี mac address สำหรับอ้างอิง รับและส่งข้อมูล
- esp_now_init() ; สั่งเริ่มต้นให้ ESP-NOW ทำงาน
- esp_now_add_peer(); เชื่อมต่ออุปกรณ์ที่ต้องการสื่อสาร ด้วยเลข mac address
- esp_now_send(); ส่งข้อมูลให้กับบอร์ดที่เชื่อมต่อด้วย mac address
- esp_now_register_send_cb(); เมื่อส่งสำเร็จ ให้ทำคำสั่งในฟังก์ชั่นนี้
- esp_now_register_rec_cb(); เมื่อรับข้อมูลสำเร็จ ให้ทำคำสั่งในฟังก์ชั่นนี้
โค้ด Arduino ESP-NOW ESP32 ตัวอย่างที่นี่1. แบบ One-way ตัวส่ง 1 ตัว ตัวรับ 1 ตัว - กำหนด address ตัวรับ
- โค้ด ESP32 ESP-NOW : ตัวส่ง TX // esp_now_ex1.ino
- โค้ด ESP32 ESP-NOW : ตัวรับ RX (ตัวที่ 1) // esp_now_ex2.ino
อัพโหลดโค้ดตัวรับก่อนจากนั้นเปิดดู Serial Monitor จะเห็นเลข mac address
นำเลข address มาแก้ไขให้กับโค้ดตัวส่ง เพื่อกำหนดให้ตัวส่ง ส่งข้อมูลไปหาตัวที่มี mac address นี้
เปิดดูใน Serial Monitor ของทั้งสองบอร์ด ก็จะเห็นว่าสามารถส่งข้อมูลหากันได้แล้ว ง่าย ๆ แบบนี้
กรณีต้องการส่งไปหาทุกบอร์ด สามารถกำหนด mac address ที่ส่งเป็น 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF

2. แบบ One-way ตัวรับ 1 ตัว ตัวส่งหลายตัว - แค่กำหนด mac address ตัวรับ
- โค้ด ESP32 ESP-NOW : ตัวส่ง TX (ตัวที่ 1) //esp_now_ex1.ino // กำหนดข้อความ ID 1
- โค้ด ESP32 ESP-NOW : ตัวส่ง TX (ตัวที่ 2) //esp_now_ex1.ino // กำหนดข้อความ ID 2
- โค้ด ESP32 ESP-NOW : ตัวรับ RX // esp_now_ex2.ino ตัวเดิมไม่ต้องแก้
เปิดดูใน Serial Monitor ของตัวรับ จะเห็นว่า มีข้อมูลส่งมา 2 ชุด ID 1 และ ID2 แสดงว่าทั้งสองบอร์ดส่งข้อมูลมาที่ตัวรับได้สำเร็จ

3. แบบ One-way ตัวส่ง 1 ตัว ตัวรับหลายตัว - เพิ่ม address ตัวรับทั้ง 2 ตัว ส่งแบบ channal
- โค้ด ESP32 ESP-NOW : ตัวส่ง TX // esp_now_ex3.ino
- โค้ด ESP32 ESP-NOW : ตัวรับ RX (ตัวที่ 1) // esp_now_ex2.ino
- โค้ด ESP32 ESP-NOW : ตัวรับ RX (ตัวที่ 2) // esp_now_ex2.ino

4. แบบ Two-way รับและส่งในตัวเดียวกัน- กำหนด mac address ของตัวรับ
- โค้ด ESP32 ESP-NOW : ตัวที่ 1 // esp_now_ex4.ino
- โค้ด ESP32 ESP-NOW : ตัวที่ 2 // esp_now_ex4.ino
เปิดดูใน Serial Monitor จะเห็นว่าอุปกรณ์ 1 ตัว สามารถทำงานได้ทั้งเป็นตัวรับ และตัวส่งแล้ว
การใช้งาน ESP-NOW ESP32 เพิ่มเติมดังนี้ตัวอย่างการใช้งานกับ ESP-NOW ESP8266

การใช้งานระหว่าง ESP8266 กับบอร์ด ESP32 สามารถใช้โค้ดของแต่ละบอร์ดในตัวอย่างนี้เพื่อรับส่งข้อมูลได้
เพิ่มเติมESP8266 ใช้โค้ดคล้ายกับ ESP32 โดยมีจุดที่แตกต่างกับ ESP32 6 จุดดังนี้
1. เปลียน include libarary
#include <esp_now.h>
#include <WiFi.h>
เป็น 2 ตัวนี้
#include <espnow.h>
#include <ESP8266WiFi.h>
2. เปลียนตัวแปร ESP_OK
esp_now_init() != ESP_OK
เป็น
esp_now_init() != 0
3. เปลี่ยนตัวแปรในฟังก์ชั่น OnDataRecv จาก
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, int len)
เป็น
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len)
4 เปลี่ยนฟังก์ชั่น OnDataSend จาก
void OnDataSent(uint8_t *mac_addr, esp_now_send_status_t status)
เป็น
void OnDataSent(uint8_t *mac_addr, uint8_t status
5 เปลี่ยน status == ESP_NOW_SEND_SUCCESS
เป็น sendStatus == 0
6 เปลียนวิธี Register peer เป็น
เป็น
// Register peer
esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
ข้อมูลวิธีใช้งาน ESP-NOW ESP32 ESP8266 เพิ่มเติม
- https://randomnerdtutorials.com/esp-now-esp8266-nodemcu-arduino-ide/
- https://randomnerdtutorials.com/esp-now-one-to-many-esp32-esp8266/
- https://www.youtube.com/watch?v=lkHdk_mKGUw
- https://www.survivingwithandroid.com/esp-now-esp32-esp8266/