در سه سوت و از طریق 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 را بر عهده داشت. تصویرزیر نمایی کلی از برنامه را نمایش میدهد:
#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ها و تعریف متغیرها
#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 برای پیکربندی اولیهی ماژول استفاده میشود و پس از هربار روشنشدن (ریست شدن)سیستم، در ابتدای کار، یکبار اجرا میشود.
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 با سرعت ۱۹۲۰۰ بیت در ثانیه تنظیم شدهاست. در خطوط بعدی، ماژول تا زمان وصلشدن به شبکهی وایفای صبر میکند و بهمحض اتصال، پیغامی مبتنی بر اتصال را بر روی UART ارسال میکند.
در پایان این روتین نیز، ارتباط UDP فعال میشود و بهطور مستمر، ماژول برروی پورت تعیینشده، به دادههای دریافتی گوشی میدهد.
سوم: برنامهی ابدی
روتین loop تا ابد (تا زمانی که ماژول روشن است) همواره و بهصورت چرخشی اجرا میگردد.
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 بر روی پورت موردنظر دریافت شود، تابع parsePacket تعداد بایتهای دریافتی را برمیگرداند. در صورت غیرصفربودن، بستهی دریافتی توسط تابع read بر روی آرایهی incomingPacket کپی میشود و در نهایت تابع printf آنرا برروی UART قرار میدهد. این فرایند تا ابد ادامه پیدا میکند.
منبع: سیسوگ