آموزش های کاربردیاینترنت اشیاء (IOT)بایگانی مطالب
مقاله جدید

اتصال مجدد ESP32 به شبکه Wi-Fi بعد از قطع اتصال

در این نوشتار نحوۀ اتصال مجدد ESP32 به شبکۀ Wi-Fi (بعد از قطعی ارتباط) رو بهتون نشون می‌دیم. مواردی که در این مقاله بررسی می‌کنیم در زمانی که اتصال اینترنت ESP23 به صورت لحظه ای قطع می‌شه، یا مواقعی که ESP32 به صورت موقت خارج از محدودۀ روتر Wi-Fi است، یا شروع مجدد روتر، قطعی اینترنت مودم یا غیره بهتون کمک می‌کنه.

اتصال خودکار ESP32 به Wi-Fi بعد از قطع اتصال


اتصال مجدد ESP32 به شبکه Wi-Fi بعد از قطعی اتصال

برای اینکه بتونین بعد از قطع شدن اتصال، مجدداً به شبکه Wi-Fi وصل بشین می‌تونین با استفاده از ()WiFi.reconnect دوباره به نقطه دسترسی که  قبلاً بهش وصل شده بودین، وصل بشین.

WiFi.reconnect()

یا می‌تونین ()WiFi.disconnect و به دنبال اون WiFi.begin(ssid,password) رو فراخوانی کنین.

WiFi.disconnect();
WiFi.begin(ssid, password);

یا وقتی اتصال قطع شد می‌تونین ESP32 رو با استفاده از ()ESP.restart ری‌استارت کنین.

شما می‌تونین کدی مثل کد زیر به ()loop اضافه کنین تا هر چند وقت یک بار چک کنه و ببینه بورد به اینترنت وصله یا نه و اگر به اینترنت وصل نبود مجدداً به اینترنت وصلش کنه.

unsigned long currentMillis = millis();
// if WiFi is down, try reconnecting
if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previousMillis >=interval)) {
  Serial.print(millis());
  Serial.println("Reconnecting to WiFi...");
  WiFi.disconnect();
  WiFi.reconnect();
  previousMillis = currentMillis;
}

حتماً متغیرهای previousMillis و interval رو مشخص کنین. متغیر interval نشون میده که هر چند میلی‌ثانیه یک بار، اتصال چک شده (برای مثال 30 ثانیه):

unsigned long previousMillis = 0;
unsigned long interval = 30000;

اینجا نمونه کامل رو براتون گذاشتم.

#include <WiFi.h>

// Replace with your network credentials (STATION)
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

unsigned long previousMillis = 0;
unsigned long interval = 30000;

void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
}

void setup() {
  Serial.begin(115200);
  initWiFi();
  Serial.print("RSSI: ");
  Serial.println(WiFi.RSSI());
}

void loop() {
  unsigned long currentMillis = millis();
  // if WiFi is down, try reconnecting every CHECK_WIFI_TIME seconds
  if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previousMillis >=interval)) {
    Serial.print(millis());
    Serial.println("Reconnecting to WiFi...");
    WiFi.disconnect();
    WiFi.reconnect();
    previousMillis = currentMillis;
  }
}

این نمونه نشون می‌ده که چجوری می‌شه به شبکه وصل شد و هر 30 ثانیه یک بار اگر بورد به اینترنت وصل بود اتصال رو چک کرد. اگه اتصال برقرار نبود، قطع می‌شه و تلاش می‌کنه مجدد به اینترنت وصل بشه.

ساخت لامپ هوشمند با سنسور PIR و ماژول ESP32

یا به جای اون می‌تونین از Wi-Fi Events استفاده کنین تا قطعی اینترنت رو تشخیص بده و برای رفع مشکل تابعی رو فراخونی کنه.


ESP32 Wi-Fi Events

ESP32 می‌تونه رویداد های مختلف شبکه Wi-Fi رو مدیریت کنه. در رویداد های Wi-Fi لازم نیست که به طور مستمر وضعیت Wi-Fi رو چک کنین. وقتی یک رویداد خاص اتفاق می‌افته، به صورت خودکار تابع مورد نظر رو برای رفع مشکل فراخوانی می‌کنه.

اگر اتصال قطع شد یا مجدداً برقرار شد شناسایی رویداد های زیر می‌تونه مفید باشه:

  • ARDUINO_EVENT_WIFI_STA_CONNECTED : ماژول ESP32 در حالت station به یک نقطه دسترسی/hotspot (روتر) وصل می‌شه.


  • ARDUINO_EVENT_WIFI_STA_DISCONNECTED : اتصال ESP32 station به نقطه دسترسی قطع می‌شه.

در بخش بعدی یک مثال کاربردی ارائه دادیم.


اتصال مجدد به شبکۀ Wi-Fi بعد از قطعی اتصال
(
Wi-Fi Events)

رویدادهای Wi-Fi می‌تونن تشخیص بدن که اتصال به Wi-Fi قطع شده و تلاش کنن تا دوباره اتصال رو برقرار کنن (از ARDUINO_EVENT_WIFI_STA_DISCONNECTED استفاده کنین.) نمونه کد رو در این قسمت می‌تونین مشاهده کنین:

#include <WiFi.h>

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

void WiFiStationConnected(WiFiEvent_t event, WiFiEventInfo_t info){
  Serial.println("Connected to AP successfully!");
}

void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info){
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void WiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info){
  Serial.println("Disconnected from WiFi access point");
  Serial.print("WiFi lost connection. Reason: ");
  Serial.println(info.wifi_sta_disconnected.reason);
  Serial.println("Trying to Reconnect");
  WiFi.begin(ssid, password);
}

void setup(){
  Serial.begin(115200);

  // delete old config
  WiFi.disconnect(true);

  delay(1000);

  WiFi.onEvent(WiFiStationConnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_CONNECTED);
  WiFi.onEvent(WiFiGotIP, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP);
  WiFi.onEvent(WiFiStationDisconnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED);

  /* Remove WiFi event
  Serial.print("WiFi Event ID: ");
  Serial.println(eventID);
  WiFi.removeEvent(eventID);*/

  WiFi.begin(ssid, password);
    
  Serial.println();
  Serial.println();
  Serial.println("Wait for WiFi... ");
}

void loop(){
  delay(1000);
}

پروژه سیستم امنیتی قفل درب مجهز به حسگر اثر انگشت


کارکرد کد

در این مثال، سه رویداد  رو اضافه کردیم: وقتی که ESP32 به Wi-Fi وصل می‌شه، وقتی‌که آدرس IP دریافت می‌کنه، وقتی که اتصالش قطع می‌شه (به‌ترتیب زیر):

ARDUINO_EVENT_WIDI_STA_CONNECTED

and

ARDUINO_EVENT_WIFI_STA_GOT_IP

and

ARDUINO_EVENT_WIFI_STA_DISCONNECTED

وقتی ESP32 به نقطه دسترسی وصل می‌شه (Event ARDUINO_EVENT_WIFI_STA_CONNECTED) تابع ()WiFiStationConnected فراخون می‌شه:

 WiFi.onEvent(WiFiStationConnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_CONNECTED);

تابع ()WiFiStationConnected اینکه ESP32 با موفقیت به یک نقطه دسترسی (برای مثال، روتر) وصل شده رو چاپ می‌کنه. با این حال، شما می‌تونین این تابع رو تغییر بدین تا وظایف دیگه‌ای هم انجام بده. (برای مثال، اگر اتصال به شبکه برقراره، LED رو روشن کنه):

void WiFiStationConnected(WiFiEvent_t event, WiFiEventInfo_t info){
  Serial.println("Connected to AP successfully!");
}

وقتی ESP32 آدرس IP رو دریافت می‌کنه، تابع ()WiFiGotIP اجرا می‌شه.

WiFi.onEvent(WiFiGotIP, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP);

این تابع آدرس IP رو در سریال مانیتور چاپ می‌کنه.

void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info){
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

وقتی اتصال ESP32 به نقطه دسترسی (ARDUINO_EVENT_WIFI_STA_DISCONNECTED) قطع بشه، تابع ()WiFiStationDisconnected فراخوانی می‌شه.

WiFi.onEvent(WiFiStationDisconnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED);

این تابع پیامی با این مضمون چاپ می‌کنه که اتصال قطع شده و تلاش می‌کنه تا مجدد اتصال رو برقرار کنه.

void WiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info){
  Serial.println("Disconnected from WiFi access point");
  Serial.print("WiFi lost connection. Reason: ");
  Serial.println(info.disconnected.reason);
  Serial.println("Trying to Reconnect");
  WiFi.begin(ssid, password);
}

جمع‌بندی

همونطور که می‌دونید اتصال مداوم ماژول ESP32 به شبکه Wi-Fi برای مواردی همچون اتوماسیون و مدیریت خانه هوشمند یا همچنین نظارت بر سنسور ها و دوربین ها امری حیاتی هست. در همین خصوص اگر به هر دلیلی اتصال قطع بشه باید ماژول رو طوری برنامه ریزی کنیم تا مجدد بصورت خودکار این اتصال رو به شبکه برقرار کنه. در این مقاله روش‌های مختلف اتصال مجدد ESP32 به شبکه Wi-Fi رو بهتون نشون دادیم که می‌تونید برای اتصال خودکار ESP32 به Wi-Fi استفاده کنید.

این مقاله چطور بود ؟
+1
0
+1
0
+1
0
مشاهده بیشتر

محمد حسنی

علاقمند به حوزه IoT و الکترونیک. در حال حاضر به مدت یکسال است که در تیم سخت افزار سازان نام آور به تولید محتوا مشغول هستم.

نوشته های مشابه

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

دکمه بازگشت به بالا