آموزش ESP32آموزش اینترنت اشیا

تنظیم اتصال خودکار برد ESP32 به قوی ترین وای فای

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

دو روش برای رسیدن به این هدف وجود دارد:

  1. روش پایه RSSI
  2. استفاده از کتابخانه WiFiMulti (توصیه شده)

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

روش 1: روش پایه RSSI

در این روش، ESP32 تمام شبکه‌های وای‌فای در دسترس را در محدوده اسکن می‌کند. برای هر شبکه پیدا شده، ESP32 شاخص قدرت سیگنال دریافتی (RSSI) را تعیین می‌کند. RSSI معیاری برای قدرت سیگنال است و مقدار آن منفی است؛ هرچه به صفر نزدیک‌تر باشد، سیگنال قوی‌تر است. ESP32 مقادیر RSSI همه شبکه‌ها را مقایسه می‌کند و شبکه‌ای را که دارای قوی‌ترین سیگنال است انتخاب می‌کند. پس از شناسایی، ESP32 تلاش می‌کند به این شبکه انتخابی متصل شود.

در ادامه نمونه کد برای پیاده‌سازی این روش آمده است. قبل از بارگذاری روی ESP32، حتماً SSID و رمزهای شبکه خود را جایگزین کنید.

// جایگزین با مشخصات شبکه خود
const char* ssidList[] = {"Network_1", "Network_2", "Network_3"};
const char* passwordList[] = {"password1", "password2", "password3"};

پس از اعمال این تغییرات، کد را بارگذاری کنید.

#include "WiFi.h"

// جایگزین با مشخصات شبکه خود
const char* ssidList[] = {"Network_1", "Network_2", "Network_3"};
const char* passwordList[] = {"password1", "password2", "password3"};

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  Serial.println("Scanning for Wi-Fi networks...");

  int n = WiFi.scanNetworks();
  if (n == 0) {
    Serial.println("No networks found.");
    return;
  }

  int maxRSSI = -1000; // مقدار اولیه بسیار پایین
  int bestNetworkIndex = -1;

  for (int i = 0; i < n; ++i) {
    int rssi = WiFi.RSSI(i);
    Serial.printf("%d: %s, RSSI: %d\n", i + 1, WiFi.SSID(i).c_str(), rssi);
    
    for (int j = 0; j < sizeof(ssidList)/sizeof(ssidList[0]); ++j) {
      if (WiFi.SSID(i) == ssidList[j] && rssi > maxRSSI) {
        maxRSSI = rssi;
        bestNetworkIndex = j;
      }
    }
  }

  if (bestNetworkIndex == -1) {
    Serial.println("No known networks found.");
  } else {
    Serial.printf("Connecting to the strongest network: %s\n", ssidList[bestNetworkIndex]);
    WiFi.begin(ssidList[bestNetworkIndex], passwordList[bestNetworkIndex]);

    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }

    Serial.println("\nConnected!");
    Serial.printf("IP Address: %s\n", WiFi.localIP().toString().c_str());
  }
}

void loop() {
  // کاری برای انجام دادن وجود ندارد
}

پس از بارگذاری، مانیتور سریال را با نرخ باود 115200 باز کرده و دکمه EN را فشار دهید.

لیستی از شبکه‌های نزدیک و مقادیر RSSI مربوطه در مانیتور سریال نمایش داده می‌شود. ESP32 به‌صورت خودکار شبکه‌ای را که دارای قوی‌ترین سیگنال است انتخاب و متصل می‌کند، که با بالاترین مقدار RSSI (کمترین مقدار منفی) مشخص می‌شود.

روش 1: روش پایه RSSI

توضیح کد

کد با وارد کردن کتابخانه WiFi.h شروع می‌شود که برای عملکرد وای‌فای در ESP32 ضروری است. سپس دو آرایه تعریف می‌شود: ssidList و passwordList. این آرایه‌ها نام (SSID) و رمز عبور شبکه‌های وای‌فای را که ESP32 باید به آن‌ها متصل شود، ذخیره می‌کنند. حتماً مقادیر نمونه را با مشخصات واقعی شبکه خود جایگزین کنید.

تابع setup() جایی است که عملیات اصلی انجام می‌شود. این تابع ارتباط سریال را راه‌اندازی می‌کند تا پیام‌ها در مانیتور سریال قابل مشاهده باشند و ESP32 را در حالت Station (STA) قرار می‌دهد، یعنی به‌عنوان کلاینت وای‌فای به شبکه موجود متصل می‌شود. سپس اتصال قبلی برای شروعی تمیز قطع می‌شود.

ESP32 سپس شروع به اسکن شبکه‌های وای‌فای در دسترس می‌کند. اگر شبکه‌ای پیدا نشود، پیام مربوطه چاپ شده و عملیات متوقف می‌شود. اگر شبکه‌ای پیدا شود، کد وارد یک حلقه می‌شود تا قوی‌ترین شبکه را بیابد. قدرت سیگنال (RSSI) هر شبکه اندازه‌گیری و با متغیری به نام maxRSSI که مقدار اولیه بسیار پایینی دارد مقایسه می‌شود. کد شبکه‌ای که دارای بالاترین RSSI میان شبکه‌های مشخص شده است را دنبال می‌کند.

پس از اسکن، اگر هیچ‌یک از شبکه‌های مورد نظر یافت نشوند، پیام مربوطه چاپ می‌شود. در غیر این صورت، نام قوی‌ترین شبکه نمایش داده شده و تلاش برای اتصال با استفاده از مشخصات مربوطه از آرایه‌ها انجام می‌شود. ESP32 تا اتصال موفقیت‌آمیز یا زمان اتمام، اتصال را ادامه می‌دهد و نقاطی را برای نشان دادن فرایند چاپ می‌کند. پس از اتصال، پیام “Connected!” به همراه آدرس IP اختصاص داده شده چاپ می‌شود.

تابع loop() در این مورد خالی است زیرا وظیفه اصلی اتصال به وای‌فای در تابع setup() انجام شده است.

روش 2 – استفاده از کتابخانه WiFiMulti (توصیه شده)

در روش دوم از کتابخانه WiFiMulti استفاده می‌کنیم. این کتابخانه مدیریت چندین شبکه وای‌فای را ساده می‌کند. شما مشخصات شبکه‌های مورد نظر خود (SSID و رمز عبور) را به شیء WiFiMulti اضافه می‌کنید. زمانی که تابع wifiMulti.run() فراخوانی می‌شود، به‌صورت خودکار شبکه‌های موجود را اسکن کرده و تلاش می‌کند به قوی‌ترین شبکه در لیست شما متصل شود. در صورت شکست اتصال، به‌صورت خودکار به شبکه بعدی با بهترین سیگنال متصل می‌شود و اطمینان از اتصال پایدارتر را فراهم می‌کند.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

در ادامه نمونه کد برای پیاده‌سازی این روش آمده است. قبل از بارگذاری روی ESP32، حتماً SSID و رمزهای شبکه خود را جایگزین کنید.

#include <WiFi.h>
#include <WiFiMulti.h>

WiFiMulti wifiMulti;

// زمان تایم‌اوت اتصال به هر نقطه دسترسی (AP). در صورت طولانی بودن اتصال، مقدار را افزایش دهید.
const uint32_t connectTimeoutMs = 10000;

void setup(){
  Serial.begin(115200);
  delay(10);
  WiFi.mode(WIFI_STA);
  
  // اضافه کردن شبکه‌های وای‌فای
  wifiMulti.addAP("ssid_1", "password_1");
  wifiMulti.addAP("ssid_2", "password_2");
  wifiMulti.addAP("ssid_3", "password_3");

  // WiFi.scanNetworks تعداد شبکه‌های پیدا شده را برمی‌گرداند
  int n = WiFi.scanNetworks();
  Serial.println("scan done");
  if (n == 0) {
      Serial.println("no networks found");
  } 
  else {
    Serial.print(n);
    Serial.println(" networks found");
    for (int i = 0; i < n; ++i) {
      // چاپ SSID و RSSI هر شبکه پیدا شده
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*");
      delay(10);
    }
  }

  // اتصال به وای‌فای با استفاده از wifiMulti (متصل به SSID با قوی‌ترین سیگنال)
  Serial.println("Connecting Wifi...");
  if(wifiMulti.run() == WL_CONNECTED) {
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }
}

void loop(){
  // اگر اتصال به قوی‌ترین نقطه دسترسی قطع شد، به شبکه بعدی در لیست متصل می‌شود
  if (wifiMulti.run(connectTimeoutMs) == WL_CONNECTED) {
    Serial.print("WiFi connected: ");
    Serial.print(WiFi.SSID());
    Serial.print(" ");
    Serial.println(WiFi.RSSI());
  }
  else {
    Serial.println("WiFi not connected!");
  }
  delay(1000);
}

پس از بارگذاری، مانیتور سریال را با نرخ باود 115200 باز کرده و دکمه EN را فشار دهید.

لیستی از شبکه‌های نزدیک و مقادیر RSSI مربوطه در مانیتور سریال نمایش داده می‌شود و ESP32 به‌صورت خودکار شبکه‌ای را که دارای قوی‌ترین سیگنال است انتخاب و متصل می‌کند.

ویژگی واقعی WiFiMulti در توانایی تطبیق آن است. اگر اتصال به قوی‌ترین شبکه به هر دلیلی قطع شود، کتابخانه به‌طور خودکار به شبکه بعدی با قوی‌ترین سیگنال در لیست شما متصل می‌شود و تضمین می‌کند که ESP32 حتی در محیط‌های با تغییرات سیگنال مداوم، اتصال خود را حفظ کند.

روش 2 - استفاده از کتابخانه WiFiMulti (توصیه شده)

توضیح کد

کد با وارد کردن کتابخانه‌های WiFi.h و WiFiMulti.h شروع می‌شود که برای مدیریت اتصالات وای‌فای در ESP32 ضروری هستند. سپس یک شیء WiFiMulti ایجاد می‌شود که برای ذخیره و مدیریت چندین شبکه وای‌فای استفاده می‌شود.

تابع setup() ESP32 را در حالت Station (STA) قرار می‌دهد و لیستی از شبکه‌های وای‌فای (جفت‌های SSID و رمز عبور) را اضافه می‌کند که ESP32 باید به آن‌ها متصل شود. سپس شبکه‌های وای‌فای موجود در محدوده اسکن می‌شوند. اگر هیچ شبکه‌ای پیدا نشود، پیام مربوطه چاپ می‌شود. در غیر این صورت، جزئیات شبکه‌ها شامل نام، قدرت سیگنال (RSSI) و نوع امنیت نمایش داده می‌شود.

پس از اسکن، ESP32 با استفاده از تابع wifiMulti.run() به‌طور خودکار شبکه‌های موجود را بررسی کرده و تلاش می‌کند به قوی‌ترین شبکه از لیست متصل شود. اگر اتصال موفقیت‌آمیز باشد، پیام تایید همراه با آدرس IP اختصاص داده شده به ESP32 چاپ می‌شود.

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

کدام روش را انتخاب کنیم؟

در نهایت، روش پایه RSSI یک نقطه شروع خوب است. با این حال، اگر به راه‌حل مقاوم‌تر و انعطاف‌پذیرتری نیاز دارید که بتواند به‌صورت خودکار به قوی‌ترین شبکه در میان چندین گزینه متصل شود، استفاده از کتابخانه WiFiMulti بهترین انتخاب است.

5 (1 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

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

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *