תוכן עניינים:
- אספקה
- שלב 1: קבל את כתובת ה- Mac של הלוח
- שלב 2: כיצד לגרום ל- ESP-NOW לעבוד
- שלב 3: פונקציות ESP-NOW (ESP32)
- שלב 4: פונקציות ESP-NOW (ESP8266)
- שלב 5: תקשורת בכיוון אחד (ESP32 כשולח)
- שלב 6: תקשורת בכיוון אחד (ESP8266 כשולח)
- שלב 7: תקשורת דו -כיוונית
- שלב 8: הפניות
וִידֵאוֹ: כיצד לבצע שיחות ESP מרובות באמצעות ESP-NOW באמצעות ESP32 ו- ESP8266: 8 שלבים
2024 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2024-01-30 09:13
בפרויקט המתמשך שלי, אני צריך מספר ESP כדי לדבר אחד עם השני בלי נתב. לשם כך אשתמש ב- ESP-NOW כדי ליצור תקשורת אלחוטית זה עם זה ללא נתב ב- ESP.
אספקה
דברים שהשתמשתי בהם:
מודול ESP32 DEV
NODEMCU 1.0 (מודול ESP12E)
שלב 1: קבל את כתובת ה- Mac של הלוח
באמצעות ESP-now, מכשירי ESP מדברים זה עם זה על ידי שליחת נתונים לכתובת הייחודית שלהם כשהם מחוברים לרשת נקודות גישה פנימית שנעשתה לאחר האינטליזציה של ה- esp כעת.. לפיכך, קבע את כתובת ה- MAC של כל התקן. מצורפת הגדרות לוח ESP32 ו- ESP8266 שלי
עבור ESP32
#כלול "WiFi.h" // לגישה ליכולות WIFI של ESP32
הגדרת חלל () {Serial.begin (115200); Serial.print ("כתובת MAC של לוח ESP32:"); Serial.println (WiFi.macAddress ()); // מדפיס את כתובת ה- MAC שלו} לולאת הריק () {}
עבור ESP8266
#include // ספרייה המשמשת לגישה ליכולות ה- WIFI של ESP8266
הגדרת חלל () {Serial.begin (115200); Serial.println (); Serial.print ("כתובת MAC של לוח ESP8266 לוח:"); Serial.println (WiFi.macAddress ()); // מדפיס את כתובת ה- MAC שלו} לולאת הריק () {}
כתובת ה- 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, הגדר את תפקידו
- רשום את העמית או הנמען, במיוחד
- לשלוח נתונים
שלב 3: פונקציות ESP-NOW (ESP32)
esp_now_init (void)
לַחֲזוֹר:
- 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 עם פרמטרים אלה:
-
void cb (const uint8_t *mac_addr, esp_now_send_status_t status)
- 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: עמית קיים
פרמטרים:
-
מידע עמית: עמית עם הנתונים הבאים:
-
uint8_t
peer_addr [ESP_NOW_ETH_ALEN]; ESPNOW peer MAC כתובת שהיא גם כתובת ה- MAC של התחנה או softap
-
uint8_t lmk [ESP_NOW_KEY_LEN]
מפתח מאסטר מקומי עמית ESPNOW המשמש להצפנת נתונים
-
ערוץ uint8_t
ערוץ Wi-Fi שעמית משתמש בו כדי לשלוח/לקבל נתוני ESPNOW. אם הערך הוא 0, השתמש בערוץ הנוכחי שעליו נמצאת התחנה או הסמכה. אחרת, יש להגדיר אותו כערוץ בו נמצאת התחנה או התוכנה הרכה
-
wifi_interface_t ifidx
ממשק Wi-Fi שעמית משתמש בו לשליחת/קבלת נתוני ESPNOW
-
להצפין
נתוני ESPNOW שהעמית הזה שולח/מקבל מוצפנים או לא
-
void *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 של peer
- נתונים: נתונים לשלוח
- len: אורך הנתונים
תיאור:
שלח נתוני ESPNOW. במקרים מסוימים זה קורה:
- אם peer_addr אינו NULL, שלח נתונים לעמית שכתובת ה- MAC שלו תואמת peer_addr
- אם peer_addr הוא NULL, שלח נתונים לכל העמיתים המתווספים לרשימת העמיתים
- אורך הנתונים המרבי חייב להיות קטן מ- ESP_NOW_MAX_DATA_LEN
- המאגר שאליו מטען ארגומנט הנתונים אינו צריך להיות תקף לאחר החזרה של esp_now_send
esp_now_register_recv_cb (cb)
החזרות:
- ESP_OK: להצליח
- ESP_ERR_ESPNOW_NOT_INIT: ESPNOW אינו מאתחל
- ESP_ERR_ESPNOW_INTERNAL: שגיאה פנימית
פרמטרים:
-
cb: פונקציית החזרה לקבלת נתונים של ESPNOW
-
void 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 (void)
החזרות:
- 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: עדיפות ניתנת לממשק SoftAP
תיאור
מגדיר את תפקיד המכשיר
int esp_now_register_send_cb (cb)
החזרות:
- 1 = הצלחה
- 0 = נכשל
פרמטרים:
-
cb: שם פונקציית החזרה לאחר שליחת נתוני ESPNOW עם פרמטרים אלה:
-
void cb (const uint8_t *mac_addr, esp_now_send_status_t status)
- 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, השתמש בערוץ הנוכחי שעליו נמצאת התחנה או הסמכה. אחרת, יש להגדיר אותו כערוץ בו נמצאת התחנה או התוכנה הרכה
-
*מַפְתֵחַ
מפתח להצפנה
-
key_len
אורך המפתח
תיאור:
הוסף רשימת עמיתים לעמיתים
int esp_now_send (const uint8_t *peer_addr, const uint8_t *data, size_t len)
החזרות:
- 1 = הצלחה
- 0 = נכשל
פרמטרים:
- peer_addr: כתובת MAC של peer
- נתונים: נתונים לשלוח
- len: אורך הנתונים
תיאור:
שלח נתוני ESPNOW. במקרים מסוימים זה קורה:
- אם peer_addr אינו NULL, שלח נתונים לעמית שכתובת ה- MAC שלו תואמת peer_addr
- אם peer_addr הוא NULL, שלח נתונים לכל העמיתים המתווספים לרשימת העמיתים
- אורך הנתונים המרבי חייב להיות קטן מ- ESP_NOW_MAX_DATA_LEN
- המאגר שאליו מטען ארגומנט הנתונים אינו צריך להיות תקף לאחר החזרה של esp_now_send
int esp_now_register_recv_cb (cb)
החזרות:
- 1 = הצלחה
- 0 = נכשל
פרמטרים:
-
cb: פונקציית החזרה לקבלת מידע ESPNOW
-
void 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 now #include // להוספת יכולות Wifi ב- ESP32 // שמור את כתובת ה- MAC במערך בשם broadcastAddress; uint8_t broadcastAddress = {0xA4, 0xCF, 0x12, 0xC7, 0x9C, 0x77}; // כתובת MAC של המקלט שלי/*הגדירו את סוגי הנתונים של המשתנים המרובים שנבנו ושנו את כולם כ- struct_message*/typedef struct struct_message {char a [32]; int b; לצוף ג; מחרוזת d; בול ה; } struct_message; // צור struct_message בשם myData struct_message myData; // פונקציה נקראת כאשר הנתונים נשלחים להדפסת חלל הסטטוס שלה OnDataSent (const uint8_t *mac_addr, esp_now_send_status_t status) {Serial.print ("\ r / n מצב שליחת מנות אחרונות: / t"); Serial.println (status == ESP_NOW_SEND_SUCCESS? "הצלחת מסירה": "כשל במשלוח"); } הגדרת void () {// הגדר את קצב השידור לתקשורת טורית עם ESP Serial.begin (115200); // הגדר את המכשיר כתחנת Wi-Fi WiFi.mode (WIFI_STA); // מפעיל את ה- wifi // Init 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 addres (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 ("נכשל הוספת עמית"); לַחֲזוֹר; }} void loop () {// הגדר ערכים לשליחת strcpy (myData.a, "THIS IS A CHAR"); // שמור "THIS IS A CHAR" למשתנה a מה"נתונים "שלי שהוגדרו קודם myData.b = אקראי (1, 20); // שמור ערך אקראי myData.c = 1.2; // save a float myData.d = "שלום"; // שמור מחרוזת myData.e = false; // שמור בול // שלח נתונים הנמוכים מ -250 בתים או שווים באמצעות ESP-NOW ומחזיר את הסטטוס שלו esp_err_t result = esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); if (result == ESP_OK) {Serial.println ("נשלח בהצלחה"); } else {Serial.println ("שגיאה בשליחת הנתונים"); } עיכוב (2000); }
ה- ESP8266 מקבל נתונים מה- ESP32 באמצעות קוד זה.
// הוסף ספריות נחוצות
#include // להוספת יכולות Wifi ב- ESP32 #include // כדי לגשת לפונקציות esp now /*הגדירו את סוגי הנתונים של המשתנים המרובים שנבנו ושנו את כולם כ- struct_message* /typedef struct struct_message {char a [32]; int b; לצוף ג; מחרוזת 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 (len); Serial.print ("Char:"); Serial.println (myData.a); Serial.print ("Int:"); Serial.println (myData.b); Serial.print ("Float:"); Serial.println (myData.c); Serial.print ("מחרוזת:"); Serial.println (myData.d); Serial.print ("בוור:"); Serial.println (myData.e); Serial.println (); } הגדרת void () {// הגדר את קצב השידור לתקשורת טורית עם ESP Serial.begin (115200); // הגדר את המכשיר כמצב WiFi.mode (WIFI_STA); // מפעיל את ה- wifi // Init 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} לולאת חלל () {}
שלב 6: תקשורת בכיוון אחד (ESP8266 כשולח)
ה- ESP8266 שולח נתונים ל- ESP32. עם הקוד הזה. שנה את broadcastAddress לכתובת ה- mac המקבלת שלך. כתובת esp32 שלי היא 30: AE: A4: F5: 03: A4. לפונקציות אחרות עבור esp8266 עבור לכאן
// הוסף ספריות נחוצות
#include // להוספת יכולות Wifi ב- ESP32 #include // כדי לגשת לפונקציות esp now // שמור את כתובת ה- MAC במערך בשם broadcastAddress; uint8_t broadcastAddress = {0x30, 0xAE, 0xA4, 0xF5, 0x03, 0xA4}; /*הגדירו את סוגי הנתונים של המשתנים המרובים המובנים ושנו את שמו כ- struct_message*/ typedef struct struct_message {char a [32]; int b; לצוף ג; מחרוזת d; בול ה; } struct_message; // צור משתנה מובנה בשם myData struct_message myData; // פונקציה נקראת כאשר הנתונים נשלחים והדפיס את חלל הסטטוס שלה OnDataSent (uint8_t *mac_addr, uint8_t sendStatus) {Serial.print ("\ r / n מצב שליחת מנות אחרונות: / t"); Serial.println (sendStatus == 1? "הצלחה במסירה": "אספקה נכשלה"); } הגדרת void () {// הגדר את קצב השידור לתקשורת טורית עם ESP Serial.begin (115200); // הגדר את המכשיר כמצב WiFi.mode (WIFI_STA); // מפעיל את ה- wifi // Init 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 ("נכשל הוספת עמית"); לַחֲזוֹר; }} void loop () {// הגדר ערכים לשליחת strcpy (myData.a, "THIS IS A CHAR"); // שמור "THIS IS A CHAR" למשתנה a מה"נתונים "שלי שהוגדרו קודם myData.b = אקראי (1, 20); // שמור ערך אקראי myData.c = 1.2; // שמור מצוף myData.d = "SP8266"; // שמור מחרוזת myData.e = false; // שמור בול // שלח נתונים פחות או שווה ל -250 בתים באמצעות ESP-NOW ומחזיר את הסטטוס int int = esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); if (esp_now_init ()! = 0) {Serial.println ("נשלח בהצלחה"); } else {Serial.println ("שגיאה בשליחת הנתונים"); } עיכוב (2000); }
ה- ESP32 מקבל נתונים מ- ESP8266. עם הקוד הזה. לפונקציות אחרות עיין כאן
// הוסף ספריות נחוצות
#include // כדי לגשת לפונקציות esp now #include // להוספת יכולות Wifi ב- ESP32 /*הגדירו את סוגי הנתונים של המשתנים המרובים שנבנו ושנו את כולם כ- struct_message* /typedef struct struct_message {char a [32]; int b; לצוף ג; מחרוזת 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 (len); Serial.print ("Char:"); Serial.println (myData.a); Serial.print ("Int:"); Serial.println (myData.b); Serial.print ("Float:"); Serial.println (myData.c); Serial.print ("מחרוזת:"); Serial.println (myData.d); Serial.print ("בוור:"); Serial.println (myData.e); Serial.println (); } הגדרת void () {// הגדר את קצב השידור לתקשורת טורית עם ESP Serial.begin (115200); // הגדר את המכשיר כמצב WiFi.mode (WIFI_STA); // מפעיל את ה- wifi // Init ESP-NOW ומחזיר את הסטטוס שלו אם (esp_now_init ()! = 0) {Serial.println ("שגיאה באתחול ESP-NOW"); לַחֲזוֹר; } esp_now_register_recv_cb (OnDataRecv); // התקשר לפונקציה OnDataRecv לאחר קבלת נתוני ESPNOW} לולאת חלל () {}
שלב 7: תקשורת דו -כיוונית
ה- ESP32 שולח נתונים בעת ההפעלה ל- ESP8266. ה- ESP8266 מדפיס את ההודעה שהתקבלה ולאחר מכן משיב על כך שה- ESP32 מדפיס על הצג הסידורי שלו.
קוד ESP32
// הוסף ספריות נחוצות
#include // כדי לגשת לפונקציות esp now #include // להוספת יכולות Wifi ב- ESP32 // שמור את כתובת ה- MAC במערך בשם broadcastAddress; uint8_t broadcastAddress = {0xA4, 0xCF, 0x12, 0xC7, 0x9C, 0x77}; // כתובת MAC של המקלט שלי/*הגדירו את סוגי הנתונים של המשתנים המרובים שנבנו ושנו את כולם כ- struct_message*/typedef struct struct_message {char a [32]; int b; לצוף ג; מחרוזת d; בול ה; } struct_message; // צור struct_message בשם myData struct_message myData; // פונקציה נקראת כאשר הנתונים נשלחים להדפסת חלל הסטטוס שלה OnDataSent (const uint8_t *mac_addr, esp_now_send_status_t status) {Serial.print ("\ r / n מצב שליחת מנות אחרונות: / t"); Serial.println (status == ESP_NOW_SEND_SUCCESS? "הצלחת מסירה": "כשל במשלוח"); 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 ("בתים שהתקבלו:"); 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 ("מחרוזת:"); Serial.println (myData.d); Serial.print ("בוור:"); Serial.println (myData.e); Serial.println (); } הגדרת void () {// הגדר את קצב השידור לתקשורת טורית עם ESP Serial.begin (115200); // הגדר את המכשיר כתחנת Wi-Fi WiFi.mode (WIFI_STA); // מפעיל את ה- wifi // Init 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 addres (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 ("נכשל הוספת עמית"); לַחֲזוֹר; } esp_now_register_recv_cb (OnDataRecv); // התקשר לפונקציה OnDataRecv לאחר קבלת נתוני ESPNOW send_data (); } לולאת void () {} void send_data () {Serial.println ("שליחה"); // הגדר ערכים לשלוח strcpy (myData.a, "THIS IS A CHAR"); // שמור "THIS IS A CHAR" למשתנה a מה"נתונים "שלי שהוגדרו קודם myData.b = אקראי (1, 20); // שמור ערך אקראי myData.c = 1.2; // שמור מצוף myData.d = "ESP32"; // שמור מחרוזת myData.e = false; // שמור בול // שלח נתונים הנמוכים מ -250 בתים או שווים באמצעות ESP-NOW ומחזיר את הסטטוס שלו esp_err_t result = esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); if (result == ESP_OK) {Serial.println ("נשלח בהצלחה");} else {Serial.println ("שגיאה בשליחת הנתונים"); }}
קוד ESP8266
// הוסף ספריות נחוצות
#include // להוספת יכולות Wifi ב- ESP32 #include // כדי לגשת לפונקציות esp now // שמור את כתובת ה- MAC במערך בשם broadcastAddress; uint8_t broadcastAddress = {0x30, 0xAE, 0xA4, 0xF5, 0x03, 0xA4}; /*הגדירו את סוגי הנתונים של המשתנים המרובים המובנים ושנו את שמו כ- struct_message*/ typedef struct struct_message {char a [32]; int b; לצוף ג; מחרוזת 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 (len); Serial.print ("Char:"); Serial.println (myData.a); Serial.print ("Int:"); Serial.println (myData.b); Serial.print ("Float:"); Serial.println (myData.c); Serial.print ("מחרוזת:"); Serial.println (myData.d); Serial.print ("בוור:"); Serial.println (myData.e); Serial.println (); לשלוח נתונים(); } void OnDataSent (uint8_t *mac_addr, uint8_t sendStatus) {Serial.print ("\ r / n מצב שליחת מנות אחרונות: / t"); Serial.println (sendStatus == 1? "הצלחה במסירה": "אספקה נכשלה"); אם (sendStatus! = 1) {send_data (); }} void send_data () {// הגדר ערכים לשליחת strcpy (myData.a, "THIS IS A CHAR"); // שמור "THIS IS A CHAR" למשתנה a מה"נתונים "שלי שהוגדרו קודם myData.b = אקראי (1, 20); // שמור ערך אקראי myData.c = 1.2; // שמור מצוף myData.d = "ESP8266"; // שמור מחרוזת myData.e = false; // שמור bool esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); } הגדרת void () {// הגדר את קצב השידור לתקשורת טורית עם ESP Serial.begin (115200); // הגדר את המכשיר כמצב WiFi.mode (WIFI_STA); // מפעיל את ה- wifi // Init 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} לולאת חלל () {}
שלב 8: הפניות
ESPNOW_32_ דוגמה
ESPNOW_8266 דוגמה
WIFI.h
ESP8266WiFi.h
esp_now.h עבור ESP8266
esp_now.h עבור ESP32
esp_now מסמך רשמי (הסבר טוב יותר של פונקציות)
מדריך רשמי ל- ESP-NOW
מוּמלָץ:
הסר רקע של תמונות מרובות באמצעות Photoshop 2020: 5 שלבים
הסר רקע של תמונות מרובות באמצעות Photoshop 2020: הסרת רקע של תמונה היא סופר קלה עכשיו! כך משתמשים ב- Adobe Photoshop 2020 להסרת רקע של מספר תמונות (אצווה) באמצעות סקריפט פשוט
כיצד לבצע פעמון דלת ללא מגע, זיהוי טמפרטורת הגוף, GY-906, 433MHz באמצעות Arduino: 3 שלבים
כיצד להכין פעמון דלת ללא מגע, זיהוי טמפרטורת הגוף, GY-906, 433MHz באמצעות Arduino: היום נכין פעמון ללא מגע, הוא יזהה את טמפרטורת הגוף שלך. במצב הנוכחי, חשוב מאוד לדעת אם טמפרטורת הגוף של מישהו גבוהה מהרגיל, כאשר מישהו צוחק. פרויקט זה יראה אור אדום אם יזהה
כיצד לבצע שיחות באמצעות Arduino - CoolPhone 1/2: 5 שלבים
כיצד לבצע שיחות באמצעות Arduino - CoolPhone 1/2: Nokia n97 - זה היה כנראה הטלפון הנייד הראשון שלי. השתמשתי בה להאזנה למוסיקה ולפעמים לצילום תמונות, אך בעיקר לביצוע שיחות. החלטתי ליצור טלפון משלי שישמש רק לביצוע וקבלת שיחות. זה יהיה אינט
כיצד לבצע מעגל אור חירום אוטומטי באמצעות טרנזיסטור D882: 3 שלבים
כיצד להכין מעגל אור חירום אוטומטי באמצעות טרנזיסטור D882: שלום חברים, ברוכים הבאים לערוץ שלי, היום אראה לך איך לעשות מעגל של אור חירום אוטומטי תוך שימוש ב- D882 TRANSISTOR
כיצד לבצע שיחות טלפון בחינם באמצעות סקייפ: 4 שלבים
כיצד לבצע שיחות טלפון בחינם באמצעות סקייפ: אני לא בטוח למה אני מפרסם את זה למעט העובדה שאני זוכר את הימים הטובים של לוח החיוג ואחרים לפני ההתרסקות הטכנולוגית של תחילת שנות האלפיים. פעם זה היה הדבר הכי מגניב בעולם לבצע שיחות חינם למרחקים ארוכים מכל שיתוף פעולה