آموزش تنظیمات و پیکربندی وای فای ESP32 از طریق بلوتوث

فهرست مطالب

مقدمه

اگر به دنبال کشف امکانات بی پایان میکروکنترلرهای سری ESP32 هستید، به جای درستی آمده اید. تمامی بردهای مبتنی بر ESP32 دارای وای فای و بلوتوث داخلی هستند. وایفای به ESP32 اجازه می دهد تا به اینترنت متصل و با دستگاه های دیگر ارتباط برقرار کند. در حالی که بلوتوث، ارتباط بی سیم بین ESP32 و سایر دستگاه های دارای بلوتوث را فعال می کند. شما می توانید هر یک از آنها را به صورت جداگانه یا هر دو را به صورت همزمان به کار بگیرید.
در این آموزش جامع و گام به گام، شما را با نحوه تنظیمات و پیکربندی وای فای از طریق بلوتوث در پلتفرم ESP32 آشنا خواهیم کرد. چه مبتدی باشید چه با تجربه، این آموزش، دانش و مهارت‌هایی را در اختیار شما قرار می‌دهد تا ESP32 خود را بدون زحمت به اینترنت متصل کرده و از پتانسیل کامل آن استفاده کنید.

ESP32: Configuring WiFi with Bluetooth

آنچه در این آموزش یاد می گیرید

• انتقال اطلاعات با استفاده از بلوتوث داخلی ESP32
• استفاده از داده دریافتی از بلوتوث برای پیکربندی وای فای

مزایای پیکربندی و کنترل وای فای ESP32 با استفاده از بلوتوث

این کار چندین مزیت دارد. در مرحله اول، نیاز به اتصال فیزیکی بین ESP32 و رایانه را برای پیکربندی اولیه وای فای از بین می برد. (مخصوصاً در صورتی که ESP32 در یک دستگاه تعبیه شده یا دسترسی به آن غیر ممکن باشد). علاوه بر این، دیگر نیازی نیست برای تغییر تنظیمات وایفای، ESP32 را مجددا پروگرام کنید. این انعطاف‌پذیری به‌ویژه هنگام استفاده از ESP32 در محیط‌هایی که شبکه وایفای امکان دارد زیاد تغییر کند، بسیار مفید است.

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

ESP32-WROOM × 1
تلفن همراه با سیستم عامل اندروید × 1

نرم افزارهای مورد نیاز

Arduino IDE
Serial Bluetooth Terminal (Android)

تنظیمات و کنترل وای فای ESP32 با استفاده از بلوتوث

گام اول: نصب نرم افزار Serial Bluetooth Terminal بر روی گوشی اندروید

برای نصب این نرم افزار از Google Play، بر روی این لینک کلیک کنید.

ESP32: Configuring WiFi ( Required App)

گام دوم: آپلود کد بر روی ESP32

اولین مرحله، نصب کتابخانه ESP32 Add-on در نرم افزار آردوینو است. پس از نصب، کد زیر را در برد ESP32 آپلود کنید.

#include "BluetoothSerial.h"
#include <WiFi.h>

//#define USE_PIN // Uncomment this to use PIN during pairing. The pin is specified on the line below
const char *pin = "1218"; // Change this to more secure PIN.

String device_name = "ESP32-BT-WIFI-CONTROLLER";
BluetoothSerial SerialBT;

int i = 0;
String incoming_char;
String SSIDIN;
String PASSIN;
String header;
String ssids_array[50];
String network_string;
String connected_string;

int startchar;
int endchar;

long start_wifi_millis;
long wifi_timeout = 10000;

