สารบัญ:
- เสบียง
- ขั้นตอนที่ 1: รับที่อยู่ Mac ของบอร์ด
- ขั้นตอนที่ 2: วิธีทำให้ ESP-NOW ทำงาน
- ขั้นตอนที่ 3: ฟังก์ชัน ESP-NOW (ESP32)
- ขั้นตอนที่ 4: ฟังก์ชัน ESP-NOW (ESP8266)
- ขั้นตอนที่ 5: การสื่อสารทางเดียว (ESP32 ในฐานะผู้ส่ง)
- ขั้นตอนที่ 6: การสื่อสารทางเดียว (ESP8266 ในฐานะผู้ส่ง)
- ขั้นตอนที่ 7: การสื่อสารสองทาง
- ขั้นตอนที่ 8: ข้อมูลอ้างอิง
วีดีโอ: วิธีสร้าง ESP Talk หลายรายการผ่าน ESP-NOW โดยใช้ ESP32 และ ESP8266: 8 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:03
ในโครงการที่กำลังดำเนินการอยู่ ฉันต้องการ ESP หลายตัวเพื่อพูดคุยกันโดยไม่ต้องใช้เราเตอร์ ในการทำเช่นนี้ ฉันจะใช้ ESP-NOW เพื่อทำการสื่อสารแบบไร้สายระหว่างกันโดยไม่ต้องใช้เราเตอร์บน ESP
เสบียง
สิ่งที่ฉันใช้:
โมดูล ESP32 DEV
NODEMCU 1.0 (โมดูล ESP12E)
ขั้นตอนที่ 1: รับที่อยู่ Mac ของบอร์ด
ผ่าน ESP ตอนนี้ อุปกรณ์ ESP จะสื่อสารกันเองโดยส่งข้อมูลไปยังที่อยู่เฉพาะในขณะที่เชื่อมต่อกับเครือข่ายจุดเชื่อมต่อภายในที่สร้างขึ้นเมื่อทำการ intilaizing esp ทันที. ดังนั้นให้กำหนดที่อยู่ MAC ของแต่ละอุปกรณ์ที่แนบมาคือการตั้งค่าบอร์ด ESP32 และ ESP8266 ของฉัน
สำหรับ ESP32
#include "WiFi.h" //เพื่อเข้าถึงความสามารถของ ESP32 WIFI
การตั้งค่าเป็นโมฆะ () { Serial.begin (115200); Serial.print("ESP32 ที่อยู่ MAC ของบอร์ด: "); Serial.println(WiFi.macAddress()); //พิมพ์ที่อยู่ MAC } void loop(){}
สำหรับ ESP8266
#include //ไลบรารี่ที่ใช้เพื่อเข้าถึงความสามารถของ ESP8266 WIFI
การตั้งค่าเป็นโมฆะ () { Serial.begin (115200); Serial.println(); Serial.print("ESP8266 ที่อยู่ MAC ของบอร์ด: "); Serial.println(WiFi.macAddress()); //พิมพ์ที่อยู่ MAC } void loop(){}
ที่อยู่ MAC ของฉันคือ:
- ESP32 - 30:AE:A4:F5:03:A4
- ESP8266: A4:CF:12:C7:9C:77
ขั้นตอนที่ 2: วิธีทำให้ ESP-NOW ทำงาน
นี่คือภาพรวมเกี่ยวกับวิธีการทำงาน:
- รวม esp ทันทีและไลบรารี wifi
- บันทึกที่อยู่ Mac ของผู้รับESP
- กำหนดโครงสร้างข้อมูลของข้อความส่ง/รับ
- ในการตั้งค่า ให้ตั้งค่า wifi เป็นโหมดสถานี
- เริ่มต้น esp_now
- ทำและลงทะเบียนฟังก์ชั่นโทรกลับที่เรียกหลังจากส่งและรับข้อมูล
- สำหรับ Esp8266 ให้กำหนดบทบาท
- ลงทะเบียนเพียร์หรือผู้รับ esp
- ส่งข้อมูล
ขั้นตอนที่ 3: ฟังก์ชัน ESP-NOW (ESP32)
esp_now_init(เป็นโมฆะ)
กลับ:
- ESP_OK: สำเร็จ
- ESP_ERR_ESPNOW_INTERNAL: ข้อผิดพลาดภายใน
คำอธิบาย:
เริ่มต้นฟังก์ชัน ESPNOW
esp_now_register_send_cb(cb)
ผลตอบแทน:
- ESP_OK: สำเร็จ
- ESP_ERR_ESPNOW_NOT_INIT: ESPNOW ไม่ได้เริ่มต้น
- ESP_ERR_ESPNOW_INTERNAL: ข้อผิดพลาดภายใน
พารามิเตอร์:
-
cb: ชื่อฟังก์ชันเรียกกลับหลังจากส่งข้อมูล ESPNOW ด้วยพารามิเตอร์นี้:
-
เป็นโมฆะ cb (const uint8_t *mac_addr สถานะ esp_now_send_status_t)
- mac_addr: ที่อยู่ mac ของผู้รับ
-
สถานะ:
- 1 = ความสำเร็จ
- 0 = ล้มเหลว
-
คำอธิบาย:
เรียกใช้ฟังก์ชัน OnDataSent หลังจากส่งข้อมูล ESPNOW
esp_now_add_peerconst esp_now_peer_info_t *เพียร์)
ผลตอบแทน:
- ESP_OK: สำเร็จ
- ESP_ERR_ESPNOW_NOT_INIT: ESPNOW ไม่ได้เริ่มต้น
- ESP_ERR_ESPNOW_ARG: อาร์กิวเมนต์ไม่ถูกต้อง
- ESP_ERR_ESPNOW_FULL: รายชื่อเพื่อนเต็มแล้ว
- ESP_ERR_ESPNOW_NO_MEM: หน่วยความจำไม่เพียงพอ
- ESP_ERR_ESPNOW_EXIST: มีเพียร์อยู่แล้ว
พารามิเตอร์:
-
peer:peer ข้อมูลที่มีข้อมูลต่อไปนี้:
-
uint8_t
peer_addr[ESP_NOW_ETH_ALEN]; ที่อยู่ MAC เพียร์ของ ESPNOW ซึ่งเป็นที่อยู่ MAC ของสถานีหรือ softap
-
uint8_t lmk[ESP_NOW_KEY_LEN]
ESPNOW เพียร์มาสเตอร์คีย์ภายในเครื่องที่ใช้เข้ารหัสข้อมูล
-
uint8_t channel
ช่องสัญญาณ Wi-Fi ที่เพียร์ใช้ในการส่ง/รับข้อมูล ESPNOW หากค่าเป็น 0 ให้ใช้ช่องสัญญาณปัจจุบันที่สถานีหรือ softap เปิดอยู่ มิเช่นนั้นจะต้องตั้งค่าเป็นช่องสัญญาณที่สถานีหรือ softap เปิดอยู่
-
wifi_interface_t ifidx
อินเทอร์เฟซ Wi-Fi ที่เพียร์ใช้ในการส่ง/รับข้อมูล ESPNOW
-
การเข้ารหัสบูล
ข้อมูล ESPNOW ที่เพียร์นี้ส่ง/รับมีการเข้ารหัสหรือไม่
-
เป็นโมฆะ *priv
ESPNOW เพียร์ข้อมูลส่วนตัว
-
คำอธิบาย:
เพิ่มรายการเพียร์ทูเพียร์
esp_now_send (const uint8_t *peer_addr, const uint8_t *data, size_t len)
ผลตอบแทน:
- ESP_OK: สำเร็จ
-
ESP_ERR_ESPNOW_NOT_INIT: ESPNOW ไม่ได้เริ่มต้น
- ESP_ERR_ESPNOW_ARG: อาร์กิวเมนต์ไม่ถูกต้อง
- ESP_ERR_ESPNOW_INTERNAL: ข้อผิดพลาดภายใน
- ESP_ERR_ESPNOW_NO_MEM: หน่วยความจำไม่เพียงพอ
- ESP_ERR_ESPNOW_NOT_FOUND: ไม่พบเพียร์
- ESP_ERR_ESPNOW_IF: อินเทอร์เฟซ WiFi ปัจจุบันไม่ตรงกับของเพียร์
พารามิเตอร์:
- peer_addr: ที่อยู่ MAC ของเพียร์
- data: ข้อมูลที่จะส่ง
- len: ความยาวของข้อมูล
คำอธิบาย:
ส่งข้อมูล ESPNOW ในบางกรณี สิ่งนี้จะเกิดขึ้น:
- หาก peer_addr ไม่ใช่ NULL ให้ส่งข้อมูลไปยังเพียร์ที่มีที่อยู่ MAC ตรงกับ peer_addr
- หาก peer_addr เป็น NULL ให้ส่งข้อมูลไปยังเพียร์ทั้งหมดที่เพิ่มลงในรายการเพียร์
- ความยาวสูงสุดของข้อมูลต้องน้อยกว่า ESP_NOW_MAX_DATA_LEN
- บัฟเฟอร์ที่ชี้โดยอาร์กิวเมนต์ data ไม่จำเป็นต้องถูกต้องหลังจาก esp_now_send return
esp_now_register_recv_cb(cb)
ผลตอบแทน:
- ESP_OK: สำเร็จ
- ESP_ERR_ESPNOW_NOT_INIT: ESPNOW ไม่ได้เริ่มต้น
- ESP_ERR_ESPNOW_INTERNAL: ข้อผิดพลาดภายใน
พารามิเตอร์:
-
cb: ฟังก์ชั่นโทรกลับเพื่อรับข้อมูล ESPNOW
-
เป็นโมฆะ cb (const uint8_t *mac_addr, const uint8_t *data, int data_len)
-
mac_addr:
ที่อยู่ mac ของผู้รับ
-
*ข้อมูล:
รับข้อมูล
-
data_len
ความยาวไบต์ข้อมูล
-
-
คำอธิบาย:
เรียกใช้ฟังก์ชัน cb หลังจากได้รับข้อมูล ESPNOW
ขั้นตอนที่ 4: ฟังก์ชัน ESP-NOW (ESP8266)
คำอธิบายฟังก์ชัน ESP32 ESP8266
int esp_now_init (เป็นโมฆะ)
ผลตอบแทน:
- 1 = ความสำเร็จ
- 0=ล้มเหลว
คำอธิบาย
เริ่มต้นฟังก์ชัน ESPNOW
int esp_now_set_self_role (บทบาท u8)
พารามิเตอร์:
- ESP_NOW_ROLE_IDLE: ไม่อนุญาตให้ส่งข้อมูล
- ESP_NOW_ROLE_CONTROLLER: ให้ความสำคัญกับอินเทอร์เฟซ Sation
- ESP_NOW_ROLE_SLAVE: ลำดับความสำคัญถูกกำหนดให้กับอินเทอร์เฟซ SoftAP
- ESP_NOW_ROLE_COMBO: ให้ความสำคัญกับ SoftAPinterface
คำอธิบาย
ตั้งค่าบทบาทอุปกรณ์
int esp_now_register_send_cb(cb)
คืนสินค้า:
- 1 = ความสำเร็จ
- 0 = ล้มเหลว
พารามิเตอร์:
-
cb: ชื่อฟังก์ชันเรียกกลับหลังจากส่งข้อมูล ESPNOW ด้วยพารามิเตอร์นี้:
-
เป็นโมฆะ cb (const uint8_t *mac_addr สถานะ esp_now_send_status_t)
- mac_addr: ที่อยู่ mac ของผู้รับ
-
สถานะ:
- 1 = ความสำเร็จ
- 0 = ล้มเหลว
-
คำอธิบาย
เรียกใช้ฟังก์ชัน OnDataSent หลังจากส่งข้อมูล ESPNOW
int esp_now_add_peer (u8 *mac_addr, บทบาท u8, ช่อง u8, u8 * คีย์, u8 key_len)
ผลตอบแทน:
- 1 = ความสำเร็จ
- 0 = ล้มเหลว
พารามิเตอร์:
-
mac_addr
ที่อยู่ mac ของเพียร์
- บทบาท
-
ช่อง
หากค่าเป็น 0 ให้ใช้ช่องสัญญาณปัจจุบันที่สถานีหรือ softap เปิดอยู่ มิฉะนั้นจะต้องตั้งค่าเป็นช่องที่สถานีหรือ softap เปิดอยู่
-
*กุญแจ
กุญแจสำหรับการเข้ารหัส
-
key_len
ความยาวของคีย์
คำอธิบาย:
เพิ่มรายการเพียร์ทูเพียร์
int esp_now_send (const uint8_t *peer_addr, const uint8_t *data, size_t len)
ผลตอบแทน:
- 1 = ความสำเร็จ
- 0 = ล้มเหลว
พารามิเตอร์:
- peer_addr: ที่อยู่ MAC ของเพียร์
- data: ข้อมูลที่จะส่ง
- len: ความยาวของข้อมูล
คำอธิบาย:
ส่งข้อมูล ESPNOW ในบางกรณี สิ่งนี้จะเกิดขึ้น:
- หาก peer_addr ไม่ใช่ NULL ให้ส่งข้อมูลไปยังเพียร์ที่มีที่อยู่ MAC ตรงกับ peer_addr
- หาก peer_addr เป็น NULL ให้ส่งข้อมูลไปยังเพียร์ทั้งหมดที่เพิ่มลงในรายการเพียร์
- ความยาวสูงสุดของข้อมูลต้องน้อยกว่า ESP_NOW_MAX_DATA_LEN
- บัฟเฟอร์ที่ชี้โดยอาร์กิวเมนต์ data ไม่จำเป็นต้องถูกต้องหลังจาก esp_now_send return
int esp_now_register_recv_cb(cb)
ผลตอบแทน:
- 1 = ความสำเร็จ
- 0 = ล้มเหลว
พารามิเตอร์:
-
cb: ฟังก์ชั่นโทรกลับเพื่อรับข้อมูล ESPNOW
-
เป็นโมฆะ cb (const uint8_t *mac_addr, const uint8_t *data, int data_len)
-
mac_addr:
ที่อยู่ mac ของผู้รับ
-
*ข้อมูล:
รับข้อมูล
-
data_len
ความยาวไบต์ข้อมูล
-
-
คำอธิบาย:
เรียกใช้ฟังก์ชัน cb หลังจากได้รับข้อมูล ESPNOW
ขั้นตอนที่ 5: การสื่อสารทางเดียว (ESP32 ในฐานะผู้ส่ง)
ESP32 ส่งข้อมูลไปยัง ESP8266 ด้วยรหัสนี้ เปลี่ยน broadcastAddress เป็นที่อยู่ mac ของเครื่องรับที่สอดคล้องกัน ของฉันคือ A4:CF:12:C7:9C:77
//เพิ่มไลบรารี่ที่จำเป็น
#include // ในการเข้าถึง esp ตอนนี้ฟังก์ชัน #include // เพื่อเพิ่มความสามารถ Wifi บน ESP32 // บันทึกที่อยู่ MAC ในอาร์เรย์ชื่อ broadcastAddress; uint8_t broadcastAddress = {0xA4, 0xCF, 0x12, 0xC7, 0x9C, 0x77}; //ที่อยู่ MAC ของผู้รับของฉัน /*กำหนดประเภทข้อมูลของตัวแปรหลายตัวที่มีโครงสร้างและเปลี่ยนชื่อทั้งหมดเป็น struct_message*/ typedef struct struct_message { ถ่าน a [32]; int ข; ลอยค; สตริง d; บูลอี; } struct_message; // สร้าง struct_message ที่เรียกว่า myData struct_message myData; // เรียกฟังก์ชันเมื่อส่งข้อมูลเพื่อพิมพ์สถานะเป็นโมฆะ OnDataSent (const uint8_t *mac_addr สถานะ esp_now_send_status_t) { Serial.print("\r\nLast Packet Send Status:\t"); Serial.println(status == ESP_NOW_SEND_SUCCESS ? " Delivery Success": " Delivery Fail "); } การตั้งค่าเป็นโมฆะ () {// ตั้งค่าอัตรารับส่งข้อมูลสำหรับการสื่อสารแบบอนุกรมด้วย ESP Serial.begin (115200); // ตั้งค่าอุปกรณ์เป็นสถานี Wi-Fi WiFi.mode (WIFI_STA); // เริ่ม wifi // เริ่มใช้งาน ESP-NOW และส่งคืนสถานะหาก (esp_now_init () != ESP_OK) { Serial.println ("ข้อผิดพลาดในการเริ่มต้น ESP -ตอนนี้"); กลับ; } // เรียกใช้ฟังก์ชัน OnDataSent หลังจากส่งข้อมูล ESPNOW esp_now_register_send_cb (OnDataSent); // ลงทะเบียนเพียร์ esp_now_peer_info_t peerInfo; //เริ่มต้นและกำหนดข้อมูลเพียร์เป็นตัวชี้ไปยังที่อยู่ memcpy(peerInfo.peer_addr, broadcastAddress, 6); //คัดลอกค่าของ broadcastAddress ขนาด 6 ไบต์ไปที่ peerInfo.peer_addr peerInfo.channel = 0; // ช่องที่ esp พูด 0 หมายถึงไม่ได้กำหนดและข้อมูลจะถูกส่งไปยังช่องสัญญาณปัจจุบัน 1-14 เป็นช่องสัญญาณที่ถูกต้องซึ่งเหมือนกันกับอุปกรณ์ภายในเครื่อง peerInfo.encrypt = false; //ไม่ได้เข้ารหัส //เพิ่มอุปกรณ์ในรายการอุปกรณ์ที่จับคู่ถ้า (esp_now_add_peer(&peerInfo) != ESP_OK){ Serial.println("Failed to add peer"); กลับ; } } void loop() {// ตั้งค่าเพื่อส่ง strcpy(myData.a, "THIS IS A CHAR"); // บันทึก "นี่คือ CHAR" ให้กับตัวแปร a ของ "data" ของฉันที่กำหนดไว้ก่อนหน้านี้ myData.b = สุ่ม (1, 20); //บันทึกค่าสุ่ม myData.c = 1.2; //บันทึกโฟลต myData.d = "สวัสดี"; //บันทึกสตริง myData.e = false; //save a bool //ส่งข้อมูลน้อยกว่าหรือเท่ากับ 250 ไบต์ผ่าน ESP-NOW และส่งคืนสถานะ esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData)); if (ผลลัพธ์ == ESP_OK) { Serial.println ("ส่งด้วยความสำเร็จ"); } อื่น { Serial.println ("ข้อผิดพลาดในการส่งข้อมูล"); } ล่าช้า (2000); }
ESP8266 รับข้อมูลจาก ESP32 โดยใช้รหัสนี้
//เพิ่มไลบรารี่ที่จำเป็น
#include //เพื่อเพิ่มความสามารถ Wifi บน ESP32 #include // ในการเข้าถึงฟังก์ชัน esp ตอนนี้ /*กำหนดประเภทข้อมูลของตัวแปรหลายตัวที่มีโครงสร้างและเปลี่ยนชื่อทั้งหมดเป็น struct_message*/ typedef struct struct_message { ถ่าน [32]; int ข; ลอยค; สตริง d; บูลอี; } struct_message; // สร้างตัวแปร struct_message ที่เรียกว่า myData struct_message myData; // ฟังก์ชั่นถูกเรียกเมื่อได้รับข้อมูลและพิมพ์ออกมาเป็นโมฆะ OnDataRecv (uint8_t * mac, uint8_t *incomingData, uint8_t len) { memcpy (&myData, incomingData, sizeof (myData)); Serial.print("ไบต์ที่ได้รับ: "); Serial.println (เลน); Serial.print("อักขระ: "); Serial.println (myData.a); Serial.print("Int: "); Serial.println (myData.b); Serial.print("ลอย: "); Serial.println (myData.c); Serial.print("สตริง: "); Serial.println (myData.d); Serial.print("บูล: "); Serial.println (myData.e); Serial.println(); } การตั้งค่าเป็นโมฆะ () {// กำหนดอัตรารับส่งข้อมูลสำหรับการสื่อสารแบบอนุกรมด้วย ESP Serial.begin (115200); // ตั้งค่าอุปกรณ์เป็นสถานี Wi-Fi WiFi.mode(WIFI_STA); // เริ่ม wifi // เริ่มต้น ESP-NOW และส่งคืนสถานะหาก (esp_now_init() != 0) { Serial.println("ข้อผิดพลาดในการเริ่มต้น ESP-NOW"); กลับ; } esp_now_set_self_role(ESP_NOW_ROLE_SLAVE); //กำหนดบทบาทของ esp นี้ esp_now_register_recv_cb(OnDataRecv); // เรียกใช้ฟังก์ชัน OnDataRecv หลังจากได้รับข้อมูล ESPNOW } void loop() {}
ขั้นตอนที่ 6: การสื่อสารทางเดียว (ESP8266 ในฐานะผู้ส่ง)
ESP8266 ส่งข้อมูลไปยัง ESP32 ด้วยรหัสนี้ เปลี่ยน BroadcastAddress เป็นที่อยู่ mac ของเครื่องรับที่สอดคล้องกัน ที่อยู่ esp32 ของฉันคือ 30:AE:A4:F5:03:A4 สำหรับฟังก์ชั่นอื่นๆ สำหรับ esp8266 ไปที่นี่
//เพิ่มไลบรารี่ที่จำเป็น
#include //เพื่อเพิ่มความสามารถ Wifi บน ESP32 #include // ในการเข้าถึงฟังก์ชัน esp ตอนนี้ // บันทึกที่อยู่ MAC ในอาร์เรย์ชื่อ broadcastAddress; uint8_t broadcastAddress = {0x30, 0xAE, 0xA4, 0xF5, 0x03, 0xA4}; /*กำหนดประเภทข้อมูลของตัวแปรหลายตัวที่มีโครงสร้างและเปลี่ยนชื่อทั้งหมดเป็น struct_message*/ typedef struct struct_message { ถ่าน [32]; int ข; ลอยค; สตริง d; บูลอี; } struct_message; // สร้างตัวแปรที่มีโครงสร้างที่เรียกว่า myData struct_message myData; // ฟังก์ชั่นถูกเรียกเมื่อข้อมูลถูกส่งและพิมพ์สถานะเป็นโมฆะ OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) { Serial.print("\r\nLast Packet Send Status:\t"); Serial.println(sendStatus == 1 ? " Delivery Success": " Delivery Fail "); } การตั้งค่าเป็นโมฆะ () {// ตั้งค่าอัตรารับส่งข้อมูลสำหรับการสื่อสารแบบอนุกรมด้วย ESP Serial.begin (115200); // ตั้งค่าอุปกรณ์เป็นสถานี Wi-Fi WiFi.mode (WIFI_STA); // เริ่ม wifi // เริ่มต้น ESP-NOW และส่งคืนสถานะหาก (esp_now_init ()) { Serial.println ("ข้อผิดพลาดในการเริ่มต้น ESP-NOW"); กลับ; } esp_now_register_send_cb(OnDataSent); // เรียกใช้ฟังก์ชัน OnDataSent หลังจากส่งข้อมูล ESPNOW // เพิ่มอุปกรณ์ในรายการอุปกรณ์ที่จับคู่ถ้า (esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_CONTROLLER, 1, NULL, 0)){ Serial.println("Failed to add peer"); กลับ; } } void loop() {// ตั้งค่าเพื่อส่ง strcpy(myData.a, "THIS IS A CHAR"); // บันทึก "นี่คือ CHAR" ให้กับตัวแปร a ของ "data" ของฉันที่กำหนดไว้ก่อนหน้านี้ myData.b = สุ่ม (1, 20); //บันทึกค่าสุ่ม myData.c = 1.2; //บันทึกโฟลต myData.d = "SP8266"; //บันทึกสตริง myData.e = false; // บันทึกบูล // ส่งข้อมูลน้อยกว่าหรือเท่ากับ 250 ไบต์ผ่าน ESP-NOW และส่งคืนสถานะ int ผลลัพธ์ = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof (myData)); if (esp_now_init() != 0) { Serial.println("ส่งด้วยความสำเร็จ"); } อื่น { Serial.println ("ข้อผิดพลาดในการส่งข้อมูล"); } ล่าช้า (2000); }
ESP32 รับข้อมูลจาก ESP8266 ด้วยรหัสนี้ สำหรับฟังก์ชั่นอื่นๆ ดูที่นี่
//เพิ่มไลบรารี่ที่จำเป็น
#include //หากต้องการเข้าถึง esp ตอนนี้มีฟังก์ชัน #include //เพื่อเพิ่มความสามารถ Wifi บน ESP32 /*กำหนดประเภทข้อมูลของตัวแปรหลายตัวที่มีโครงสร้างและเปลี่ยนชื่อทั้งหมดเป็น struct_message*/ typedef struct struct_message { ถ่าน [32]; int ข; ลอยค; สตริง d; บูลอี; } struct_message; // สร้างตัวแปร struct_message ที่เรียกว่า myData struct_message myData; // ฟังก์ชั่นถูกเรียกเมื่อได้รับข้อมูลและพิมพ์ออกมาเป็นโมฆะ OnDataRecv (const uint8_t * mac, const uint8_t *incomingData, int len) { memcpy (&myData, incomingData, sizeof (myData)); Serial.print("ไบต์ที่ได้รับ: "); Serial.println (เลน); Serial.print("อักขระ: "); Serial.println (myData.a); Serial.print("Int: "); Serial.println (myData.b); Serial.print("ลอย: "); Serial.println (myData.c); Serial.print("สตริง: "); Serial.println (myData.d); Serial.print("บูล: "); Serial.println (myData.e); Serial.println(); } การตั้งค่าเป็นโมฆะ () {// ตั้งค่าอัตรารับส่งข้อมูลสำหรับการสื่อสารแบบอนุกรมด้วย ESP Serial.begin (115200); // ตั้งค่าอุปกรณ์เป็นสถานี Wi-Fi WiFi.mode(WIFI_STA); // เริ่ม wifi // เริ่มต้น ESP-NOW และส่งคืนสถานะหาก (esp_now_init() != 0) { Serial.println("ข้อผิดพลาดในการเริ่มต้น ESP-NOW"); กลับ; } esp_now_register_recv_cb(OnDataRecv); // เรียกใช้ฟังก์ชัน OnDataRecv หลังจากได้รับข้อมูล ESPNOW } void loop() {}
ขั้นตอนที่ 7: การสื่อสารสองทาง
ESP32 จะส่งข้อมูลเมื่อเริ่มต้นระบบไปยัง ESP8266 ESP8266 พิมพ์ข้อความที่ได้รับแล้วตอบกลับซึ่ง ESP32 พิมพ์บนจอภาพแบบอนุกรม
รหัส ESP32
//เพิ่มไลบรารี่ที่จำเป็น
#include // ในการเข้าถึง esp ตอนนี้ฟังก์ชัน #include // เพื่อเพิ่มความสามารถ Wifi บน ESP32 // บันทึกที่อยู่ MAC ในอาร์เรย์ชื่อ broadcastAddress; uint8_t broadcastAddress = {0xA4, 0xCF, 0x12, 0xC7, 0x9C, 0x77}; //ที่อยู่ MAC ของผู้รับของฉัน /*กำหนดประเภทข้อมูลของตัวแปรหลายตัวที่มีโครงสร้างและเปลี่ยนชื่อทั้งหมดเป็น struct_message*/ typedef struct struct_message { ถ่าน a [32]; int ข; ลอยค; สตริง d; บูลอี; } struct_message; // สร้าง struct_message ที่เรียกว่า myData struct_message myData; // เรียกฟังก์ชันเมื่อส่งข้อมูลเพื่อพิมพ์สถานะเป็นโมฆะ OnDataSent (const uint8_t *mac_addr สถานะ esp_now_send_status_t) { Serial.print("\r\nLast Packet Send Status:\t"); Serial.println(status == ESP_NOW_SEND_SUCCESS ? " Delivery Success": " Delivery Fail "); if(status!=ESP_NOW_SEND_SUCCESS){send_data();} } เป็นโมฆะ OnDataRecv (const uint8_t * mac, const uint8_t *incomingData, int len) { memcpy(&myData, incomingData, sizeof (myData)); Serial.print("ไบต์ที่ได้รับ: "); Serial.println (เลน); Serial.print("อักขระ: "); Serial.println (myData.a); Serial.print("Int: "); Serial.println (myData.b); Serial.print("ลอย: "); Serial.println (myData.c); Serial.print("สตริง: "); Serial.println (myData.d); Serial.print("บูล: "); Serial.println (myData.e); Serial.println(); } การตั้งค่าเป็นโมฆะ () {// กำหนดอัตรารับส่งข้อมูลสำหรับการสื่อสารแบบอนุกรมด้วย ESP Serial.begin (115200); // ตั้งค่าอุปกรณ์เป็นสถานี Wi-Fi WiFi.mode (WIFI_STA); // เริ่ม wifi // เริ่มต้น ESP-NOW และส่งคืนสถานะหาก (esp_now_init () != ESP_OK) { Serial.println ("ข้อผิดพลาดในการเริ่มต้น ESP -ตอนนี้"); กลับ; } // เรียกใช้ฟังก์ชัน OnDataSent หลังจากส่งข้อมูล ESPNOW esp_now_register_send_cb (OnDataSent); // ลงทะเบียนเพียร์ esp_now_peer_info_t peerInfo; //เริ่มต้นและกำหนดข้อมูลเพียร์เป็นตัวชี้ไปยังที่อยู่ memcpy(peerInfo.peer_addr, broadcastAddress, 6); //คัดลอกค่าของ broadcastAddress ขนาด 6 ไบต์ไปที่ peerInfo.peer_addr peerInfo.channel = 0; // ช่องที่ esp พูด 0 หมายถึงไม่ได้กำหนดและข้อมูลจะถูกส่งไปที่ช่องสัญญาณปัจจุบัน1-14 เป็นช่องสัญญาณที่ถูกต้องซึ่งเหมือนกันกับอุปกรณ์ภายในเครื่อง peerInfo.encrypt = false; //ไม่ได้เข้ารหัส //เพิ่มอุปกรณ์ในรายการอุปกรณ์ที่จับคู่ถ้า (esp_now_add_peer(&peerInfo) != ESP_OK){ Serial.println("Failed to add peer"); กลับ; } esp_now_register_recv_cb(OnDataRecv); //เรียกใช้ฟังก์ชัน OnDataRecv หลังจากได้รับข้อมูล ESPNOW send_data(); } void loop() {} void send_data(){ Serial.println("กำลังส่ง"); // ตั้งค่าเพื่อส่ง strcpy(myData.a, "THIS IS A CHAR"); // บันทึก "นี่คือ CHAR" ให้กับตัวแปร a ของ "data" ของฉันที่กำหนดไว้ก่อนหน้านี้ myData.b = สุ่ม (1, 20); //บันทึกค่าสุ่ม myData.c = 1.2; //บันทึกโฟลต myData.d = "ESP32"; //บันทึกสตริง myData.e = false; //save a bool //ส่งข้อมูลน้อยกว่าหรือเท่ากับ 250 ไบต์ผ่าน ESP-NOW และส่งคืนสถานะ esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData)); if (ผลลัพธ์ == ESP_OK) { Serial.println ("ส่งด้วยความสำเร็จ");} อื่น { Serial.println ("ข้อผิดพลาดในการส่งข้อมูล"); } }
รหัส ESP8266
//เพิ่มไลบรารี่ที่จำเป็น
#include //เพื่อเพิ่มความสามารถ Wifi บน ESP32 #include // ในการเข้าถึงฟังก์ชัน esp ตอนนี้ // บันทึกที่อยู่ MAC ในอาร์เรย์ชื่อ broadcastAddress; uint8_t broadcastAddress = {0x30, 0xAE, 0xA4, 0xF5, 0x03, 0xA4}; /*กำหนดประเภทข้อมูลของตัวแปรหลายตัวที่มีโครงสร้างและเปลี่ยนชื่อทั้งหมดเป็น struct_message*/ typedef struct struct_message { ถ่าน [32]; int ข; ลอยค; สตริง d; บูลอี; } struct_message; // สร้างตัวแปร struct_message ที่เรียกว่า myData struct_message myData; // ฟังก์ชั่นถูกเรียกเมื่อได้รับข้อมูลและพิมพ์ออกมาเป็นโมฆะ OnDataRecv (uint8_t * mac, uint8_t *incomingData, uint8_t len) { memcpy (&myData, incomingData, sizeof (myData)); Serial.print("ไบต์ที่ได้รับ: "); Serial.println (เลน); Serial.print("อักขระ: "); Serial.println (myData.a); Serial.print("Int: "); Serial.println (myData.b); Serial.print("ลอย: "); Serial.println (myData.c); Serial.print("สตริง: "); Serial.println (myData.d); Serial.print("บูล: "); Serial.println (myData.e); Serial.println(); send_data(); } โมฆะ OnDataSent (uint8_t *mac_addr, uint8_t sendStatus) { Serial.print ("\r\nLast Packet Send Status:\t"); Serial.println(sendStatus == 1 ? " Delivery Success": " Delivery Fail "); ถ้า(sendStatus !=1){ send_data(); } } ถือเป็นโมฆะ send_data(){ // ตั้งค่าเพื่อส่ง strcpy (myData.a, "นี่คือ CHAR"); // บันทึก "นี่คือ CHAR" ให้กับตัวแปร a ของ "data" ของฉันที่กำหนดไว้ก่อนหน้านี้ myData.b = สุ่ม (1, 20); //บันทึกค่าสุ่ม myData.c = 1.2; //บันทึกโฟลต myData.d = "ESP8266"; //บันทึกสตริง myData.e = false; //บันทึกบูล esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData)); } การตั้งค่าเป็นโมฆะ () {// กำหนดอัตรารับส่งข้อมูลสำหรับการสื่อสารแบบอนุกรมด้วย ESP Serial.begin (115200); // ตั้งค่าอุปกรณ์เป็นสถานี Wi-Fi WiFi.mode(WIFI_STA); // เริ่ม wifi // เริ่มต้น ESP-NOW และส่งคืนสถานะหาก (esp_now_init() != 0) { Serial.println("ข้อผิดพลาดในการเริ่มต้น ESP-NOW"); กลับ; } if (esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0)){ Serial.println("ไม่สามารถเพิ่มเพียร์"); กลับ; } esp_now_set_self_role(ESP_NOW_ROLE_COMBO); esp_now_register_send_cb (OnDataSent); esp_now_set_self_role(ESP_NOW_ROLE_COMBO); //กำหนดบทบาทของ esp นี้ esp_now_register_recv_cb(OnDataRecv); // เรียกใช้ฟังก์ชัน OnDataRecv หลังจากได้รับข้อมูล ESPNOW } void loop() {}
ขั้นตอนที่ 8: ข้อมูลอ้างอิง
ESPNOW_32_ตัวอย่าง
ESPNOW_8266 ตัวอย่าง
WIFI.h
ESP8266WiFi.h
esp_now.h สำหรับ ESP8266
esp_now.h สำหรับ ESP32
esp_now เอกสารทางการ (คำอธิบายฟังก์ชันที่ดีกว่า)
คู่มืออย่างเป็นทางการของ ESP-NOW
แนะนำ:
วิธีสร้าง Battlebot ด้วย Cardboard และ Arduino: 7 ขั้นตอน (พร้อมรูปภาพ)
วิธีสร้าง Battlebot ด้วย Cardboard และ Arduino: ฉันสร้าง battlebots โดยใช้ Arduino UNO และใช้กระดาษแข็งเพื่อสร้างร่างกาย ฉันพยายามใช้อุปกรณ์ราคาไม่แพงและให้อิสระในการสร้างสรรค์แก่เด็กๆ ในการออกแบบบอทต่อสู้ของพวกเขา Battlebot ได้รับคำสั่งจากคอนโทรลเลอร์ไร้สาย
วิธีการแฟลชหรือโปรแกรม ESP8266 AT Firmware โดยใช้ ESP8266 Flasher และ Programmer, IOT Wifi Module: 6 ขั้นตอน
วิธีการแฟลชหรือโปรแกรม ESP8266 AT Firmware โดยใช้ ESP8266 Flasher และ Programmer, IOT Wifi Module: คำอธิบาย:โมดูลนี้เป็นอะแดปเตอร์ USB / โปรแกรมเมอร์สำหรับโมดูล ESP8266 ประเภท ESP-01 หรือ ESP-01S ติดตั้งสะดวกด้วยเฮดเดอร์ตัวเมีย 2.54 มม. ขนาด 2x4P เพื่อเสียบ ESP01 นอกจากนี้ยังแยกหมุดทั้งหมดของ ESP-01 ออกผ่านช่องต่อตัวผู้ขนาด 2.54 มม. 2x4P 2.54 มม.
วิธีสร้าง Arduino Shield ง่ายมาก (โดยใช้ EasyEDA): 4 ขั้นตอน
วิธีสร้าง Arduino Shield ง่ายมาก (โดยใช้ EasyEDA): ในคำแนะนำนี้ ฉันจะสอนวิธีสร้าง Arduino Uno Shield ที่ง่ายมาก ฉันจะไม่ลงรายละเอียดมากเกินไป แต่ฉันรวมวิดีโอที่ฉัน เจาะลึกลงไปอีกเล็กน้อยเกี่ยวกับวิธีใช้ซอฟต์แวร์ ฉันใช้เว็บแอปพลิเคชัน EasyEDA เนื่องจากฉัน
ESP8266 NODEMCU BLYNK IOT บทช่วยสอน - Esp8266 IOT โดยใช้ Blunk และ Arduino IDE - การควบคุมไฟ LED ผ่านอินเทอร์เน็ต: 6 ขั้นตอน
ESP8266 NODEMCU BLYNK IOT บทช่วยสอน | Esp8266 IOT โดยใช้ Blunk และ Arduino IDE | การควบคุม LEDs ผ่านอินเทอร์เน็ต: สวัสดีทุกคนในคำแนะนำนี้ เราจะเรียนรู้วิธีใช้ IOT กับ ESP8266 หรือ Nodemcu ของเรา เราจะใช้แอป blynk สำหรับสิ่งนั้น ดังนั้นเราจะใช้ esp8266/nodemcu ของเราเพื่อควบคุมไฟ LED ผ่านอินเทอร์เน็ต ดังนั้นแอป Blynk จะเชื่อมต่อกับ esp8266 หรือ Nodemcu ของเรา
วิธีสร้าง Line Follower โดยใช้ Arduino: 8 ขั้นตอน (พร้อมรูปภาพ)
วิธีสร้าง Line Follower โดยใช้ Arduino: หากคุณกำลังเริ่มต้นกับวิทยาการหุ่นยนต์ หนึ่งในโครงการแรกที่ผู้เริ่มต้นสร้างจะมีผู้ติดตามไลน์ด้วย เป็นรถของเล่นพิเศษที่มีคุณสมบัติวิ่งตามเส้นซึ่งปกติจะมีสีดำตัดกับพื้นหลัง มาทำดาวกัน