در سه سوت و از طریق ESP8266 به وای فای متصل شویم.
امواج وای فای دیگر همهجا حضور دارند. آرزوی قدیمی مهندسین برای اتصال ارزان و آسان به این امواج، چند وقتی میشود که به لطف گسترش اینترنت اشیا محقق شده است. در این پست خواهید آموخت که چطور میشود یک ارتباط ساده و ارزان را در شبکهی وای فای راهاندازی نمود.
شاید برای شما مفید باشد: پروژه های آردوینو
قبل از انتخاب وای فای بهعنوان پروتکل ارتباطی سیستم موردنظرتان، به نکات زیر توجه بفرمایید:
وای فای برای سیستمهای زیر نامناسب است:
- سیستم با باتری کار میکند و توان مصرفی عامل مهمی است.
- نیاز است تا زمان پاسخدهی کوتاه و به عبارت دقیقتر Real Time باشد.
- تعداد نودهای متصل بیسیم بسیار زیاد باشد.
اما در موارد زیر وای فای مناسب است:
- حجم اطلاعات ارسالی تقریباً زیاد است و اگر کمی هم دیر برسد اشکالی ندارد.
- استفاده از بسترهای موجود شبکه (مودم، روتر و سختافزارهای موجود وای فای) در اولویت است.
- میخواهیم بهطور مستقیم به گوشیهای هوشمند متصل شویم و از بلوتوث هم خوشتان نمیآید!
خوب برویم سراغ اصل مطلب. برای تجربهی اتصال وای فای خودتان، باید گامهای زیر را بردارید:
سوت اول: تهیهی ماژول
ماژولی که در این پست معرفی خواهم کرد، NodeMCU نام دارد. یک ماژول ارزانقیمت که امکان راهاندازی ارتباط وای فای را به شما میدهد. این ماژول بر پایهی ماژول وای فای ESP8266 ساخته شده است. خوشبختانه فرومهای بسیاری در اینترنت برای راهاندازی NodeMCU در انواع کاربردها موجود است. برای اطلاعات بیشتر در مورد این ماژول میتوانید به این لینک زیر مراجعه کنید:
همانطور که از یک ماژول ارزانقیمت چینی انتظار میرود، انواع نسخههای کپی و یا توسعهیافته توسط افرادی بهجز کمپانی اصلی در بازار موجود است که پرداختن به آنها خارج از حوصلهی این پست است. درهرصورت، بهراحتی میتوانید یک نمونه از این ماژول را از فروشگاههای آنلاین موجود در ایران نیز تهیه نمایید.
اگر هم حرفه ای هستید میتوانید از این سایت برای کارهای خاص کمک بگیرید.
سوت دوم: آمادهسازی محیط توسعه
برای کد نویسی این ماژول از محیط توسعهی Arduino استفاده میکنیم. پس لازم است که با زبان C آشنا باشید. مراحلی که توضیح میدهم از اینجا برداشت شده است.
الف: دریافت Arduino IDE و نصب آن
ب. تنظیم Board Manager: به منوی File->Preferences رفته و در قسمت Additional Board Manager URLs عبارت http://arduino.esp8266.com/stable/package_esp8266com_index.json را وارد نمایید.
ج. نصب پکیجهای مربوط به ESP8266: به قسمت Tools->Board->Board Manager بروید.
و در آنجا عبارت ESP8266 را جستجو نمایید. چنانچه پکیج مربوط به آن نصب نشده است، آن را نصب نمایید.
د: حالا همه چیز آماده است. کافی است تا در قسمت Tools->Boards، بردی که در حال کار با آن هستید را انتخاب کنید.
سوت سوم: برنامهی خودتان را بنویسید.
برنامههای از پیش نوشتهشدهی بسیاری در اینترنت موجود هستند که میتوانید با استفاده از آنها برنامهی خودتان را توسعه دهید. بهعنوانمثال من به دنبال کاربردی بودم که بتوانم بستههای UDP را از گوشی برای یک برد سختافزاری ارسال کنم. ماژول NodeMCU وظیفهی دریافت این بستهها و سپس ارسال آنها بر روی پورت UART را بر عهده داشت. تصویر زیر نمایی کلی از برنامه را نمایش میدهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <ESP8266WiFi.h> #include <WiFiUdp.h> const char* ssid = "noobyir"; const char* password = "noobynooby"; WiFiUDP Udp; unsigned int localUdpPort = 6060; // local port to listen on char incomingPacket[255]; // buffer for incoming packets void setup() { Serial.begin(115200); Serial.println(); Serial.printf("Connecting to %s ", ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(" connected"); Udp.begin(localUdpPort); Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort); } void loop() { int packetSize = Udp.parsePacket(); if (packetSize) { // receive incoming UDP packets Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort()); int len = Udp.read(incomingPacket, 255); if (len > 0) { incomingPacket[len] = 0; } Serial.printf("UDP packet contents: %s\n", incomingPacket); } } |
این برنامه فقط دارای سه جزء ساده است:
اول: includeها و تعریف متغیرها
1 2 3 4 5 6 7 8 9 | #include <ESP8266WiFi.h> #include <WiFiUdp.h> const char* ssid = "noobyir"; const char* password = "noobynooby"; WiFiUDP Udp; unsigned int localUdpPort = 6060; // local port to listen on char incomingPacket[255]; // buffer for incoming packets |
هدر ESP8266WiFi برای کار با هستهی وای فای و WiFiUdp برای ارسال و دریافت بستههای UDP اضافه شده است.
متغیر ssid و password برای اتصال به شبکهی وای فای مورد استفاده قرار میگیرند. نام شبکهی خودتان و رمز آن را در این قسمت از کد وارد نمایید.
متغیر Udp آبجکتی است که برای کار با UDP از آن استفاده میشود. مقدار localUdpPort در هنگام راهاندازی تنظیمات UDP، بهعنوان پورتی که ماژول به آن گوش میدهد استفاده میشود؛ پس لازم است که مقدار آن را مطابق نیاز خودتان تنظیم کنید.
آرایهی incomingPacket دادههای دریافت شده از UDP را ذخیره میکند.
دوم: پیکربندی اولیه
روتین setup برای پیکربندی اولیهی ماژول استفاده میشود و پس از هر بار روشن شدن (ریست شدن) سیستم، در ابتدای کار، یک بار اجرا میشود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | void setup() { Serial.begin(115200); Serial.println(); Serial.printf("Connecting to %s ", ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(" connected"); Udp.begin(localUdpPort); Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort); } |
در ابتدا پورت UART با سرعت 19200 بیت در ثانیه تنظیم شده است. در خطوط بعدی، ماژول تا زمان وصل شدن به شبکهی وای فای صبر میکند و بهمحض اتصال، پیغامی مبتنی بر اتصال را بر روی UART ارسال میکند.
در پایان این روتین نیز، ارتباط UDP فعال میشود و بهطور مستمر، ماژول بر روی پورت تعیینشده، به دادههای دریافتی گوشی میدهد.
سوم: برنامهی ابدی
روتین loop تا ابد (تا زمانی که ماژول روشن است) همواره و بهصورت چرخشی اجرا میگردد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | void loop() { int packetSize = Udp.parsePacket(); if (packetSize) { // receive incoming UDP packets Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort()); int len = Udp.read(incomingPacket, 255); if (len > 0) { incomingPacket[len] = 0; } Serial.printf("UDP packet contents: %s\n", incomingPacket); } } |
این پست، بازنشر از پست بلاگ نوبی است که توسط نویسندهی همین مطلب و با همین نام در سیسوگ قرار داده شده است.
سلام وقت شما بخير ممنون از پروژه اي كه قرار داديد
سوالي كه داشتم اين هست كه آيا اين برنامه در واقع ديتا اينترنت كه همان بسته هاي udp هست را از طريق پروتكل uart انتقال ميده؟
سلام دوست عزیز
در واقع این برنامه ساده کارش اینه که دیتای دریافت شده رو روی پورت سریال نمایش میده و این فرایند یک طرفه است یعنی فقط پکت دریافت میشه
البته به سادگی میتونید با اضافه کردن کد فرایند رو دوطرفه کنید.
اگر دنبال ارسال و دریافت همزمان سریال روی شبکه هستید قبلا پروژه خوبی رو در سیسوگ معرفی کردیم. لینک زیر رو ببینید:
https://sisoog.com/2018/12/19/%d8%b3%d8%a7%d8%ae%d8%aa-%d9%85%d8%a8%d8%af%d9%84-%d8%b3%d8%b1%db%8c%d8%a7%d9%84-%d8%a8%d9%87-%d9%88%d8%a7%db%8c-%d9%81%d8%a7%db%8c-%d8%aa%d9%88%d8%b3%d8%b7-esp8266/
با سلام و خسته نباشید
من یه برنامه آردوینو ریختم برای MCU NODE و می خوام از ESP8266 استفاده کنم . اما وقتی میرم توی سریال مانیتورینگ به جای اطلاعات اتصال به من بی نهایت ……….. نشون می ده .
ممنون می شم اگه بتونید راهنماییم کنید.
ممنون از سایت عالیتون.
سلام – فکر میکنم برنامه طوری هست که اگر نتونه به wifi کانکت بشه نقطه نشون میده !
قبل از پروگرام باید خط های زیر رو با نام و کلمه عبور وایفای خودتون جایگذین کنید.
const char* ssid = "noobyir";
const char* password = "noobynooby";
با سلام و احترام خدمت جناب زئوس کبیر
خواستم تشکر کنم . حق با شما بود وقتی نمی تونست کانکت بشه …. می داد. البته نمی دونم چرا یه بار وصل شد.احتمالا یه کاری کرده بودم.
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/udp-examples.html
این سایت خیلی کمک کرد بفهمم قضیه چیه و البته یه نرم افزار هم داشت که می تونستم ارسال و اکنالیج رو ببینم تا بفهمم چطور کار می کنه . Packet Sender.گفتم بزارم شاید کسی مثل منم پیدا بشه. 🙂
همواره موفق و موید باشید و دنیا بر وفق مرادتون باشه .
سلام و درود خدمت شما
تشکر میکنم برای به اشتراک گذاری دانسته های خودتون ، قطعا بسیار ارزشمند هست
سلام
ممنون از وقتی که گذاشتین . توی این برنامه مشکلی نداشتم . یه برنامه دیگه بود . راستش اصلا . در برنامه نقطه ای نبود . گفتم شاید baud rate باشه تو حالت های دیگه ؟ می داد و تنها در یک حالت …. می داد .
خیلی ممنون.
اگه ممکنه می تونید راهنمایی کنید چطور یه بسته udp ارسال کنم.
ببخشید تازه دارم esp کار می کنم . می دونم سوالم خیلی سطح پایینه.
موفق و تندرست باشید.
سلام
من روی esp8266 با آردوینو و فلشر برنامه ریختم
ولی تو سریال مانیتور نمیتونم جواب بگیرم
وقتی at میزنم هیچی برنمیگردونه
فقط در مورد یکی دو تا از example های خود آردوینو تونستم نتیجه رو تو سریال مانیتور ببینم مث scanwifi
و گاهی هم چرت و پرت نشون میده
مشکل از چیه؟
سلام دوست عزیز ، ببینید وقتی که با آردونو برنامه رو توی esp8266 آپلود می کنید برنامه شرکتی اون پاک میشه یعنی دیگه نمیتونه جواب AT رو بده چون اون برنامه پاک شده ؛ این که توی یه برنامه جواب گرفتید نشون میده که فرایند طی شده درسته یعنی پورت سریال و نحوه پروگرام کردن درسته ، پس تنها احتمالی که میتونم بدم ، اینه که باوود ریت برنامه رو درست تنظیم نکرده باشید ، به صورت پی فرض روی 9600 هست ، اگر برنامه شما از باوود ریت دیگه ای برای انتقال داده استفاده کنه باید اون باوود ریت رو توی نرم افزار مانیتور انتخاب کنید.
سلام
باتشکر از راهنماییتون
اون که گفتید فایل شرکتی پاک شده رو پیگیری کردم
وقتی روش فایل باینری at firmware ریختم برای at بالاخره ok برگردوند
فعلن همنیجا متوقف شدم برم جشن بگیرم که شیلدم راه افتاده ^_^
دوباره با تشکر از راهنمایی هاتون
خواهش میکنم دوست عزیز
خوشحالم که مساله رو رفع کردید ^_^
سلام
من دو هفته اس گرفتار راه اندازی یه شیلد وای فای چینی هستم -_-
شیلدش esp8266 wifi shiald versiono 1.0 ئه
هر کاری میکنم نمیتونم راه بندازمش
کمک میخام 🙁
سلام دوست عزیز ، من با این ماژول کار نکردم ولی توی سرچی که انجام دادم ، مشخصه که شما به چند روش میتونید از این شیلد استفاده کنید ، اول این که شیلد شما توسط AT کامنت توسط برد آردوینو زیری هندل بشه ، دوم این که خود برد شما پروگرام بشه و برنامه آردوینو روش ریخته بشه ، حالا ترکیبی هم میتونه باشه !
اما برای این که بدونی چطور کلید ها رو تنظیم کنی که پروگرامر برد آردوینو رو پروگرام کنه یا شیلد رو میتونی به لینک زیر مراجعه کنی ، توضیحات خوبی در این رابطه داده
ESP8266 WiFi Shield v1.0 WangTongze
سلام ممنون از مطالب خیلی عالیتون
من درست متوجه نشدم
بعد از همه ی اینکارها چطور سیستم را تست میکنید
از طریق اینترنت یا شبکه
چطور؟؟
خیلی ساده است ، همانطور که میبیند از طریق ssid و pass که درون برنامه تعریف شده به wifi متصل میشه
و پکت های دریافتی از طریق پروتکل udp را بر روی پورت سریال مشاهده خواهید کرد.
چطوری فریمور رو به حالت دیفالت at command برگردونیم؟ من چندید فریمور و چندید برنامه فلشر دانلود و تست کردم به حالت دیفالت برنگشت
آخرین ورژن فریمور (از اینجا) رو دانلود کنید و روی ماژول پروگرام کنید.