void setup() {
 //pinMode(LED_BUILTIN, OUTPUT);
 Serial.begin(115200);
 // Initialize the output variables as outputs

 SerialBT.begin(device_name); //Bluetooth device name
 Serial.printf("Device name: \"%s\"\n", device_name.c_str());
 //Serial.printf("The device with name \"%s\" and MAC address %s is started.\nNow you can pair it with Bluetooth!\n", device_name.c_str(), SerialBT.getMacString()); // Use this after the MAC method is implemented
 /*#ifdef USE_PIN
 SerialBT.setPin(pin);
 Serial.println("Using PIN");
 #endif*/
 while (!(SerialBT.available()));
 SerialBT.println("Scanning Wi-Fi networks");
 Serial.println("Scanning Wi-Fi networks");
 

 scan_wifi_networks();
A:
 SerialBT.println("Please enter the name of your WiFi.");
 while (!(SerialBT.available()));
 while (SerialBT.available()) {
 char c = SerialBT.read();
 incoming_char += c;
 Serial.write(c);
 }
 if (incoming_char.indexOf("ssid:") >= 0)
 {
 startchar = incoming_char.indexOf('<') + 1;
 endchar = incoming_char.indexOf('>', startchar);
 for (int i = startchar; i < endchar; i++)
 SSIDIN += incoming_char[i];
 Serial.println(SSIDIN);
 }
 else
 {
 SerialBT.println("Error:Enter SSID with following format -> ssid:...");
 goto A;
 }
 incoming_char = "";
 SerialBT.println("Please enter the password of your WiFi.");
 while (!(SerialBT.available()));
 while (SerialBT.available()) {
 char c = SerialBT.read();
 incoming_char += c;
 Serial.write(c);
 }
 if (incoming_char.indexOf("pass:") >= 0)
 {
 int startchar2 = incoming_char.indexOf('<') + 1;
 int endchar2 = incoming_char.indexOf('>', startchar2);
 for (int i = startchar2; i < endchar2; i++)
 PASSIN += incoming_char[i];
 Serial.println(PASSIN);
 }
 else
 {
 SerialBT.println("Error:Enter Pass with following format -> pass:...");
 goto A;
 }
 delay(500);

 SerialBT.println("Please wait for Wi-Fi connection...");
 Serial.println("Please wait for Wi_Fi connection...");
 //disconnect_bluetooth();

 start_wifi_millis = millis();
 const char* ssid = SSIDIN.c_str();
 const char* password = PASSIN.c_str();
 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 if (millis() - start_wifi_millis > wifi_timeout) {
 WiFi.disconnect(true, true);
 SerialBT.println("Could't connect to Wi-Fi...");
 Serial.println("Could't connect to Wi-Fi...");
 }
 }
 SerialBT.println("Connected");
 Serial.println("Connected");

 SerialBT.print("ESP32 IP: ");
 SerialBT.println(WiFi.localIP());
 Serial.print("ESP32 IP: ");
 Serial.println(WiFi.localIP());

 incoming_char = "";
 SSIDIN = "";
 PASSIN = "";
 //while (1);
}

void scan_wifi_networks()
{
 WiFi.mode(WIFI_STA);
 // WiFi.scanNetworks will return the number of networks found
 int n = WiFi.scanNetworks();
 if (n == 0) {
 SerialBT.println("no networks found");
 } else {
 SerialBT.println();
 SerialBT.print(n);
 SerialBT.println(" networks found");
 delay(1000);
 for (int i = 0; i < n; ++i) {
 ssids_array[i + 1] = WiFi.SSID(i);
 Serial.print(i + 1);
 Serial.print(": ");
 Serial.println(ssids_array[i + 1]);
 network_string = i + 1;
 network_string = network_string + ": " + WiFi.SSID(i) + " (Strength:" + WiFi.RSSI(i) + ")";
 SerialBT.println(network_string);
 }
 }
}

void disconnect_bluetooth()
{
 delay(1000);
 Serial.println("BT stopping");
 SerialBT.println("Bluetooth disconnecting...");
 delay(1000);
 SerialBT.flush();
 SerialBT.disconnect();
 SerialBT.end();
 Serial.println("BT stopped");
 delay(1000);
}

void loop() {
 delay(1000);
}

سیر کلی کد ارائه شده به صورت زیر است:
• برقراری ارتباط دوطرفه بلوتوثی بین ESP32 و تلفن هوشمند اندروید
• درخواست از کاربر متصل به بلوتوث ESP32 برای وارد کردن SSID و رمز عبور وای فای مورد نظر
• پردازش داده های ورودی از بلوتوث توسط ESP32
• پیکربندی WiFi و اتصال به آن

توضیحات کد

مرحله اول، بارگذاری کتابخانه های نصب شده برای بلوتوث و وای فای ESP32 است.

#include "BluetoothSerial.h"
#include <WiFi.h>

در گام بعد، پس از انتخاب یک نام برای بلوتوث ایجاد شده توسط ESP32، یک instance برای آن تعریف می کنیم.

String device_name = "ESP32-BT-WIFI-CONTROLLER";
BluetoothSerial SerialBT;

تابع ()Setup
در تابع Setup، اولین کاری که انجام می شود ایجاد یک ارتباط سریال با باد ریت 115200 است.

Serial.begin(115200);

حال، بلوتوث برد ESP32 را فعال می کنیم.

SerialBT.begin(device_name);

سپس با راه اندازی وای فای و اسکن شبکه های اطراف، نام SSID پیدا شده و قدرت سیگنال آنها را در پورت سریال چاپ کرده و به دیوایس متصل به ماژول بلوتوث ارسال می کنیم.

scan_wifi_networks();

کد تابع فوق به صورت زیر است:

void scan_wifi_networks()
{
 WiFi.mode(WIFI_STA);
 // WiFi.scanNetworks will return the number of networks found
 int n = WiFi.scanNetworks();
 if (n == 0) {
 SerialBT.println("no networks found");
 } else {
 SerialBT.println();
 SerialBT.print(n);
 SerialBT.println(" networks found");
 delay(1000);
 for (int i = 0; i < n; ++i) {
 ssids_array[i + 1] = WiFi.SSID(i);
 Serial.print(i + 1);
 Serial.print(": ");
 Serial.println(ssids_array[i + 1]);
 network_string = i + 1;
 network_string = network_string + ": " + WiFi.SSID(i) + " (Strength:" + WiFi.RSSI(i) + ")";
 SerialBT.println(network_string);
 }
 }
}

در اینجا، ابتدا مد کاری وای فای ماژول ESP32 انتخاب می شود. مد کاری وای فای، شامل سه حالت زیر است:
• ESP32 :Station به Access Point متصل می شود (مانند روتر).
Access Point (Hotspot): سایر دستگاه ها می توانند از طریق وای فای به ESP32 متصل شوند.
• ESP32 :Access Point & Station به عنوان Access Point عمل می کند. در عین حال به عنوان Station، به Access Point دیگر نیز متصل است.

از حالت Station برای اتصال برد ESP32 به اینترنت استفاده می کنیم. با اینکار می توانیم از طریق Local Network، به آن متصل شویم. در این حالت، روتر نقش Access Point را بازی می کند و ESP32 به عنوان Station تعریف می شود.
در پایان، تابع scan_wifi_networks، تعداد شبکه های وای فای پیدا شده را به همراه مشخصات آن (SSID و قدرت سیگنال) در سریال مانیتور چاپ می کند.
حال با ارسال پیام از طریق بلوتوث به کاربر، از او می خواهیم SSID شبکه وای فای را وارد کند.

SerialBT.print(""Please enter the name of your WiFi." ");

رشته حاوی SSID و PASS را به وسیله کد زیر توسط ESP32 دریافت و در رشته incoming_char ذخیره می کنیم.

while (SerialBT.available()) {
    char c = SerialBT.read();
    incoming_char += c;
    Serial.write(c);
  }

حال بررسی می کنیم که رشته ورودی، طبق فرمت تعریف شده نوشته شده باشد.

if (incoming_char.indexOf("ssid:") >= 0)
 {
 startchar = incoming_char.indexOf('<') + 1;
 endchar = incoming_char.indexOf('>', startchar);
 for (int i = startchar; i < endchar; i++)
 SSIDIN += incoming_char[i];
 Serial.println(SSIDIN);
 }

در صورتی که متن ارسال شده از طریق بلوتوث، دارای لغت “ssid:” باشد، نام شبکه وای فایی را که بین کاراکتر ‘<’ و ‘>’ قرار دارد، در رشته SSIDIN ذخیره می کنیم.
در صورتی که متن ارسالی فاقد لغت “ssid” باشد، از کاربر می خواهیم که فرمت ارسال داده را رعایت کند. سپس، برنامه را به نقطه A باز می گردانیم تا از آن خط تکرار شود.

else
 {
 SerialBT.println("Enter SSID with following format -> ssid:...");
 goto A;
 }

نقطه A در کد، در ابتدای قسمت دریافت مشخصات وای فای قرار دارد.
در ادامه، عبارت زیر را در درگاه بلوتوث چاپ می کنیم و از کاربر می خواهیم رمز عبور وای فای مورد نظر خود را وارد کند.

  SerialBT.println("Please enter the password of your WiFi.");

مانند SSID، عملیات مشابهی برای PASS انجام می دهیم. کد آن به صورت زیر است.

if (incoming_char.indexOf("pass:") >= 0)
 {
 int startchar2 = incoming_char.indexOf('<') + 1;
 int endchar2 = incoming_char.indexOf('>', startchar2);
 for (int i = startchar2; i < endchar2; i++)
 PASSIN += incoming_char[i];
 Serial.println(PASSIN);
 }
 else
 {
 SerialBT.println("Enter Pass with following format -> pass:...");
 goto A;
 }

حال شبکه وای فای ESP32 را بر اساس داده های دریافتی از بلوتوث، پیکربندی می کنیم.

WiFi.begin(ssid, password);

به مدت 10 ثانیه وضعیت اتصال را بررسی کرده و در صورت عدم موفقیت در اتصال به اینترنت، عبارت خطا را در سریال مانیتور چاپ کرده و به ماژول بلوتوث ارسال می کنیم.

