ESP32(M5StickC)でWPSを使うと設定ファイルも必要ないし便利ですよ


皆さんESP32でWifiを使うときのIDとPASSってソースファイルに直書きしてますか?
ハードコードが嫌だからSDカードやSPIFFSに保存して再起動の度に読みだしてWiFi.begin(ID,PASS)してませんか?
スマホ経由でリモート設定するにしても保存が必要ですよね?

WPSを使うとそんな手間がなくなるよというライフハックです。

WPSとはなんぞや

WPSって聞いたことあるけど使ったことないって人も多いと思いますが、
一言で言うとルーターのボタンを押すと自動でIDとPASSをルーターが教えてくれて勝手にWiFiが繋がるという機能です

WPSとは? | IODATA アイ・オー・データ機器
https://www.iodata.jp/support/qanda/answer/s18923.htm

ESP32はWPSに対応してるのでまずWPSで接続するスケッチを作成します

サンプルスケッチをGithubからコピペしてくるのですが、

なぜか2.0.0-alpha1用のスケッチがデフォルトで表示されるようになっているのでコンパイルが通りません(Arduino-ESP32の最新は1.0.6)

↓この状態ではコンパイルエラーになる

Tagsの所で1.0.6に変更してからコピペすると使えるようになります

これメチャメチャハマったんですけどヒントをいただけたらびやんさん (@lovyan03 :twitter)さんに感謝します

↓このリンクは1.0.6用です

WPSで接続する

詳細はスケッチを見てもらうとして重要なところだけ抜き出します


void setup() {
  Serial.begin(115200);
  delay(10);
  Serial.println("WiFi started");
  WiFi.begin(); // ID,PASS無しで実行する

  int count = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(500); // 500ms毎に.を表示
    Serial.print(".");
    count++;
    if (count == 10) {
      // 5秒間待ってからWPSを開始する
      // 以下サンプルそのまま
      WiFi.onEvent(WiFiEvent);
      WiFi.mode(WIFI_MODE_STA);

      Serial.println("Starting WPS");
      wpsInitConfig();
      esp_wifi_wps_enable(&config);
      Serial.println(esp_wifi_wps_start(0));
    }
  }
  Serial.println("\nConnected");
}

void loop() {
  // nothing to do here
}

まずサンプルでよくある

  WiFi.begin(); // ID,PASS無しで実行する
  while (WiFi.status() != WL_CONNECTED) {
    delay(500); // 500ms毎に.を表示
    Serial.print(".");

で接続を失敗させ5秒間待ってからWPSをスタートします

WPSの待機状態に入ってからルーターのWPSボタンを長押しすると自動でWPSのシーケンスが始まり勝手に繋がります(サンプルスケッチそのまま)

WPSで繋がったけどIDとPASSはどうなってる?

というのが疑問だと思いますが先ほどWPSでWifiが繋がった状態で再起動するとどうなるでしょう?

IDとPASSを記録してないから接続失敗してまたWPSが走る?

と思われがちですが

実は再起動するだけでWiFiが繋がります

なぜかというと
接続に成功すると「WiFiライブラリが自動でNVSにIDとPASSを記録する」
からです

ESP32にはNVSという特殊な記憶領域がありまして、
デフォルトではWiFiライブラリが自動でID,PASSをNVSに書き込み、
「WiFi.begin()でID,PASSが指定されなかった場合NVSを参照してID,PASSを読み込む」という実装になっています

なのでWPSを使う使わないに関係なく「再起動ごとに設定ファイルからID,PASSを読みだして使用する」という処理は不要です

WiFi.begin()を引数なしで実行して接続失敗したらSDカードなどから読み出すという処理にした方が無駄にSDカードの読み込みが発生しないので良いと思います

まとめ

ルーターを変更したりしてIDとPASSが変わってしまった場合、
・ソースのID,PASSを書き換えて書き込み直す
・スマホからマイコンにアクセスしてID,PASSを入力する
・SDカードを抜いてID,PASSを書き換える
という作業が発生して凄くめんどくさいことになります

ですが、WiFI.begin()を引数なしで実行→接続失敗したらWPSを実行というフローにしておくと
マイコンを再起動する→ルーターのWPSボタンを押すという作業だけでWiFiに接続することができるので相当手間が省けるのではないかと思います

再設定はそんなに起きることはないとは思いますがとりあえず「こんなこともあろうかと」WPSを仕込んでおけば未来の自分が助かるかもしれません(゚∀゚)

ちなみにWPS試してみたいけどWiFiに繋いじゃったから勝手に繋がって試せないよ!
というときはM5BurnerでファクトリリセットすればNVSを含むフラッシュ領域が初期化されるので試せるようになります