جدول المحتويات:

كيفية جعل ESP متعددة تتحدث عبر ESP-NOW باستخدام ESP32 و ESP8266: 8 خطوات
كيفية جعل ESP متعددة تتحدث عبر ESP-NOW باستخدام ESP32 و ESP8266: 8 خطوات

فيديو: كيفية جعل ESP متعددة تتحدث عبر ESP-NOW باستخدام ESP32 و ESP8266: 8 خطوات

فيديو: كيفية جعل ESP متعددة تتحدث عبر ESP-NOW باستخدام ESP32 و ESP8266: 8 خطوات
فيديو: ESPNOW mix with #ESP32 and #ESP8266 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
احصل على عنوان لوحة Mac
احصل على عنوان لوحة Mac
احصل على عنوان لوحة Mac

من خلال ESP-now ، تتحدث أجهزة ESP مع بعضها البعض عن طريق إرسال البيانات إلى عنوانها الفريد أثناء الاتصال بشبكة نقطة وصول داخلية تم إنشاؤها عند intilaizing esp الآن.. وبالتالي ، حدد عنوان MAC لكل جهاز. تم إرفاق إعدادات لوحة ESP32 و ESP8266 الخاصة بي

لـ ESP32

# تضمين "WiFi.h" // للوصول إلى إمكانات ESP32 WIFI

إعداد باطل () {Serial.begin (115200) ؛ Serial.print ("عنوان MAC للوحة ESP32:") ؛ Serial.println (WiFi.macAddress ()) ؛ // يطبع عنوان MAC الخاص به} حلقة فارغة () {}

لـ ESP8266

# تضمين // المكتبة المستخدمة للوصول إلى إمكانات ESP8266 WIFI

إعداد باطل () {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 (باطل)

يعود:

  • 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 * peer)

عائدات:

  • 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 النظير MAC وهو أيضًا عنوان MAC للمحطة أو البرنامج

    • uint8_t lmk [ESP_NOW_KEY_LEN]

      مفتاح رئيسي محلي ESPNOW نظير يُستخدم لتشفير البيانات

    • قناة uint8_t

      قناة Wi-Fi التي يستخدمها النظير لإرسال / استقبال بيانات ESPNOW. إذا كانت القيمة 0 ، فاستخدم القناة الحالية التي تعمل بها المحطة أو البرنامج. خلاف ذلك ، يجب تعيينها على أنها القناة التي تعمل بها المحطة أو البرنامج

    • wifi_interface_t ifidx

      واجهة Wi-Fi التي يستخدمها النظير لإرسال / استقبال بيانات ESPNOW

    • تشفير منطقي

      بيانات ESPNOW التي يرسلها / يستقبلها هذا النظير مشفرة أم لا

    • * باطل

      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 من نظير
  • البيانات: البيانات المراد إرسالها
  • لين: طول البيانات

وصف:

إرسال بيانات ESPNOW. في بعض الحالات ، يحدث هذا:

  • إذا لم يكن peer_addr NULL ، فأرسل البيانات إلى النظير الذي يتطابق عنوان MAC الخاص به مع peer_addr
  • إذا كانت قيمة peer_addr فارغة ، فأرسل البيانات إلى جميع النظراء الذين تمت إضافتهم إلى قائمة النظراء
  • يجب أن يكون الحد الأقصى لطول البيانات أقل من 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 (باطل)

عائدات:

  • 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 بهذه المعلمات:

    • 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 من نظير
  • البيانات: البيانات المراد إرسالها
  • لين: طول البيانات

وصف:

إرسال بيانات ESPNOW. في بعض الحالات ، يحدث هذا:

  • إذا لم يكن peer_addr NULL ، فأرسل البيانات إلى النظير الذي يتطابق عنوان MAC الخاص به مع peer_addr
  • إذا كانت قيمة peer_addr فارغة ، فأرسل البيانات إلى جميع النظراء الذين تمت إضافتهم إلى قائمة النظراء
  • يجب أن يكون الحد الأقصى لطول البيانات أقل من 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. بهذا الرمز. قم بتغيير عنوان البث إلى عنوان MAC الخاص بجهاز الاستقبال المتوافق. كان منجم A4: CF: 12: C7: 9C: 77

// أضف المكتبات الضرورية

#include // للوصول إلى وظائف esp الآن #include // لإضافة إمكانيات Wifi على ESP32 // احفظ عنوان MAC في مصفوفة باسمcastAddress ؛ uint8_t radioAddress = {0xA4 ، 0xCF ، 0x12 ، 0xC7 ، 0x9C ، 0x77} ؛ // عنوان MAC الخاص بجهاز الاستقبال الخاص بي / * حدد أنواع البيانات الخاصة بالمتغيرات المتعددة المهيكلة وأعيد تسميتها كلها باسم Struct_message * / typedef Struct_message {char a [32]؛ الباحث ب ؛ تعويم ج ؛ سلسلة د ؛ منطقي ه ؛ } Struct_message؛ // أنشئ رسالة هيكلية تسمى myData Struct_message myData ؛ // يتم استدعاء الوظيفة عند إرسال البيانات لطباعة حالتها باطلة OnDataSent (const uint8_t * mac_addr، esp_now_send_status_t status) {Serial.print ("\ r / n Last Packet Send Status: / t")؛ Serial.println (status == ESP_NOW_SEND_SUCCESS؟ "نجاح التسليم": "فشل التسليم") ؛ } void setup () {// تعيين معدل البث بالباود للاتصال التسلسلي مع ESP Serial.begin (115200) ؛ // تعيين الجهاز باعتباره Wi-Fi Station 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 (peerInfo.peer_addr ،castAddress، 6)؛ // انسخ قيمة عنوان البث مع 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 A CHAR")؛ // حفظ "هذا حرف" لتغيير "أ" من "بياناتي" المحددة سابقًا 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 (castAddress، (uint8_t *) & myData، sizeof (myData)) ؛ إذا (نتيجة == ESP_OK) {Serial.println ("تم الإرسال بنجاح") ؛ } else {Serial.println ("خطأ في إرسال البيانات")؛ } تأخير (2000)؛ }

يستقبل ESP8266 البيانات من ESP32 باستخدام هذا الرمز.

// أضف المكتبات الضرورية

#include // لإضافة إمكانيات Wifi على ESP32 #include // للوصول إلى وظائف esp الآن / * حدد أنواع البيانات الخاصة بالمتغيرات المتعددة التي تم تنظيمها وأعدت تسميتها كلها كـ Struct_message * / typedef architecture Struct_message {char a [32]؛ الباحث ب ؛ تعويم ج ؛ سلسلة د ؛ منطقي ه ؛ } 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 ("Char:") ؛ Serial.println (myData.a) ؛ Serial.print ("Int:") ؛ Serial.println (myData.b) ؛ Serial.print ("Float:") ؛ Serial.println (myData.c) ؛ Serial.print ("String:") ؛ Serial.println (myData.d) ؛ Serial.print ("Bool:") ؛ Serial.println (myData.e) ؛ Serial.println () ، } void setup () {// تعيين معدل البث بالباود للاتصال التسلسلي مع ESP Serial.begin (115200) ؛ // تعيين الجهاز باعتباره Wi-Fi Station 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. بهذا الرمز. قم بتغيير عنوان البث إلى عنوان MAC الخاص بجهاز الاستقبال المتوافق. عنواني esp32 هو 30: AE: A4: F5: 03: A4. للحصول على وظائف أخرى لـ esp8266 ، انتقل هنا

// أضف المكتبات الضرورية

#include // لإضافة إمكانيات Wifi على ESP32 #include // للوصول إلى وظائف esp الآن // احفظ عنوان MAC في مصفوفة تسمى بثادريس ؛ uint8_t radioAddress = {0x30، 0xAE، 0xA4، 0xF5، 0x03، 0xA4} ؛ / * تحديد أنواع البيانات الخاصة بالمتغيرات المتعددة المهيكلة وإعادة تسميتها كلها كـ Struct_message * / typedef architecture_message {char a [32]؛ الباحث ب ؛ تعويم ج ؛ سلسلة د ؛ منطقي ه ؛ } Struct_message؛ // إنشاء متغير منظم يسمى myData Struct_message myData ؛ // يتم استدعاء الوظيفة عند إرسال البيانات وطباعة حالتها باطلة OnDataSent (uint8_t * mac_addr، uint8_t sendStatus) {Serial.print ("\ r / n حالة إرسال الحزمة الأخيرة: / t")؛ Serial.println (sendStatus == 1؟ "نجاح التسليم": "فشل التسليم") ؛ } void setup () {// تعيين معدل البث بالباود للاتصال التسلسلي مع ESP Serial.begin (115200) ؛ // تعيين الجهاز باعتباره Wi-Fi Station 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 (عنوان البث ، ESP_NOW_ROLE_CONTROLLER ، 1 ، NULL ، 0)) {Serial.println ("فشل إضافة نظير") ؛ إرجاع؛ }} void loop () {// تعيين القيم لإرسال strcpy (myData.a، "THIS A CHAR")؛ // حفظ "هذا حرف" لتغيير "أ" من "بياناتي" المحددة سابقًا myData.b = عشوائي (1 ، 20) ؛ // حفظ قيمة عشوائية myData.c = 1.2 ؛ // حفظ عائم myData.d = "SP8266" ؛ // حفظ سلسلة myData.e = false ؛ // save a bool // أرسل بيانات أقل من 250 بايت أو تساويها عبر ESP-NOW وإرجاع حالتها int نتيجة = esp_now_send (بث عنوان ، (uint8_t *) & myData ، sizeof (myData)) ؛ if (esp_now_init ()! = 0) {Serial.println ("تم الإرسال بنجاح") ؛ } else {Serial.println ("خطأ في إرسال البيانات")؛ } تأخير (2000)؛ }

يستقبل ESP32 البيانات من ESP8266. بهذا الرمز. للوظائف الأخرى ، يرجى الرجوع هنا

// أضف المكتبات الضرورية

#include // للوصول إلى وظائف esp الآن #include // لإضافة إمكانيات Wifi على ESP32 / * حدد أنواع البيانات الخاصة بالمتغيرات المتعددة التي تم تنظيمها وأعدت تسميتها كلها كـ Struct_message * / typedef architecture Struct_message {char a [32]؛ الباحث ب ؛ تعويم ج ؛ سلسلة د ؛ منطقي ه ؛ } 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 ("Char:") ؛ Serial.println (myData.a) ؛ Serial.print ("Int:") ؛ Serial.println (myData.b) ؛ Serial.print ("Float:") ؛ Serial.println (myData.c) ؛ Serial.print ("String:") ؛ Serial.println (myData.d) ؛ Serial.print ("Bool:") ؛ Serial.println (myData.e) ؛ Serial.println () ، } void setup () {// تعيين معدل البث بالباود للاتصال التسلسلي مع ESP Serial.begin (115200) ؛ // تعيين الجهاز باعتباره Wi-Fi Station 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 الآن #include // لإضافة إمكانيات Wifi على ESP32 // احفظ عنوان MAC في مصفوفة باسمcastAddress ؛ uint8_t radioAddress = {0xA4 ، 0xCF ، 0x12 ، 0xC7 ، 0x9C ، 0x77} ؛ // عنوان MAC الخاص بجهاز الاستقبال الخاص بي / * حدد أنواع البيانات الخاصة بالمتغيرات المتعددة المهيكلة وأعيد تسميتها كلها باسم Struct_message * / typedef Struct_message {char a [32]؛ الباحث ب ؛ تعويم ج ؛ سلسلة د ؛ منطقي ه ؛ } Struct_message؛ // أنشئ رسالة هيكلية تسمى myData Struct_message myData ؛ // يتم استدعاء الوظيفة عند إرسال البيانات لطباعة حالتها باطلة OnDataSent (const uint8_t * mac_addr، esp_now_send_status_t status) {Serial.print ("\ r / n Last Packet Send Status: / 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 (لين) ؛ Serial.print ("Char:") ؛ Serial.println (myData.a) ؛ Serial.print ("Int:") ؛ Serial.println (myData.b) ؛ Serial.print ("Float:") ؛ Serial.println (myData.c) ؛ Serial.print ("String:") ؛ Serial.println (myData.d) ؛ Serial.print ("Bool:") ؛ Serial.println (myData.e) ؛ Serial.println () ، } void setup () {// تعيين معدل البث بالباود للاتصال التسلسلي مع ESP Serial.begin (115200) ؛ // تعيين الجهاز باعتباره Wi-Fi Station 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 (peerInfo.peer_addr ،castAddress، 6)؛ // انسخ قيمة عنوان البث مع 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 loop () {} void send_data () {Serial.println ("Sending") ؛ // تعيين القيم لإرسال strcpy (myData.a، "هذا رمز") ؛ // حفظ "هذا حرف" لتغيير "أ" من "بياناتي" المحددة سابقًا 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 (castAddress، (uint8_t *) & myData، sizeof (myData)) ؛ إذا (نتيجة == ESP_OK) {Serial.println ("تم الإرسال بنجاح") ؛} else {Serial.println ("خطأ في إرسال البيانات") ؛ }}

كود ESP8266

// أضف المكتبات الضرورية

#include // لإضافة إمكانيات Wifi على ESP32 #include // للوصول إلى وظائف esp الآن // احفظ عنوان MAC في مصفوفة تسمى بثادريس ؛ uint8_t radioAddress = {0x30، 0xAE، 0xA4، 0xF5، 0x03، 0xA4} ؛ / * تحديد أنواع البيانات الخاصة بالمتغيرات المتعددة المهيكلة وإعادة تسميتها كلها كـ Struct_message * / typedef architecture_message {char a [32]؛ الباحث ب ؛ تعويم ج ؛ سلسلة د ؛ منطقي ه ؛ } 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 ("Char:") ؛ Serial.println (myData.a) ؛ Serial.print ("Int:") ؛ Serial.println (myData.b) ؛ Serial.print ("Float:") ؛ Serial.println (myData.c) ؛ Serial.print ("String:") ؛ Serial.println (myData.d) ؛ Serial.print ("Bool:") ؛ Serial.println (myData.e) ؛ Serial.println () ، send_data () ، } باطل 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 CHAR") ؛ // حفظ "هذا حرف" لتغيير "أ" من "بياناتي" المحددة سابقًا myData.b = عشوائي (1 ، 20) ؛ // حفظ قيمة عشوائية myData.c = 1.2 ؛ // حفظ عائم myData.d = "ESP8266" ؛ // حفظ سلسلة myData.e = false ؛ // حفظ منطقي esp_now_send (عنوان البث ، (uint8_t *) & myData ، sizeof (myData)) ؛ } void setup () {// تعيين معدل البث بالباود للاتصال التسلسلي مع ESP Serial.begin (115200) ؛ // تعيين الجهاز باعتباره Wi-Fi Station WiFi.mode (WIFI_STA) ؛ // يبدأ wifi // Init ESP-NOW ويعيد حالته إذا (esp_now_init ()! = 0) {Serial.println ("خطأ في تهيئة ESP-NOW") ؛ إرجاع؛ } if (esp_now_add_peer (radioAddress، ESP_NOW_ROLE_SLAVE، 1، NULL، 0)) {Serial.println ("Failed to add peer")؛ إرجاع؛ } 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_Example

مثال ESPNOW_8266

واي فاي

ESP8266WiFi.h

esp_now.h لـ ESP8266

esp_now.h لـ ESP32

esp_now المستند الرسمي (شرح أفضل للوظائف)

دليل ESP-NOW الرسمي

موصى به: