فهرست مطالب:

چگونه می توان با استفاده از ESP32 و ESP8266 چندین مکالمه ESP از طریق ESP-NOW انجام داد: 8 مرحله
چگونه می توان با استفاده از ESP32 و ESP8266 چندین مکالمه ESP از طریق ESP-NOW انجام داد: 8 مرحله

تصویری: چگونه می توان با استفاده از ESP32 و ESP8266 چندین مکالمه ESP از طریق ESP-NOW انجام داد: 8 مرحله

تصویری: چگونه می توان با استفاده از ESP32 و ESP8266 چندین مکالمه ESP از طریق ESP-NOW انجام داد: 8 مرحله
تصویری: آموزش کاربردی برد های ESP8266 و ESP32 2024, جولای
Anonim
چگونه می توان از طریق ESP-NOW چندین مکالمه ESP را با استفاده از ESP32 و ESP8266 انجام داد
چگونه می توان از طریق ESP-NOW چندین مکالمه ESP را با استفاده از ESP32 و ESP8266 انجام داد

در پروژه در حال انجام من ، به چندین ESP نیاز دارم تا بدون روتر با یکدیگر صحبت کنیم. برای انجام این کار ، من از ESP-NOW برای برقراری ارتباط بی سیم با یکدیگر بدون روتر در ESP استفاده می کنم.

تدارکات

مواردی که من استفاده کردم:

ماژول ESP32 DEV

NODEMCU 1.0 (ماژول ESP12E)

مرحله 1: آدرس Mac Board را دریافت کنید

آدرس Mac Board را دریافت کنید
آدرس Mac Board را دریافت کنید
آدرس Mac Board را دریافت کنید
آدرس Mac Board را دریافت کنید

از طریق ESP-now ، دستگاه های ESP با ارسال داده ها به آدرس منحصر به فرد خود در حالی که به یک شبکه نقطه دسترسی داخلی متصل شده اند که در حال حاضر با ایجاد یکپارچه سازی esp در ارتباط است ، با یکدیگر صحبت می کنند. به بنابراین ، آدرس MAC هر دستگاه را تعیین کنید. تنظیمات برد ESP32 و ESP8266 من پیوست شده است

برای ESP32

#شامل "WiFi.h" // برای دسترسی به قابلیت های ESP32 WIFI

void setup () {Serial.begin (115200)؛ Serial.print ("آدرس MAC Board ESP32:") ؛ Serial.println (WiFi.macAddress ()) ؛ // MAC Address خود را چاپ می کند} void loop () {}

برای ESP8266

#include // کتابخانه مورد استفاده برای دسترسی به قابلیت های ESP8266 WIFI

void setup () {Serial.begin (115200)؛ Serial.println ()؛ Serial.print ("ESP8266 Board MAC Address:")؛ Serial.println (WiFi.macAddress ()) ؛ // MAC Address خود را چاپ می کند} void loop () {}

آدرس MAC من عبارتند از:

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

مرحله 2: چگونه می توان ESP-NOW را کار کرد

در اینجا مروری بر نحوه عملکرد آن وجود دارد:

  1. شامل esp now و کتابخانه های wifi شود
  2. آدرس مک گیرنده ESP را ذخیره کنید
  3. ساختار داده پیام ارسال شده/دریافتی را تعریف کنید
  4. در هنگام راه اندازی ، wifi را روی حالت ایستگاه قرار دهید
  5. esp_now را اولیه کنید
  6. پس از ارسال و دریافت داده ها ، فراخوانی تماس را ایجاد و ثبت کنید
  7. برای Esp8266 ، نقش آن را مشخص کنید
  8. ثبت همکار یا گیرنده esp
  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: نام تابع callback پس از ارسال داده ESPNOW با این پارامترها:

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

      • mac_addr: آدرس مک گیرنده
      • وضعیت:

        • 1 = موفقیت
        • 0 = شکست

شرح:

پس از ارسال داده ESPNOW ، تابع OnDataSent را فراخوانی کنید

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] ؛ آدرس MAC همکار ESPNOW که آدرس MAC ایستگاه یا نرم افزار است

    • uint8_t lmk [ESP_NOW_KEY_LEN]

      ESPNOW کلید اصلی محلی که برای رمزگذاری داده ها استفاده می شود

    • کانال uint8_t

      کانال Wi-Fi که همکار برای ارسال/دریافت داده ESPNOW استفاده می کند. اگر مقدار 0 است ، از کانال فعلی که ایستگاه یا نرم افزار روشن است استفاده کنید. در غیر این صورت ، باید به عنوان کانالی که ایستگاه یا نرم افزار روشن است تنظیم شود

    • wifi_interface_t ifidx

      رابط Wi-Fi که همکار برای ارسال/دریافت داده ESPNOW استفاده می کند

    • رمزگذاری bool

      داده های 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 همتا
  • داده ها: داده ها برای ارسال
  • 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:

        آدرس مک گیرنده

      • *داده ها:

        دریافت اطلاعات

      • data_len

        طول بایت داده

شرح:

پس از دریافت داده های ESPNOW ، تابع cb را فراخوانی کنید

مرحله 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: نام تابع callback پس از ارسال داده ESPNOW با این پارامترها:

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

      • mac_addr: آدرس مک گیرنده
      • وضعیت:

        • 1 = موفقیت
        • 0 = شکست

شرح

پس از ارسال داده ESPNOW ، تابع OnDataSent را فراخوانی کنید

int esp_now_add_peer (u8 *mac_addr ، نقش u8 ، کانال u8 ، کلید u8 *، کلید u8 u8)

برمی گرداند:

  • 1 = موفقیت
  • 0 = شکست

مولفه های:

  • mac_addr

    آدرس مک همتای

  • نقش
  • کانال

    اگر مقدار 0 است ، از کانال فعلی که ایستگاه یا نرم افزار روشن است استفاده کنید. در غیر این صورت ، باید به عنوان کانالی که ایستگاه یا نرم افزار روشن است تنظیم شود

  • *کلید

    کلید برای رمزگذاری

  • key_len

    طول کلید

شرح:

یک همتا را به لیست همتا اضافه کنید

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

برمی گرداند:

  • 1 = موفقیت
  • 0 = شکست

مولفه های:

  • peer_addr: آدرس MAC همتا
  • داده ها: داده ها برای ارسال
  • 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:

        آدرس مک گیرنده

      • *داده ها:

        دریافت اطلاعات

      • data_len

        طول بایت داده

شرح:

پس از دریافت داده های ESPNOW ، با تابع cb تماس بگیرید

مرحله 5: ارتباطات یک طرفه (ESP32 به عنوان فرستنده)

ESP32 داده ها را به ESP8266 ارسال می کند. با این کد broadcastAddress را به آدرس مک گیرنده مربوطه تغییر دهید. مال من A4 بود: CF: 12: C7: 9C: 77

// افزودن کتابخانه های لازم

#include // برای دسترسی به esp توابع #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؛ شناور c ؛ رشته d ؛ bool e؛ } struct_message؛ // ایجاد یک ساختار_پیام به نام myData struct_message myData؛ // عملکردی ارسال می شود که داده ها برای چاپ وضعیت آن ارسال می شود. Serial.println (وضعیت == ESP_NOW_SEND_SUCCESS؟ "تحویل موفقیت آمیز": "تحویل ناموفق است") ؛ } void setup () {// تنظیم نرخ baud برای ارتباط سریال با ESP Serial.begin (115200) ؛ // تنظیم دستگاه به عنوان ایستگاه Wi-Fi WiFi.mode (WIFI_STA) ؛ // فای را راه اندازی می کند // Init ESP-NOW و وضعیت خود را برمی گرداند اگر (esp_now_init ()! = ESP_OK) {Serial.println ("خطا در راه اندازی ESP -اکنون")؛ برگشت؛ } // بعد از ارسال داده ESPNOW esp_now_register_send_cb (OnDataSent) ، تابع OnDataSent را فراخوانی کنید. // ثبت همتا esp_now_peer_info_t peerInfo؛ // مقداردهی اولیه و تعیین اطلاعات همتایان به عنوان اشاره گر به memcpy آدرس (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 "data" من که قبلاً myData.b تعریف شده بود ذخیره کنید. b = تصادفی (1 ، 20) ؛ // ذخیره یک مقدار تصادفی myData.c = 1.2؛ // ذخیره float myData.d = "سلام"؛ // ذخیره یک رشته myData.e = false؛ // ذخیره یک bool // ارسال داده کمتر یا مساوی 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 توابع /*انواع داده های متغیرهای متعدد ساختار یافته و نام همه آنها را به عنوان struct_message* /typedef struct struct_message {char a [32] تعریف کنید. int b؛ شناور c ؛ رشته d ؛ bool e؛ } struct_message؛ // ایجاد یک متغیر struct_message به نام myData struct_message myData؛ // تابع فراخوانی می شود که داده ها دریافت می شوند و آنها را چاپ می کند. OnDataRecv (uint8_t * mac، uint8_t * incomingData، uint8_t len) Serial.print ("بایت دریافت شده:") ؛ Serial.println (len)؛ Serial.print ("Char:")؛ Serial.println (myData.a) ؛ Serial.print ("Int:")؛ Serial.println (myData.b) ؛ Serial.print ("شناور:") ؛ Serial.println (myData.c) ؛ Serial.print ("رشته:") ؛ Serial.println (myData.d) ؛ Serial.print ("Bool:")؛ Serial.println (myData.e) ؛ Serial.println ()؛ } void setup () {// تنظیم نرخ baud برای ارتباط سریال با ESP Serial.begin (115200) ؛ // تنظیم دستگاه به عنوان ایستگاه Wi-Fi 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_now_register_recv_cb (OnDataRecv) را تعریف می کند. // بعد از دریافت داده ESPNOW} تابع OnDataRecv را فراخوانی کنید void loop () {}

مرحله 6: ارتباط یک طرفه (ESP8266 به عنوان فرستنده)

ESP8266 داده ها را به ESP32 ارسال می کند. با این کد broadcastAddress را به آدرس مک گیرنده مربوطه تغییر دهید. آدرس 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؛ شناور c ؛ رشته d ؛ bool e؛ } 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 () {// تنظیم نرخ baud برای ارتباط سریال با ESP Serial.begin (115200) ؛ // تنظیم دستگاه به عنوان ایستگاه Wi-Fi WiFi.mode (WIFI_STA) ؛ // وای فای را راه اندازی می کند // Init ESP-NOW و وضعیت خود را برمی گرداند اگر (esp_now_init ()) {Serial.println ("خطا در راه اندازی ESP-NOW")؛ برگشت؛ } esp_now_register_send_cb (OnDataSent) ؛ // پس از ارسال داده ESPNOW ، تابع OnDataSent را فراخوانی کنید // اگر (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 "data" من که قبلاً myData.b تعریف شده بود ذخیره کنید. b = تصادفی (1 ، 20) ؛ // ذخیره یک مقدار تصادفی myData.c = 1.2؛ // ذخیره یک float myData.d = "SP8266"؛ // ذخیره یک رشته myData.e = false؛ // ذخیره یک bool // ارسال داده کمتر یا مساوی با 250 بایت از طریق ESP-NOW و وضعیت آن را به نتیجه 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 در حال حاضر توابع #include // برای افزودن قابلیت های Wifi در ESP32 /*انواع داده های متغیرهای متعدد ساختار یافته و همه آنها را به struct_message* /typedef struct struct_message {char a [32] تعریف کنید. int b؛ شناور c ؛ رشته d ؛ bool e؛ } struct_message؛ // ایجاد یک متغیر struct_message به نام myData struct_message myData؛ // تابع هنگام دریافت داده ها فراخوانی می شود و آن را چاپ می کند. OnDataRecv (const uint8_t * mac، const uint8_t * incomingData، int len) Serial.print ("بایت دریافت شده:") ؛ Serial.println (len)؛ Serial.print ("Char:")؛ Serial.println (myData.a) ؛ Serial.print ("Int:")؛ Serial.println (myData.b) ؛ Serial.print ("شناور:") ؛ Serial.println (myData.c) ؛ Serial.print ("رشته:") ؛ Serial.println (myData.d) ؛ Serial.print ("Bool:")؛ Serial.println (myData.e) ؛ Serial.println ()؛ } void setup () {// تنظیم نرخ baud برای ارتباط سریال با ESP Serial.begin (115200) ؛ // تنظیم دستگاه به عنوان ایستگاه Wi-Fi WiFi.mode (WIFI_STA) ؛ // wifi را راه اندازی می کند // Init ESP-NOW و وضعیت خود را برمی گرداند اگر (esp_now_init ()! = 0) {Serial.println ("خطا در راه اندازی ESP-NOW") ؛ برگشت؛ } esp_now_register_recv_cb (OnDataRecv) ؛ // بعد از دریافت داده ESPNOW} تابع OnDataRecv را فراخوانی کنید void loop () {}

مرحله 7: ارتباط دو طرفه

ارتباط دو طرفه
ارتباط دو طرفه
ارتباط دو طرفه
ارتباط دو طرفه

ESP32 داده های راه اندازی را به ESP8266 ارسال می کند. ESP8266 پیام دریافتی را چاپ می کند و سپس پاسخ می دهد که ESP32 روی مانیتور سریال خود چاپ می کند.

کد ESP32

// افزودن کتابخانه های لازم

#include // برای دسترسی به esp توابع #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؛ شناور c ؛ رشته d ؛ bool e؛ } struct_message؛ // ایجاد یک ساختار_پیام به نام myData struct_message myData؛ // عملکردی ارسال می شود که داده ها برای چاپ وضعیت آن ارسال می شود. Serial.println (وضعیت == ESP_NOW_SEND_SUCCESS؟ "تحویل موفقیت آمیز": "تحویل ناموفق است") ؛ if (وضعیت! = 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 ("شناور:") ؛ Serial.println (myData.c) ؛ Serial.print ("رشته:") ؛ Serial.println (myData.d) ؛ Serial.print ("Bool:")؛ Serial.println (myData.e) ؛ Serial.println ()؛ } void setup () {// تنظیم نرخ baud برای ارتباط سریال با ESP Serial.begin (115200) ؛ // تنظیم دستگاه به عنوان ایستگاه Wi-Fi WiFi.mode (WIFI_STA) ؛ // فای را راه اندازی می کند // Init ESP-NOW و وضعیت خود را برمی گرداند اگر (esp_now_init ()! = ESP_OK) {Serial.println ("خطا در راه اندازی ESP -اکنون")؛ برگشت؛ } // بعد از ارسال داده ESPNOW esp_now_register_send_cb (OnDataSent) ، تابع OnDataSent را فراخوانی کنید. // ثبت همتا esp_now_peer_info_t peerInfo؛ // مقداردهی اولیه و تعیین اطلاعات همتا به عنوان اشاره گر به یک memcpy آدرس (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) ؛ // پس از دریافت ESPNOW data send_data () ، تابع OnDataRecv را فراخوانی کنید. } حلقه void () {} void send_data () {Serial.println ("ارسال")؛ // تنظیم مقادیر برای ارسال strcpy (myData.a ، "THIS IS A CHAR") ؛ // "THIS IS A CHAR" را در متغیر a "data" من که قبلاً myData.b تعریف شده بود ذخیره کنید. b = تصادفی (1 ، 20) ؛ // ذخیره یک مقدار تصادفی myData.c = 1.2؛ // ذخیره float myData.d = "ESP32"؛ // ذخیره یک رشته myData.e = false؛ // ذخیره یک bool // ارسال داده کمتر یا مساوی 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؛ شناور c ؛ رشته d ؛ bool e؛ } struct_message؛ // ایجاد یک متغیر struct_message به نام myData struct_message myData؛ // تابع فراخوانی می شود که داده ها دریافت می شوند و آنها را چاپ می کند. OnDataRecv (uint8_t * mac، uint8_t * incomingData، uint8_t len) Serial.print ("بایت دریافت شده:") ؛ Serial.println (len)؛ Serial.print ("Char:")؛ Serial.println (myData.a) ؛ Serial.print ("Int:")؛ Serial.println (myData.b) ؛ Serial.print ("شناور:") ؛ Serial.println (myData.c) ؛ Serial.print ("رشته:") ؛ Serial.println (myData.d) ؛ Serial.print ("Bool:")؛ Serial.println (myData.e) ؛ Serial.println ()؛ send_data ()؛ } void OnDataSent (uint8_t *mac_addr، uint8_t sendStatus) {Serial.print ("\ r / n وضعیت ارسال آخرین بسته: / t")؛ Serial.println (sendStatus == 1؟ "موفقیت تحویل": "تحویل ناموفق است") ؛ if (sendStatus! = 1) {send_data ()؛ }} void send_data () {// تنظیم مقادیر برای ارسال strcpy (myData.a ، "THIS IS CHAR") ؛ // "THIS IS A CHAR" را در متغیر a "data" من که قبلاً myData.b تعریف شده بود ذخیره کنید. b = تصادفی (1 ، 20) ؛ // ذخیره یک مقدار تصادفی myData.c = 1.2؛ // ذخیره float myData.d = "ESP8266"؛ // ذخیره یک رشته myData.e = false؛ // ذخیره bool esp_now_send (broadcastAddress، (uint8_t *) & myData، sizeof (myData))؛ } void setup () {// تنظیم نرخ baud برای ارتباط سریال با ESP Serial.begin (115200) ؛ // تنظیم دستگاه به عنوان ایستگاه Wi-Fi 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_now_register_recv_cb (OnDataRecv) را تعریف می کند. // بعد از دریافت داده ESPNOW} تابع OnDataRecv را فراخوانی کنید void loop () {}

مرحله 8: منابع

ESPNOW_32_ مثال

ESPNOW_8266 مثال

WIFI.h

ESP8266WiFi.h

esp_now.h برای ESP8266

esp_now.h برای ESP32

esp_now سند رسمی (توضیح بهتر توابع)

راهنمای رسمی ESP-NOW

توصیه شده: