Mục lục:
- Quân nhu
- Bước 1: Lấy địa chỉ Board Mac
- Bước 2: Cách làm cho ESP-NOW hoạt động
- Bước 3: CÁC CHỨC NĂNG ĐẶC BIỆT NGAY BÂY GIỜ (ESP32)
- Bước 4: CÁC CHỨC NĂNG ĐẶC BIỆT NGAY BÂY GIỜ (ESP8266)
- Bước 5: Giao tiếp một chiều (ESP32 với tư cách là người gửi)
- Bước 6: Giao tiếp một chiều (ESP8266 với tư cách là người gửi)
- Bước 7: GIAO TIẾP HAI CÁCH
- Bước 8: TÀI LIỆU THAM KHẢO
2025 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2025-01-23 15:15
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
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:
- Bao gồm esp now và thư viện wifi
- Lưu địa chỉ mac của người nhận ESP
- Xác định cấu trúc dữ liệu của tin nhắn gửi / nhận
- Khi thiết lập, hãy đặt wifi ở chế độ đài
- Khởi tạo esp_now
- 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
- Đối với Esp8266, hãy xác định vai trò của nó
- đăng ký người nhận hoặc ngang hàng
- 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
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:
Tự làm cách hiển thị thời gian trên M5StickC ESP32 bằng Visuino - Dễ thực hiện: 9 bước
Tự làm cách hiển thị thời gian trên M5StickC ESP32 bằng Visuino - Dễ thực hiện: Trong hướng dẫn này, chúng ta sẽ học cách lập trình ESP32 M5Stack StickC với Arduino IDE và Visuino để hiển thị thời gian trên màn hình LCD
M5STACK Cách hiển thị nhiệt độ, độ ẩm và áp suất trên M5StickC ESP32 bằng Visuino - Dễ thực hiện: 6 bước
M5STACK Cách hiển thị nhiệt độ, độ ẩm và áp suất trên M5StickC ESP32 bằng Visuino - Dễ thực hiện: Trong hướng dẫn này, chúng ta sẽ học cách lập trình ESP32 M5Stack StickC với Arduino IDE và Visuino để hiển thị nhiệt độ, độ ẩm và áp suất bằng cảm biến ENV (DHT12, BMP280, BMM150)
Cách thực hiện cuộc gọi với Arduino - CoolPhone 1/2: 5 bước
Cách thực hiện cuộc gọi với Arduino - CoolPhone 1/2: Nokia n97 - Nó có lẽ là điện thoại di động đầu tiên của tôi. Tôi sử dụng nó để nghe nhạc và đôi khi chụp ảnh, nhưng chủ yếu là để gọi điện. Tôi quyết định tạo ra một chiếc điện thoại chỉ dùng để gọi và nhận cuộc gọi. Nó sẽ là một
Tặng quà cho cuộc sống đầu tiên trong cuộc sống thứ hai bằng Amazon.com: 9 bước
Tặng quà cho cuộc sống đầu tiên trong cuộc sống thứ hai Sử dụng Amazon.com: Trong thế giới ảo Cuộc sống thứ hai, thật dễ dàng để hình thành tình bạn rất thân thiết với một người mà bạn có thể không bao giờ có cơ hội gặp trực tiếp. Cư dân của Cuộc sống thứ hai kỷ niệm các ngày lễ của Cuộc sống đầu tiên như Ngày lễ tình nhân và Giáng sinh cũng như
Cách thực hiện cuộc gọi điện thoại miễn phí bằng Skype.: 4 bước
Cách thực hiện cuộc gọi điện thoại miễn phí bằng Skype. Nó từng là điều tuyệt vời nhất trên thế giới khi thực hiện các cuộc gọi đường dài miễn phí từ bất kỳ đồng