while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 if (millis() - start_wifi_millis > wifi_timeout) {
 WiFi.disconnect(true, true);
 SerialBT.println("Could't connect to Wi-Fi...");
 Serial.println("Could't connect to Wi-Fi...");
 }
 }

همچنین در صورت اتصال موفق، لغت Connected چاپ می شود.

SerialBT.println("Connected");
  Serial.println("Connected");

در نهایت، آی پی ماژول ESP32 در شبکه را برای کاربر نمایش می دهیم.

SerialBT.print("ESP32 IP: ");
  SerialBT.println(WiFi.localIP());
  Serial.print("ESP32 IP: ");
  Serial.println(WiFi.localIP());

برای غیر فعال کردن بلوتوث، خط 88 کد را از حالت کامنت خارج کنید.

//disconnect_bluetooth();

با تابع بعدی، ابتدا ارتباط بلوتوث برد ESP32 با کاربر و سپس ماژول بلوتوث را غیر فعال می کنیم.

void disconnect_bluetooth()
{
  delay(1000);
  Serial.println("BT stopping");
  SerialBT.println("Bluetooth disconnecting...");
  delay(1000);
  SerialBT.flush();
  SerialBT.disconnect();
  SerialBT.end();
  Serial.println("BT stopped");
  delay(1000);
}

گام سوم: اجرای برنامه

پس از آپلود برنامه بر روی ESP32، ابتدا بلوتوث تلفن همراه خود را روشن کرده و به ESP32-BT-Slave متصل شوید. اگر خط 4 را از حالت کامنت خارج کرده باشید، برای اتصال از شما کد میخواهد که باید عدد 1218 را وارد کنید.
حال نوبت به اجرای اپلیکیشن Serial Bluetooth Terminal می رسد. به ترتیب بر روی شماره های 1 تا 3 درج شده در تصویر بزنید. در صورت اتصال موفق به بلوتوث ESP32، متن قسمت 4 نمایش داده می شود.

ESP32: Configuring WiFi (Results1)

پس از مشاهده لغت Connected، یک کاراکتر برای ESP32 بفرستید. برنامه، شبکه های وای فای روشن در اطراف را برای شما نمایش می دهد.

ESP32: Configuring WiFi (Results2)

حال یکی از شبکه های موجود را انتخاب کرده و SSID و Password آن را به صورت جداگانه و با فرمت زیر وارد اپلیکیشن کنید.
ssid:<type your ssid here>
pass:<type your password here>
در صورتی که همه مراحل را به درستی طی کرده باشید، ESP32 به شبکه وای فای متصل شده و آی پی خود را در سریال مانیتور چاپ کرده و به دیوایس متصل به ماژول بلوتوپ ارسال میکند.

ESP32: Configuring WiFi (Results3)

یک گام جلوتر

در این آموزش، نحوه برقراری ارتباط با ESP32 و ارسال و دریافت داده به آن از طریق بلوتوث و تنظیم مشخصات ابتدایی شبکه وای فای را توضیح دادیم.
شما با استفاده از مطالب آموزش داده شده و با کمی ابتکار، می توانید امکانات زیر را اضافه کنید:
1- پیاده‌سازی پروتکل‌های ارتباطی امن مانند رمزگذاری یا احراز هویت برای محافظت از اطلاعات پیکربندی وای فای
2- استفاده از ابزارها یا اسکریپت های اتوماسیون برای خودکار کردن فرآیند پیکربندی وایفای
3- پیاده سازی مکانیسم های رسیدگی و بازیابی خطا در کد پیکربندی وایفای
با اجرای این نکات و ترفندهای پیشرفته، می توانید فرآیند پیکربندی وای فای را در ESP32 بهینه کنید.

همچنین، می توانید دیگر حالت های کاری وای فای ESP32 — Access Point و Access Point & Station— را نیز به کار ببرید. از طریق مد کاری Access Point می توانید ESP32 خود را تبدیل به روتری کنید که نام SSID و رمز عبور آن با استفاده از بلوتوث دستگاه دیگری مثل گوشی اندروید یا یک ESP32 دیگر، قابل تنظیم باشد.
یا با به کارگیری از مد Access Point & Station به همراه بلوتوث، می توانید یک شبکه وای فای گسترده قابل تنظیم از طریق بلوتوث ایجاد کنید.
در هر سه مد کاری، می توانید با راه اندازی یک سرور و اتصال ماژول های مختلف به برد ESP32، داده های مد نظر خود را در آن آپلود و از راه دور مشاهده کنید.

آموزش های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.