در این آموزش با استفاده از پروتکل ESP-Now که در آموزش های قبل درباره آن صحبت کرده۰ بودیم، اطلاعات مورد نظر را از یک برد ESP32 به چندین برد مختلف ارسال خواهیم کرد در این آموزش از برد Wemos برای دریافت اطلاعات استفاده کردیم. در این آموزش شما یاد خواهید گرفت که چگونه از پروتکل ارتباطی ESP-NOW برای ارسال داده از یک ESP32 به چند صفحه ESP32 یا ESP8266 استفاده کنید. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
پروتکل ESP-Now
ESP-NOW یک پروتکل ارتباطی بی سیم است که توسط Espressif ساخته شده و دارای قابلیت انتقال پکت است. این پروتکل چندین دستگاه را قادر می سازد تا به روشی آسان با یکدیگر صحبت کنند و اطلاعات را بصورت بهینه بین یکدیگر انتقال دهند. این پروتکل مشابه اتصال بی سیم ۲٫۴GHz است، که اغلب در ماوس های بی سیم استفاده می شود. بنابراین، جفت شدن دستگاه ها قبل از برقراری ارتباط لازم است. این به این معنی است که پس از جفت شدن دستگاه ها با یکدیگر، اتصال پایدار است. به عبارت دیگر، اگر بطور ناگهانی یکی از ESP های شما قطع شود یا ریست شود، هنگام راه اندازی مجدد بطور خودکار اتصال برقرار می شود.
مزیت های پروتکل ESP-NOW
- انتقال داده تا ۲۵۰ بایت.
- بهره مندی از ارتباط رمزگذاره شده.
-
استفاده از Call Back برای اطلاع رسانی به لایه های مختلف در صورت موفقیت یا عدم موفقیت در انتقال داده.
محدودیت های پروتکل ESP-NOW
- حدکثر محدوده ۲۵۰payload بایت.
- حداکثر پشتیبانی از ۱۰عدد SoftAP رمزگذاری شده.
- حداکثر تعداد پشتیباتی در حالت رمزگذاری نشده ۲۰ عدد.
نقش فرستنده و گیرنده
برد nodemcu با تراشه ESP32 در این پروژه نقش فرستنده دیتای مدنظر را دارد که در سناریوی ESP-NOW با عنوان Master شناخته خواهد شد. در ادامه برد Wemos با تراشه ESP8266 نقش دریافت کننده اطلاعات ارسال شده را دارد و در سناریو با عنوان Slave شناخته خواهد شد.
برد Wemos
برد Wemos یکی از پرطرافدار ترین برد هایی است که در زمینه iot مورد استفاده قرار میگیرد، یکی از مزیت های این برد نسبت به برد هایی مانند Node MCU اندازه کوچک آن می باشد تراشه وای فای مورد استفاده در این برد ESP8266 می باشد. از دیگر مزیت های این برد وجود شیلد های مختلفی برای این برد می باشد، که انجام هر پروژه ای را برای کاربر بسیار آسان و لذت بخش می کند، شیلد هایی از جمله شیلد باتری، multi sensor ، DHT22 ، رله ، oled تعداد بسیار زیادی شیلد برای این برد توسعه داده شده که در نتیجه تجربه خوبی از iot برای شما به جا خواهد گذاشت.
برد ESP32
ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوتهای آن بلوتوث داخلیاش میباشد. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC میباشد. این ماژول دارای بهترین پرفورمنس در مصرف انرژی میباشد یعنی با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیقتر به این برد نگاه کنیم باید بگوییم که این یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپ ها System on a chip microcontrollers هم گفته میشود.
روش کار این پروژه
در این پروژه از سناریوی یک Master و چند Slave استفاده خواهیم کرد، در این مورد یک ESP فرمان های مختلف یا یکسانی را برای دیگر ESP ها ارسال می کند، ایده به این صورت است که با این سناریو شما می توانید چند وسیله مختلف که در آن ESP وجود دارد را با یک ESP32 کنترل کنید. در این پروژه از دو برد با تراشه های متفاوت استفاده خواهیم کرد یعنی برد nodemcu با تراشه ESP32 و برد Wemos با تراشه ESP8266 که در برد اول یک مقدار بصورت رندوم شمره خواهد شد و از طریق پروتکل ESP-NOW به سمت برد دوم ارسال خواهد شد و این مقادیر را میتوان از طریق سریال مانیتور هردو برد مشاهده کرد، در این پروژه هدف تنها برقراری ارتباط بین دو بین است و در آموزش های بعدی به ارسال دیتای سنسور های مختلف خواهیم پرداخت.
وسایل مورد نیاز
برد ESP برپایه تراشه ESP8266 یا ESP32
کابل جامپر مخصوص اتصالات سنسور و بردها
نصب کتابخانه مرجع
در این بخش اقدام به نصب کتابخانه مرجع ESP-NOW خواهیم کرد تا در نتیجه این امکان فراهم شود که از توابع و دستورات مورد نیاز در کد پروژه استفاده کنیم. در صورت دریافت هرگونه ارور مبنی بر عدم وجود کتابخانه espnow.h طبق مراحل زیر پیش بروید.
- این مسیر را دنبال کنید Sketch > Include Library > Manage Libraries
- کلمه espnow را جستجو کنید.
- کتابخانه را نصب کنید.
بدست آوردن مک آدرس ESP32
پیش از این در آموزش راه اندازی پروتکل ESP-Now روش بدست آوردن مک آدرس را توضیح دادیم. چنانچه این مورد را اطلاعی ندارید، کافیست به پست اشاره شده مراجعه کنید.
کد مرجع برای ESP32 ارسال کننده
قبل از مشاهده کد برنامه بخش های مهمی از آن را با هم بررسی خواهیم کرد. ابتدا کتابخانه های مورد که یکی برای راهاندازی وایفای ESP32 و دیگری برای پروتکل ESP-now
#include <esp_now.h> #include <WiFi.h>
در این بخش Mac Address های بدست آمده از ESP های دریافت کننده را وارد می کنیم.
uint8_t broadcastAddress1[] = {0xBC,0xDD,0xC2,0xB3,0xC4,0xC2}; //uint8_t broadcastAddress2[] = {0xFF, , , , , }; //uint8_t broadcastAddress3[] = {0xFF, , , , , };
در این بخش ساختار دیتایی که ارسال خواهد شد را مشخص خواهیم کرد برای مثال نوع متغیر ها که وابسته به دیتایی است که ما ارسال خواهیم کرد.
typedef struct test_struct { // ساختار دیتا مدنظر ما int x; int y; } test_struct;
در این قسمت اطمینان حاصل خواهیم کرد که پروتکل به درستی اجرا شده یا نه.
if (esp_now_init() != ESP_OK) { Serial.println("Error initializing ESP-NOW"); return;
برای ارسال دیتا از این تابع استفاده میکنیم، البته تنها بخشی از موارد ضروری است که باید رعایت شود.
esp_now_register_send_cb(OnDataSent);
مقادیری که ارسال خواهند شد در بخش وارد میشوند.
test.x = random(0,20); test.y = random(0,20);
کد کامل برای آپلود در ESP32 به عنوان دیوایس ارسال کننده
محدودیت در دسترسی کامل به این مجموعه آموزش
دسترسی کامل به آموزش برای اعضای دیجی اسپارک امکان پذیر است. بخش اصلی آموزش شامل سورس کدهای توسعه داده شده توسط مهندسهای دیجی اسپارک است. به همین دلیل این آموزش خاص و یکتاست. برای استفاده از آن بایستی عضویت تهیه کنید. تبادل نظر با کاربران و پرسش سوال رایگان است و میتوانید از بخش نظرات همین آموزش اقدام کنید. |
کد مرجع برای Wemos دریافت کننده
این کد برای تمام دیوایس های دریافت کننده یکسان است، پس تنطیم منوی Tools بر روی برد مورد نظر کد را آپلود کنید. در بخش اول مانند بخش ارسال کننده از کتابخانه های مربوط استفاده خواهیم کرد.
#include <ESP8266WiFi.h> #include <espnow.h>
مانند بخش ارسال کننده ساختار دیتا را مشخص میکنیم دقت داشته باشید که در هردو کد باید یکسان باشد.
typedef struct temp_struct { int x; int y; int z; } temp_struct;
در این بخش دیتا را برای ارسال آماده میکنیم.
OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) { memcpy(&myData, incomingData, sizeof(myData));
در نهایت منطق برد و نقش آن در سناریو را مشخص خواهیم کرد.
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE); esp_now_register_recv_cb(OnDataRecv);
محدودیت در دسترسی کامل به این مجموعه آموزش
دسترسی کامل به آموزش برای اعضای دیجی اسپارک امکان پذیر است. بخش اصلی آموزش شامل سورس کدهای توسعه داده شده توسط مهندسهای دیجی اسپارک است. به همین دلیل این آموزش خاص و یکتاست. برای استفاده از آن بایستی عضویت تهیه کنید. تبادل نظر با کاربران و پرسش سوال رایگان است و میتوانید از بخش نظرات همین آموزش اقدام کنید. |
جمع بندی
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام آیا با همه بردهای وای فای میشه اینکارو کرد؟ یا فقط esp باید باشه؟
چه تراشه ای مدنظر شماست ؟
سلام و عرض ادب و خسته نباشید
میخواستم ببینم میشه از طریق وای فای این بوردا به لپ تاپ یا گوشی ارتباط سریال برقرار کرد
یعنی یه پورت بهش اختصاص بدیم رو سیستم که اطلاعات بصورت سریال براش ارسال بشه؟
با سلام، ممنونم.
باید مشخص شود چه نوع دیتایی را مدنظر دارید. برای مانیتور کردن مقادیر و یا پروگرام کردن برد بصورت بیسیم!
سلام و عرض ادب و خسته نباشید
میخواستم ببینم میشه از طریق وای فای این بوردا به لپ تاپ یا گوشی ارتباط سریال برقرار کرد
یعنی یه پورت بهش اختصاص بدیم رو سیستم که اطلاعات بصورت سریال براش ارسال بشه؟
….
با سلام، ممنونم.
باید مشخص شود چه نوع دیتایی را مدنظر دارید. برای مانیتور کردن مقادیر و یا پروگرام کردن برد بصورت بیسیم!
سلام خداقوت
تشکر میکنم مطالب در سطح حرفه ای بودن.
واقعا به این آموزش نیاز داشتم و استفاده کردم
فقط یه سوال!؟
بجای استفاده از دو برد esp32 و Wemos همونطور که در متن آموزش اومده، نمیشه از چند برد Esp32 استفاده کرد؟
مثلا یکی در حالت Master و باقی بردها در حالت Slave؟
(جهت کنترل دستی بعضی از قسمتهای خونه، به صورت توصیفی عرض میکنم Slave 1برای کولر، Slave 2 برای روشنایی پذیرایی، Slave 3 جهت باز کردن درب منزل یا قطع شیر گاز توسط شیربرقی و…) برق صنعتی خوندم
درباره برد Wemos اطلاعات زیادی ندارم.
ممنون میشم راهنمایی بفرمایید.
❤️
سلام، ممنونم. بله این امکان وجود دارد. سناریو های مختلفی برای esp-now وجود دارد که پروژه مدنظر شما هم در این موارد قابل اجراست.
میخوام از esp32 به عنوان سرور و
یه گوشی(از طریق اپلیکیشن) و حداکثر ۱۰ تا esp8266 به عنوان کلاینت
استفاده کنم ، ولی ارتباط بینشون رو نمیدونم چطور برقرار کنم ،پروتکل ارتباطی هم wifi
سلام
کسی از حالت Long Range در این پروتکل ESP-NOW استفاده کرده؟ توی دیتاشیت و برخی دولوپر ها میگن بیش از ۲۰۰ متر فاصله رو میتونه جواب بده ولی به سختی میشه تا ۵۰ متر هم جواب گرفت. البته Long Range فقط برای ESP32 کار میکنه!
اگه کسی تونسته با Long Range کار کنه ممنون میشم سورس گیت هاب رو به اشتراک بگذاره
تشکر
سلام معمولا این مورد برای انجام شدن نیاز به بخش سخت افزاری هم دارد. یعنی استفاده از ESP32 هایی با امکان اتصال آنتن خارجی.