สารบัญ:

วิธีสร้าง ESP Talk หลายรายการผ่าน ESP-NOW โดยใช้ ESP32 และ ESP8266: 8 ขั้นตอน
วิธีสร้าง ESP Talk หลายรายการผ่าน ESP-NOW โดยใช้ ESP32 และ ESP8266: 8 ขั้นตอน

วีดีโอ: วิธีสร้าง ESP Talk หลายรายการผ่าน ESP-NOW โดยใช้ ESP32 และ ESP8266: 8 ขั้นตอน

วีดีโอ: วิธีสร้าง ESP Talk หลายรายการผ่าน ESP-NOW โดยใช้ ESP32 และ ESP8266: 8 ขั้นตอน
วีดีโอ: ESPNOW as simple as possible | Getting Started, Range test & much more.. 2024, พฤศจิกายน
Anonim
วิธีสร้าง ESP Talk หลายรายการผ่าน ESP-NOW โดยใช้ ESP32 และ ESP8266
วิธีสร้าง ESP Talk หลายรายการผ่าน ESP-NOW โดยใช้ ESP32 และ ESP8266

ในโครงการที่กำลังดำเนินการอยู่ ฉันต้องการ ESP หลายตัวเพื่อพูดคุยกันโดยไม่ต้องใช้เราเตอร์ ในการทำเช่นนี้ ฉันจะใช้ ESP-NOW เพื่อทำการสื่อสารแบบไร้สายระหว่างกันโดยไม่ต้องใช้เราเตอร์บน ESP

เสบียง

สิ่งที่ฉันใช้:

โมดูล ESP32 DEV

NODEMCU 1.0 (โมดูล ESP12E)

ขั้นตอนที่ 1: รับที่อยู่ Mac ของบอร์ด

รับที่อยู่ Mac ของบอร์ด
รับที่อยู่ Mac ของบอร์ด
รับที่อยู่ Mac ของบอร์ด
รับที่อยู่ 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 ทำงาน

นี่คือภาพรวมเกี่ยวกับวิธีการทำงาน:

  1. รวม esp ทันทีและไลบรารี wifi
  2. บันทึกที่อยู่ Mac ของผู้รับESP
  3. กำหนดโครงสร้างข้อมูลของข้อความส่ง/รับ
  4. ในการตั้งค่า ให้ตั้งค่า wifi เป็นโหมดสถานี
  5. เริ่มต้น esp_now
  6. ทำและลงทะเบียนฟังก์ชั่นโทรกลับที่เรียกหลังจากส่งและรับข้อมูล
  7. สำหรับ Esp8266 ให้กำหนดบทบาท
  8. ลงทะเบียนเพียร์หรือผู้รับ esp
  9. ส่งข้อมูล

ขั้นตอนที่ 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

แนะนำ: