תוכן עניינים:

כיצד לבצע שיחות ESP מרובות באמצעות ESP-NOW באמצעות ESP32 ו- ESP8266: 8 שלבים
כיצד לבצע שיחות ESP מרובות באמצעות ESP-NOW באמצעות ESP32 ו- ESP8266: 8 שלבים

וִידֵאוֹ: כיצד לבצע שיחות ESP מרובות באמצעות ESP-NOW באמצעות ESP32 ו- ESP8266: 8 שלבים

וִידֵאוֹ: כיצד לבצע שיחות ESP מרובות באמצעות ESP-NOW באמצעות ESP32 ו- ESP8266: 8 שלבים
וִידֵאוֹ: ניק ליין: מקורות החיים, אבולוציה, חיי חייזרים 2024, יולי
Anonim
כיצד לבצע שיחות ESP מרובות באמצעות ESP-NOW באמצעות ESP32 ו- ESP8266
כיצד לבצע שיחות ESP מרובות באמצעות ESP-NOW באמצעות ESP32 ו- ESP8266

בפרויקט המתמשך שלי, אני צריך מספר ESP כדי לדבר אחד עם השני בלי נתב. לשם כך אשתמש ב- ESP-NOW כדי ליצור תקשורת אלחוטית זה עם זה ללא נתב ב- ESP.

אספקה

דברים שהשתמשתי בהם:

מודול ESP32 DEV

NODEMCU 1.0 (מודול ESP12E)

שלב 1: קבל את כתובת ה- Mac של הלוח

קבל את כתובת Mac Board
קבל את כתובת Mac Board
קבל את כתובת Mac Board
קבל את כתובת Mac Board

באמצעות 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 לעבוד

להלן סקירה כללית כיצד לגרום לזה לפעול:

  1. כלול esp עכשיו וספריות wifi
  2. שמור את כתובת ה- mac של ה- ESP של הנמען
  3. הגדר את מבנה הנתונים של ההודעה שליחה/קבלה
  4. בהגדרה, הגדר את ה- wifi למצב תחנה
  5. אתחל esp_now
  6. לבצע ולרשום את פונקציית השיבה החזרה שנקראת לאחר שליחה וקבלה של נתונים
  7. עבור Esp8266, הגדר את תפקידו
  8. רשום את העמית או הנמען, במיוחד
  9. לשלוח נתונים

שלב 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

מוּמלָץ: