Open4

ESP32のWiFi接続速度が遅い

ぎきぎんぎきぎん

経緯

PIN割込みでDeepsleepから起動して、WiFiに接続する処理を書いてたら、接続にやけに時間がかかっている事に気づいた。

改善策

色々な方法で高速化できないか調べてみた

  • 処理の最後にちゃんと接続を切る

    • WiFi.disconnect() を挿入する
    • これが一番大切。ないと、ルーターの設定にもよるが、数秒遅くなる
  • DHCPサーバーを利用しないようにする

    • DNSサーバーを指定しない場合は0.0.0.0になる
  • BSSID(APのMACアドレス), channel(周波数帯)を指定する

    • WiFi.BSSIDstr() WiFi.channel()で調べられる

サンプルコード

#include <Arduino.h>
#include <WiFi.h>

const char *SSID = "SSID"; //SSID
const char *password = "PASSWORD"; //PASSWORD
const IPAddress ip(192, 168, 0, 18); //IPv4プライベートアドレス
const IPAddress gateway(192, 168, 0, 1); //デフォルトゲートウェイ
const IPAddress subnet(255, 255, 255, 0); //サブネットマスク
const uint8_t bssid[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //BSSID
const int channel = 11; //WiFiの使用するチャンネル

void setup() {
  Serial.begin(9600);
  unsigned long start_time = millis(); //実行時間計測用
  //WiFi.persistent(true); 接続成功時、WiFiの接続設定を不揮発メモリに保存してくれる。
  //WiFi.setAutoConnect(true); 保存された設定を利用してWiFiに接続する。ただ、今回は明示的に設定しているので意味はない
  //保存する分、無駄に時間と電力を使うので今回は無効にしておく。
  WiFi.mode(WIFI_STA); //APに接続するモード
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(SSID, password, channel, bssid);

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

  Serial.println();
  Serial.println((double)(millis() - start_time) / 1000.0); //接続完了までの時間
  Serial.println(WiFi.localIP());
  Serial.println(WiFi.BSSIDstr());
  Serial.println(WiFi.channel());
  Serial.println(WiFi.dnsIP());
  WiFi.disconnect();
  //切断されるまで待機する。
  while (WiFi.status() == WL_CONNECTED) {
  delay(500);
  Serial.print(".");
  }
}

void loop() {
}

ここまでで平均3.5秒かかっていたのが、1.5秒くらいになった。

ぎきぎんぎきぎん

arduino-esp32のバージョンを下げる

  • ArduinoIDEでESP32を使うためのボードマネージャーの事
  • 1.0.5以降WiFiの接続速度がかなり遅くなったらしい。
    画像の設定箇所に、自分の使いたいバージョンのindexファイルのURLを張り付けるとバージョンを選択できるようになる。
    僕が早くなる事を確認できた1.0.4を使う場合は、これを張り付ければいい。
    これで、さらに約1.0秒早くなり、最終的に起動時からで0.58秒、 Deepsleepからの復帰からで0.52秒 で繋がるようになった。

    選べるようになる
ぎきぎんぎきぎん

あとはAPとかルーターの性能次第なので、これ以上プログラム側でやれる事はないと思う