فهرست مطالب:
- تدارکات
- مرحله 1: آدرس Mac Board را دریافت کنید
- مرحله 2: چگونه می توان ESP-NOW را کار کرد
- مرحله 3: عملکردهای ESP-NOW (ESP32)
- مرحله 4: عملکردهای ESP-NOW (ESP8266)
- مرحله 5: ارتباطات یک طرفه (ESP32 به عنوان فرستنده)
- مرحله 6: ارتباط یک طرفه (ESP8266 به عنوان فرستنده)
- مرحله 7: ارتباط دو طرفه
- مرحله 8: منابع
تصویری: چگونه می توان با استفاده از ESP32 و ESP8266 چندین مکالمه ESP از طریق ESP-NOW انجام داد: 8 مرحله
2024 نویسنده: John Day | [email protected]. آخرین اصلاح شده: 2024-01-30 08:53
در پروژه در حال انجام من ، به چندین ESP نیاز دارم تا بدون روتر با یکدیگر صحبت کنیم. برای انجام این کار ، من از ESP-NOW برای برقراری ارتباط بی سیم با یکدیگر بدون روتر در ESP استفاده می کنم.
تدارکات
مواردی که من استفاده کردم:
ماژول ESP32 DEV
NODEMCU 1.0 (ماژول ESP12E)
مرحله 1: آدرس 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 را کار کرد
در اینجا مروری بر نحوه عملکرد آن وجود دارد:
- شامل esp now و کتابخانه های wifi شود
- آدرس مک گیرنده ESP را ذخیره کنید
- ساختار داده پیام ارسال شده/دریافتی را تعریف کنید
- در هنگام راه اندازی ، wifi را روی حالت ایستگاه قرار دهید
- esp_now را اولیه کنید
- پس از ارسال و دریافت داده ها ، فراخوانی تماس را ایجاد و ثبت کنید
- برای Esp8266 ، نقش آن را مشخص کنید
- ثبت همکار یا گیرنده esp
- ارسال داده ها
مرحله 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
توصیه شده:
چگونه می توان یک تمرین هدف ساده نینتندو LABO انجام داد: 13 مرحله
چگونه می توان یک تمرین ساده نینتندو LABO Target تمرین کرد: من و خواهرم اخیراً نینتندو سوییچ خریداری کردیم. بنابراین مطمئناً ما چند بازی برای انجام آن داریم. و یکی از آنها Nintendo LABO Variety Kit بود. سپس سرانجام با گاراژ Toy-Con برخورد کردم. من بعضی چیزها را امتحان کردم ، و آن موقع بود که
چگونه می توان با ESP8266 ، صفحه نمایش کاغذ الکترونیکی ، ردیاب داده زنده ویروس کرونا COVID 19 را با 7 مرحله انجام داد
چگونه می توان با ESP8266 ، صفحه نمایش کاغذ الکترونیکی ، ردیاب داده زنده ویروس کرونا COVID 19 را ایجاد کرد: 1
چگونه می توان ظاهر دسکتاپ را در ویندوز 7 تغییر داد؟: 5 مرحله
چگونه می توان ظاهر دسکتاپ را در ویندوز 7 تغییر داد؟: ممکن است به تغییر تصویر زمینه دسکتاپ فکر کرده باشید. این دستورالعمل نحوه تغییر کاغذ دیواری است. برای کاربر ویندوز 7 است اگر می خواهید تصویر زمینه دسکتاپ را تغییر دهید اما نمی دانید چگونه ، لطفاً به آن نگاه کنید! امیدوارم این دستورالعمل
چگونه می توان پروژه مرتب سازی رنگی را با Microbit انجام داد؟: 4 مرحله
چگونه می توان یک پروژه مرتب سازی رنگی با Microbit انجام داد؟: اهداف پروژه پس از بارگیری برنامه ، می بینیم که ماتریس نقطه ای micro: bit LED "قلب" را نشان می دهد ، سروو را در 90 درجه راه اندازی می کند. وقتی چیزهای آبی یا زرد را روی سنسور رنگ قرار می دهیم ، سروو زوایای مختلفی را تغییر می دهد ، برخی از تفاوت ها را طبقه بندی می کند
چگونه می توان محیطی را ایجاد کرد و چراغ خواندن را با بلندگوها انجام داد: 10 مرحله
نحوه ایجاد محیط ، و خواندن ، چراغ با بلندگوها: شروع این پروژه به کندی پیش می رفت ، ما باید مراحل طراحی تفکر را طی کنیم ، این روند همدلی ، تعریف ، ایده پردازی ، نمونه سازی و در نهایت آزمایش است. ما از شماره 1 با همدلی شروع کردیم و مجموعه ای از مصاحبه ها را با