Mục lục:

Cách thực hiện nhiều cuộc nói chuyện với ESP qua ESP-NOW bằng ESP32 và ESP8266: 8 bước
Cách thực hiện nhiều cuộc nói chuyện với ESP qua ESP-NOW bằng ESP32 và ESP8266: 8 bước

Video: Cách thực hiện nhiều cuộc nói chuyện với ESP qua ESP-NOW bằng ESP32 và ESP8266: 8 bước

Video: Cách thực hiện nhiều cuộc nói chuyện với ESP qua ESP-NOW bằng ESP32 và ESP8266: 8 bước
Video: Kết nối nhiều esp8266 qua giao thức espnow - blynk iot - Project ứng dụng IOT 2024, Tháng bảy
Anonim
Cách thực hiện nhiều cuộc nói chuyện ESP thông qua ESP-NOW bằng cách sử dụng ESP32 và ESP8266
Cách thực hiện nhiều cuộc nói chuyện ESP thông qua ESP-NOW bằng cách sử dụng ESP32 và ESP8266

Trong dự án đang diễn ra của tôi, tôi cần nhiều ESP để nói chuyện với nhau mà không cần bộ định tuyến. Để làm điều này, tôi sẽ sử dụng ESP-NOW để giao tiếp không dây với nhau mà không cần bộ định tuyến trên ESP.

Quân nhu

Những thứ tôi đã sử dụng:

Mô-đun ESP32 DEV

NODEMCU 1.0 (Mô-đun ESP12E)

Bước 1: Lấy địa chỉ Board Mac

Nhận địa chỉ máy Mac
Nhận địa chỉ máy Mac
Nhận địa chỉ máy Mac
Nhận địa chỉ máy Mac

Thông qua ESP-now, các thiết bị ESP nói chuyện với nhau bằng cách gửi dữ liệu đến địa chỉ duy nhất của chúng trong khi được kết nối với mạng điểm truy cập nội bộ được thực hiện khi sử dụng esp ngay bây giờ.. Do đó, hãy xác định địa chỉ MAC của từng thiết bị. Đính kèm là Cài đặt bảng ESP32 và ESP8266 của tôi

ĐỐI VỚI ESP32

#include "WiFi.h" // Để truy cập khả năng WIFI của ESP32

void setup () {Serial.begin (115200); Serial.print ("Địa chỉ MAC của Bảng ESP32:"); Serial.println (WiFi.macAddress ()); // in Địa chỉ MAC của nó} void loop () {}

ĐỐI VỚI ESP8266

#include // Thư viện được sử dụng để truy cập các khả năng WIFI của ESP8266

void setup () {Serial.begin (115200); Serial.println (); Serial.print ("Địa chỉ MAC của Bảng ESP8266:"); Serial.println (WiFi.macAddress ()); // in Địa chỉ MAC của nó} void loop () {}

ĐỊA CHỈ MAC của tôi là:

  • ESP32 - 30: AE: A4: F5: 03: A4
  • ESP8266: A4: CF: 12: C7: 9C: 77

Bước 2: Cách làm cho ESP-NOW hoạt động

Dưới đây là tổng quan về cách làm cho nó hoạt động:

  1. Bao gồm esp now và thư viện wifi
  2. Lưu địa chỉ mac của người nhận ESP
  3. Xác định cấu trúc dữ liệu của tin nhắn gửi / nhận
  4. Khi thiết lập, hãy đặt wifi ở chế độ đài
  5. Khởi tạo esp_now
  6. thực hiện và đăng ký chức năng gọi lại được gọi sau khi gửi và nhận dữ liệu
  7. Đối với Esp8266, hãy xác định vai trò của nó
  8. đăng ký người nhận hoặc ngang hàng
  9. Gửi dữ liệu

Bước 3: CÁC CHỨC NĂNG ĐẶC BIỆT NGAY BÂY GIỜ (ESP32)

esp_now_init (void)

Trở lại:

  • ESP_OK: thành công
  • ESP_ERR_ESPNOW_INTERNAL: Lỗi nội bộ

Sự miêu tả:

Khởi tạo chức năng ESPNOW

esp_now_register_send_cb (cb)

Lợi nhuận:

  • ESP_OK: thành công
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW không được khởi tạo
  • ESP_ERR_ESPNOW_INTERNAL: lỗi nội bộ

Thông số:

  • cb: tên hàm gọi lại sau khi gửi dữ liệu ESPNOW với các tham số này:

    • void cb (const uint8_t * mac_addr, esp_now_send_status_t status)

      • mac_addr: địa chỉ mac của người nhận
      • trạng thái:

        • 1 = thành công
        • 0 = thất bại

Sự miêu tả:

Gọi hàm OnDataSent sau khi gửi dữ liệu ESPNOW

esp_now_add_peerconst esp_now_peer_info_t * ngang hàng)

Lợi nhuận:

  • ESP_OK: thành công
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW không được khởi tạo
  • ESP_ERR_ESPNOW_ARG: đối số không hợp lệ
  • ESP_ERR_ESPNOW_FULL: danh sách ngang hàng đã đầy
  • ESP_ERR_ESPNOW_NO_MEM: hết bộ nhớ
  • ESP_ERR_ESPNOW_EXIST: ngang hàng đã tồn tại

Thông số:

  • peer: thông tin ngang hàng với dữ liệu sau:

    • uint8_t

      peer_addr [ESP_NOW_ETH_ALEN]; ESPNOW địa chỉ MAC ngang hàng cũng là địa chỉ MAC của trạm hoặc bản đồ mềm

    • uint8_t lmk [ESP_NOW_KEY_LEN]

      Khóa chính cục bộ ngang hàng ESPNOW được sử dụng để mã hóa dữ liệu

    • kênh uint8_t

      Kênh Wi-Fi ngang hàng sử dụng để gửi / nhận dữ liệu ESPNOW. Nếu giá trị là 0, hãy sử dụng kênh hiện tại mà đài hoặc bản đồ mềm đang bật. Nếu không, nó phải được đặt làm kênh mà đài hoặc bản đồ mềm đang bật

    • wifi_interface_t ifidx

      Giao diện Wi-Fi ngang hàng sử dụng để gửi / nhận dữ liệu ESPNOW

    • mã hóa bool

      ESPNOW dữ liệu mà mạng ngang hàng này gửi / nhận có được mã hóa hay không

    • void * priv

      ESPNOW dữ liệu cá nhân ngang hàng

Sự miêu tả:

Thêm một người ngang hàng vào danh sách ngang hàng

esp_now_send (const uint8_t * peer_addr, const uint8_t * data, size_t len)

Lợi nhuận:

  • ESP_OK: thành công
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW không được khởi tạo
  • ESP_ERR_ESPNOW_ARG: đối số không hợp lệ
  • ESP_ERR_ESPNOW_INTERNAL: lỗi nội bộ
  • ESP_ERR_ESPNOW_NO_MEM: hết bộ nhớ
  • ESP_ERR_ESPNOW_NOT_FOUND: không tìm thấy đồng nghiệp
  • ESP_ERR_ESPNOW_IF: giao diện WiFi hiện tại không khớp với giao diện ngang hàng

Thông số:

  • peer_addr: địa chỉ MAC ngang hàng
  • data: dữ liệu để gửi
  • len: độ dài của dữ liệu

Sự miêu tả:

Gửi dữ liệu ESPNOW. Đối với một số trường hợp, điều này xảy ra:

  • Nếu peer_addr không phải là NULL, hãy gửi dữ liệu đến ngang hàng có địa chỉ MAC khớp với peer_addr
  • Nếu peer_addr là NULL, hãy gửi dữ liệu đến tất cả các đồng nghiệp được thêm vào danh sách ngang hàng
  • Độ dài tối đa của dữ liệu phải nhỏ hơn ESP_NOW_MAX_DATA_LEN
  • Bộ đệm được trỏ đến bởi đối số dữ liệu không cần phải hợp lệ sau khi esp_now_send trả về

esp_now_register_recv_cb (cb)

Lợi nhuận:

  • ESP_OK: thành công
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW không được khởi tạo
  • ESP_ERR_ESPNOW_INTERNAL: lỗi nội bộ

Thông số:

  • cb: hàm gọi lại để nhận dữ liệu ESPNOW

    • void cb (const uint8_t * mac_addr, const uint8_t * data, int data_len)

      • mac_addr:

        địa chỉ mac của người nhận

      • *dữ liệu:

        nhận dữ liệu

      • data_len

        độ dài byte dữ liệu

Sự miêu tả:

Gọi hàm cb sau khi nhận được dữ liệu ESPNOW

Bước 4: CÁC CHỨC NĂNG ĐẶC BIỆT NGAY BÂY GIỜ (ESP8266)

MÔ TẢ CÁC CHỨC NĂNG ESP32 ESP8266

int esp_now_init (void)

Lợi nhuận:

  • 1 = thành công
  • 0 = thất bại

Sự miêu tả

Khởi tạo chức năng ESPNOW

int esp_now_set_self_role (vai trò của u8)

Thông số:

  • ESP_NOW_ROLE_IDLE: không được phép truyền dữ liệu.
  • ESP_NOW_ROLE_CONTROLLER: ưu tiên cho giao diện Sation
  • ESP_NOW_ROLE_SLAVE: ưu tiên cho giao diện SoftAP
  • ESP_NOW_ROLE_COMBO: ưu tiên cho SoftAPinterface

Sự miêu tả

Đặt vai trò của thiết bị

int esp_now_register_send_cb (cb)

Lợi nhuận:

  • 1 = thành công
  • 0 = thất bại

Thông số:

  • cb: tên hàm gọi lại sau khi gửi dữ liệu ESPNOW với các tham số này:

    • void cb (const uint8_t * mac_addr, esp_now_send_status_t status)

      • mac_addr: địa chỉ mac của người nhận
      • trạng thái:

        • 1 = thành công
        • 0 = thất bại

Sự miêu tả

Gọi hàm OnDataSent sau khi gửi dữ liệu ESPNOW

int esp_now_add_peer (u8 * mac_addr, u8 role, u8 channel, u8 * key, u8 key_len)

Lợi nhuận:

  • 1 = thành công
  • 0 = thất bại

Thông số:

  • mac_addr

    địa chỉ mac của người ngang hàng

  • vai diễn
  • kênh

    Nếu giá trị là 0, hãy sử dụng kênh hiện tại mà đài hoặc bản đồ mềm đang bật. Nếu không, nó phải được đặt làm kênh mà đài phát hoặc bản đồ mềm đang bật

  • *Chìa khóa

    chìa khóa để mã hóa

  • key_len

    độ dài của chìa khóa

Sự miêu tả:

Thêm một người ngang hàng vào danh sách ngang hàng

int esp_now_send (const uint8_t * peer_addr, const uint8_t * data, size_t len)

Lợi nhuận:

  • 1 = Thành công
  • 0 = Không thành công

Thông số:

  • peer_addr: địa chỉ MAC ngang hàng
  • data: dữ liệu để gửi
  • len: độ dài của dữ liệu

Sự miêu tả:

Gửi dữ liệu ESPNOW. Đối với một số trường hợp, điều này xảy ra:

  • Nếu peer_addr không phải là NULL, hãy gửi dữ liệu đến ngang hàng có địa chỉ MAC khớp với peer_addr
  • Nếu peer_addr là NULL, hãy gửi dữ liệu đến tất cả các đồng nghiệp được thêm vào danh sách ngang hàng
  • Độ dài tối đa của dữ liệu phải nhỏ hơn ESP_NOW_MAX_DATA_LEN
  • Bộ đệm được trỏ đến bởi đối số dữ liệu không cần phải hợp lệ sau khi esp_now_send trả về

int esp_now_register_recv_cb (cb)

Lợi nhuận:

  • 1 = Thành công
  • 0 = Không thành công

Thông số:

  • cb: hàm gọi lại để nhận dữ liệu ESPNOW

    • void cb (const uint8_t * mac_addr, const uint8_t * data, int data_len)

      • mac_addr:

        địa chỉ mac của người nhận

      • *dữ liệu:

        nhận dữ liệu

      • data_len

        độ dài byte dữ liệu

Sự miêu tả:

Gọi hàm cb sau khi nhận được dữ liệu ESPNOW

Bước 5: Giao tiếp một chiều (ESP32 với tư cách là người gửi)

ESP32 gửi dữ liệu đến ESP8266. với mã này. Thay đổi địa chỉ quảng bá thành địa chỉ mac máy thu tương ứng của bạn. Của tôi là A4: CF: 12: C7: 9C: 77

// Thêm các thư viện cần thiết

#include // Để truy cập các chức năng esp now #include // Để Thêm Khả năng Wifi trên ESP32 // lưu Địa chỉ MAC trong một mảng có tên broadcastAddress; uint8_t broadcastAddress = {0xA4, 0xCF, 0x12, 0xC7, 0x9C, 0x77}; // Địa chỉ MAC của máy thu của tôi / * xác định kiểu dữ liệu của nhiều biến có cấu trúc và đổi tên tất cả thành struct_message * / typedef struct struct_message {char a [32]; int b; phao c; Chuỗi d; bool e; } struct_message; // Tạo một struct_message gọi là myData struct_message myData; // hàm được gọi khi dữ liệu được gửi để in trạng thái của nó void OnDataSent (const uint8_t * mac_addr, esp_now_send_status_t status) {Serial.print ("\ r / nLast Packet Send Status: / t"); Serial.println (status == ESP_NOW_SEND_SUCCESS? "Delivery Success": "Delivery Fail"); } void setup () {// Đặt tốc độ truyền cho giao tiếp nối tiếp với ESP Serial.begin (115200); // Đặt thiết bị làm Wi-Fi Trạm WiFi.mode (WIFI_STA); // Khởi động wifi // Init ESP-NOW và trả về trạng thái của nó if (esp_now_init ()! = ESP_OK) {Serial.println ("Lỗi khi khởi tạo ESP -HIỆN NAY"); trở lại; } // gọi hàm OnDataSent sau khi gửi dữ liệu ESPNOW esp_now_register_send_cb (OnDataSent); // Đăng ký peer esp_now_peer_info_t peerInfo; // khởi tạo và gán thông tin ngang hàng dưới dạng con trỏ tới memcpy addres (peerInfo.peer_addr, broadcastAddress, 6); // sao chép giá trị của broadcastAddress với 6 byte vào peerInfo.peer_addr peerInfo.channel = 0; // kênh mà tại đó nói chuyện đặc biệt. 0 có nghĩa là không xác định và dữ liệu sẽ được gửi trên kênh hiện tại. 1-14 là các kênh hợp lệ giống với thiết bị cục bộ peerInfo.encrypt = false; // không được mã hóa // Thêm thiết bị vào danh sách thiết bị được ghép nối if (esp_now_add_peer (& peerInfo)! = ESP_OK) {Serial.println ("Không thêm được thiết bị ngang hàng"); trở lại; }} void loop () {// Đặt giá trị để gửi strcpy (myData.a, "ĐÂY LÀ CHAR"); // lưu "ĐÂY LÀ CHAR" vào biến a trong số "dữ liệu" của tôi được định nghĩa trước đó myData.b = random (1, 20); // lưu một giá trị ngẫu nhiên myData.c = 1.2; // lưu một float myData.d = "Xin chào"; // lưu một chuỗi myData.e = false; // lưu bool // Gửi dữ liệu nhỏ hơn hoặc bằng 250 byte qua ESP-NOW và trả về trạng thái esp_err_t result = esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); if (result == ESP_OK) {Serial.println ("Đã gửi thành công"); } else {Serial.println ("Lỗi khi gửi dữ liệu"); } trì hoãn (2000); }

ESP8266 nhận dữ liệu từ ESP32 bằng cách sử dụng mã này.

// Thêm các thư viện cần thiết

#include // Để thêm khả năng phát Wifi trên ESP32 #include // Để truy cập các hàm esp now / * xác định kiểu dữ liệu của nhiều biến được cấu trúc và đổi tên tất cả thành struct_message * / typedef struct struct_message {char a [32]; int b; phao c; Chuỗi d; bool e; } struct_message; // Tạo một biến struct_message có tên myData struct_message myData; // hàm được gọi khi dữ liệu được nhận và in ra void OnDataRecv (uint8_t * mac, uint8_t * incomingData, uint8_t len) {memcpy (& myData, incomingData, sizeof (myData)); Serial.print ("Số byte nhận được:"); Serial.println (len); Serial.print ("Char:"); Serial.println (myData.a); Serial.print ("Int:"); Serial.println (myData.b); Serial.print ("Float:"); Serial.println (myData.c); Serial.print ("Chuỗi:"); Serial.println (myData.d); Serial.print ("Bool:"); Serial.println (myData.e); Serial.println (); } void setup () {// Đặt tốc độ truyền cho giao tiếp nối tiếp với ESP Serial.begin (115200); // Đặt thiết bị làm Wi-Fi Trạm WiFi.mode (WIFI_STA); // Khởi động wifi // Init ESP-NOW và trả về trạng thái if (esp_now_init ()! = 0) {Serial.println ("Lỗi khi khởi tạo ESP-NOW"); trở lại; } esp_now_set_self_role (ESP_NOW_ROLE_SLAVE); // Xác định vai trò của esp esp_now_register_recv_cb (OnDataRecv); // gọi hàm OnDataRecv sau khi nhận dữ liệu ESPNOW} void loop () {}

Bước 6: Giao tiếp một chiều (ESP8266 với tư cách là người gửi)

ESP8266 gửi dữ liệu đến ESP32. với mã này. Thay đổi địa chỉ quảng bá thành địa chỉ mac người nhận tương ứng của bạn. Địa chỉ esp32 của tôi là 30: AE: A4: F5: 03: A4. Để biết các chức năng khác của esp8266, hãy vào đây

// Thêm các thư viện cần thiết

#include // Để Thêm Khả năng Wifi trên ESP32 #include // Để truy cập các chức năng esp now // lưu Địa chỉ MAC trong một mảng có tên broadcastAddress; uint8_t broadcastAddress = {0x30, 0xAE, 0xA4, 0xF5, 0x03, 0xA4}; / * xác định kiểu dữ liệu của nhiều biến có cấu trúc và đổi tên tất cả chúng thành struct_message * / typedef struct struct_message {char a [32]; int b; phao c; Chuỗi d; bool e; } struct_message; // Tạo một biến có cấu trúc gọi là myData struct_message myData; // hàm được gọi khi dữ liệu được gửi và in trạng thái của nó void OnDataSent (uint8_t * mac_addr, uint8_t sendStatus) {Serial.print ("\ r / nLast Packet Send Status: / t"); Serial.println (sendStatus == 1? "Delivery Success": "Delivery Fail"); } void setup () {// Đặt tốc độ truyền cho giao tiếp nối tiếp với ESP Serial.begin (115200); // Đặt thiết bị làm Wi-Fi Trạm WiFi.mode (WIFI_STA); // Khởi động wifi // Init ESP-NOW và trả về trạng thái của nó if (esp_now_init ()) {Serial.println ("Lỗi khi khởi tạo ESP-NOW"); trở lại; } esp_now_register_send_cb (OnDataSent); // gọi hàm OnDataSent sau khi gửi dữ liệu ESPNOW // Thêm thiết bị vào danh sách thiết bị được ghép nối if (esp_now_add_peer (broadcastAddress, ESP_NOW_ROLE_CONTROLLER, 1, NULL, 0)) {Serial.println ("Không thêm được ngang hàng"); trở lại; }} void loop () {// Đặt giá trị để gửi strcpy (myData.a, "ĐÂY LÀ CHAR"); // lưu "ĐÂY LÀ CHAR" vào biến a trong số "dữ liệu" của tôi được định nghĩa trước đó myData.b = random (1, 20); // lưu một giá trị ngẫu nhiên myData.c = 1.2; // lưu một float myData.d = "SP8266"; // lưu một chuỗi myData.e = false; // lưu bool // Gửi dữ liệu nhỏ hơn hoặc bằng 250 byte qua ESP-NOW và trả về trạng thái của nó int result = esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); if (esp_now_init ()! = 0) {Serial.println ("Đã gửi thành công"); } else {Serial.println ("Lỗi khi gửi dữ liệu"); } trì hoãn (2000); }

ESP32 nhận dữ liệu từ ESP8266. với mã này. Các chức năng khác tham khảo tại đây

// Thêm các thư viện cần thiết

#include // Để truy cập các chức năng esp now #include // Để Thêm Khả năng Wifi trên ESP32 / * xác định kiểu dữ liệu của nhiều biến được cấu trúc và đổi tên tất cả thành struct_message * / typedef struct struct_message {char a [32]; int b; phao c; Chuỗi d; bool e; } struct_message; // Tạo một biến struct_message có tên myData struct_message myData; // hàm được gọi khi dữ liệu được nhận và in ra void OnDataRecv (const uint8_t * mac, const uint8_t * incomingData, int len) {memcpy (& myData, incomingData, sizeof (myData)); Serial.print ("Số byte nhận được:"); Serial.println (len); Serial.print ("Char:"); Serial.println (myData.a); Serial.print ("Int:"); Serial.println (myData.b); Serial.print ("Float:"); Serial.println (myData.c); Serial.print ("Chuỗi:"); Serial.println (myData.d); Serial.print ("Bool:"); Serial.println (myData.e); Serial.println (); } void setup () {// Đặt tốc độ truyền cho giao tiếp nối tiếp với ESP Serial.begin (115200); // Đặt thiết bị làm Wi-Fi Trạm WiFi.mode (WIFI_STA); // Khởi động wifi // Init ESP-NOW và trả về trạng thái if (esp_now_init ()! = 0) {Serial.println ("Lỗi khi khởi tạo ESP-NOW"); trở lại; } esp_now_register_recv_cb (OnDataRecv); // gọi hàm OnDataRecv sau khi nhận dữ liệu ESPNOW} void loop () {}

Bước 7: GIAO TIẾP HAI CÁCH

GIAO TIẾP HAI CHIỀU
GIAO TIẾP HAI CHIỀU
GIAO TIẾP HAI CHIỀU
GIAO TIẾP HAI CHIỀU

ESP32 gửi dữ liệu khi khởi động tới ESP8266. ESP8266 in thông báo đã nhận và sau đó trả lời mà ESP32 in trên màn hình nối tiếp của nó.

MÃ ESP32

// Thêm các thư viện cần thiết

#include // Để truy cập các chức năng esp now #include // Để Thêm Khả năng Wifi trên ESP32 // lưu Địa chỉ MAC trong một mảng có tên broadcastAddress; uint8_t broadcastAddress = {0xA4, 0xCF, 0x12, 0xC7, 0x9C, 0x77}; // Địa chỉ MAC của máy thu của tôi / * xác định kiểu dữ liệu của nhiều biến có cấu trúc và đổi tên tất cả thành struct_message * / typedef struct struct_message {char a [32]; int b; phao c; Chuỗi d; bool e; } struct_message; // Tạo một struct_message gọi là myData struct_message myData; // hàm được gọi khi dữ liệu được gửi để in trạng thái của nó void OnDataSent (const uint8_t * mac_addr, esp_now_send_status_t status) {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 ();}} void OnDataRecv (const uint8_t * mac, const uint8_t * incomingData, int len) {memcpy (& myData, incomingData, sizeof (myData)); Serial.print ("Số byte nhận được:"); Serial.println (len); Serial.print ("Char:"); Serial.println (myData.a); Serial.print ("Int:"); Serial.println (myData.b); Serial.print ("Float:"); Serial.println (myData.c); Serial.print ("Chuỗi:"); Serial.println (myData.d); Serial.print ("Bool:"); Serial.println (myData.e); Serial.println (); } void setup () {// Đặt tốc độ truyền cho giao tiếp nối tiếp với ESP Serial.begin (115200); // Đặt thiết bị làm Wi-Fi Trạm WiFi.mode (WIFI_STA); // Khởi động wifi // Init ESP-NOW và trả về trạng thái của nó if (esp_now_init ()! = ESP_OK) {Serial.println ("Lỗi khi khởi tạo ESP -HIỆN NAY"); trở lại; } // gọi hàm OnDataSent sau khi gửi dữ liệu ESPNOW esp_now_register_send_cb (OnDataSent); // Đăng ký peer esp_now_peer_info_t peerInfo; // khởi tạo và gán thông tin ngang hàng dưới dạng con trỏ tới memcpy addres (peerInfo.peer_addr, broadcastAddress, 6); // sao chép giá trị của broadcastAddress với 6 byte vào peerInfo.peer_addr peerInfo.channel = 0; // kênh mà tại đó nói chuyện đặc biệt. 0 có nghĩa là không xác định và dữ liệu sẽ được gửi trên kênh hiện tại.1-14 là các kênh hợp lệ giống với thiết bị cục bộ peerInfo.encrypt = false; // không được mã hóa // Thêm thiết bị vào danh sách thiết bị được ghép nối if (esp_now_add_peer (& peerInfo)! = ESP_OK) {Serial.println ("Không thêm được thiết bị ngang hàng"); trở lại; } esp_now_register_recv_cb (OnDataRecv); // gọi hàm OnDataRecv sau khi nhận dữ liệu ESPNOW send_data (); } void loop () {} void send_data () {Serial.println ("Đang gửi"); // Đặt giá trị để gửi strcpy (myData.a, "ĐÂY LÀ CHAR"); // lưu "ĐÂY LÀ CHAR" vào biến a trong số "dữ liệu" của tôi được định nghĩa trước đó myData.b = random (1, 20); // lưu một giá trị ngẫu nhiên myData.c = 1.2; // lưu một float myData.d = "ESP32"; // lưu một chuỗi myData.e = false; // lưu bool // Gửi dữ liệu nhỏ hơn hoặc bằng 250 byte qua ESP-NOW và trả về trạng thái esp_err_t result = esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); if (result == ESP_OK) {Serial.println ("Đã gửi thành công");} else {Serial.println ("Lỗi khi gửi dữ liệu"); }}

MÃ ESP8266

// Thêm các thư viện cần thiết

#include // Để Thêm Khả năng Wifi trên ESP32 #include // Để truy cập các chức năng esp now // lưu Địa chỉ MAC trong một mảng có tên broadcastAddress; uint8_t broadcastAddress = {0x30, 0xAE, 0xA4, 0xF5, 0x03, 0xA4}; / * xác định kiểu dữ liệu của nhiều biến có cấu trúc và đổi tên tất cả chúng thành struct_message * / typedef struct struct_message {char a [32]; int b; phao c; Chuỗi d; bool e; } struct_message; // Tạo một biến struct_message có tên myData struct_message myData; // hàm được gọi khi dữ liệu được nhận và in ra void OnDataRecv (uint8_t * mac, uint8_t * incomingData, uint8_t len) {memcpy (& myData, incomingData, sizeof (myData)); Serial.print ("Số byte nhận được:"); Serial.println (len); Serial.print ("Char:"); Serial.println (myData.a); Serial.print ("Int:"); Serial.println (myData.b); Serial.print ("Float:"); Serial.println (myData.c); Serial.print ("Chuỗi:"); Serial.println (myData.d); Serial.print ("Bool:"); Serial.println (myData.e); Serial.println (); gửi dữ liệu(); } void OnDataSent (uint8_t * mac_addr, uint8_t sendStatus) {Serial.print ("\ r / nTrạng thái Gửi Gói Cuối cùng: / t"); Serial.println (sendStatus == 1? "Delivery Success": "Delivery Fail"); if (sendStatus! = 1) {send_data (); }} void send_data () {// Đặt giá trị để gửi strcpy (myData.a, "ĐÂY LÀ CHAR"); // lưu "ĐÂY LÀ CHAR" vào biến a trong số "dữ liệu" của tôi được định nghĩa trước đó myData.b = random (1, 20); // lưu một giá trị ngẫu nhiên myData.c = 1.2; // lưu một float myData.d = "ESP8266"; // lưu một chuỗi myData.e = false; // lưu bool esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); } void setup () {// Đặt tốc độ truyền cho giao tiếp nối tiếp với ESP Serial.begin (115200); // Đặt thiết bị làm Wi-Fi Trạm WiFi.mode (WIFI_STA); // Khởi động wifi // Init ESP-NOW và trả về trạng thái if (esp_now_init ()! = 0) {Serial.println ("Lỗi khi khởi tạo ESP-NOW"); trở lại; } if (esp_now_add_peer (broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0)) {Serial.println ("Không thêm được ngang hàng"); trở lại; } esp_now_set_self_role (ESP_NOW_ROLE_COMBO); esp_now_register_send_cb (OnDataSent); esp_now_set_self_role (ESP_NOW_ROLE_COMBO); // Xác định vai trò của esp esp_now_register_recv_cb (OnDataRecv); // gọi hàm OnDataRecv sau khi nhận dữ liệu ESPNOW} void loop () {}

Bước 8: TÀI LIỆU THAM KHẢO

ESPNOW_32_Example

Ví dụ về ESPNOW_8266

WIFI.h

ESP8266WiFi.h

esp_now.h cho ESP8266

esp_now.h cho ESP32

tài liệu chính thức esp_now (Giải thích tốt hơn về các chức năng)

Hướng dẫn chính thức của ESP-NOW

Đề xuất: