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を含むフラッシュ領域が初期化されるので試せるようになります
Author And Source
この問題について(ESP32(M5StickC)でWPSを使うと設定ファイルも必要ないし便利ですよ), 我々は、より多くの情報をここで見つけました https://qiita.com/coppercele/items/6789deea453826916725著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .