最近ESP8266でWiFiを使うときに、SSIDをコード内に埋め込まなくていいようにするWiFiManagerってのを見つけたので実装してみました。
自分のメモみたいな投稿です。
ライブラリの追加
https://github.com/tzapu/WiFiManager
Arduino IDE に追加しました。
参考サイト
参考にさせていただきました。ありがとうございます。とても助かりました。
・IoTラボ ESP8266 WI-FI SSID、パスワードのオンライン設定
・https://qiita.com/tomorrow56/items/8c2dfdf61d4741ba91de
実装
ほとんど、スケッチ例のまんまですが、再設定させたくて、webにして、resetコマンドをつけました。
直接URLに記載する方式です(^^)
また、DHCPでIPがわかんない問題をクリアするため、mDNS responder で、IPアドレスでなく名前でつなげるようにしました。
http://sample.local/cmd?CMD=reset
いきなりリセットしちゃうので、ちょっと危険かも・・・。
BASIC認証くらいはつけたほうがいいかも・・・
# include <FS.h>
# include <DNSServer.h>
# include <ESP8266WiFi.h>
# include <ESP8266WebServer.h>
# include <WiFiManager.h>
# define SERIAL_SPEED 115200
// Web page (Port 8080)
ESP8266WebServer server(8080);
static const char* cpResponse200 = "<HTML>"
"<BODY style='background-color:#ffffde;font-family:sans-serif;font-size:40px;'>"
"CONTROL WEB<br/><br/>"
"<a href=/cmd?CMD=dummy>DUMMY</a><br/>"
"</BODY></HTML>\r\n";
void setup() {
Serial.begin(SERIAL_SPEED);
Serial.println("");
//WiFiManager
WiFiManager wifiManager;
wifiManager.setBreakAfterConfig(true);
if (!wifiManager.autoConnect("AutoConnectAP", "password")) {
Serial.println("failed to connect, we should reset as see if it connects");
delay(3000);
ESP.reset();
delay(5000);
}
Serial.println("");
Serial.println("WiFi Connected.");
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("");
Serial.println("");
// Set up mDNS responder:
if (!MDNS.begin("sample")) { // sample.local
Serial.println("Error setting up MDNS responder!");
while (1) {
delay(1000);
}
}
Serial.println("mDNS responder started");
Serial.println("");
// WebServer
server.on("/cmd", WebCommand);
server.begin();
// Add service to MDNS-SD
MDNS.addService("http", "tcp", 8080);
}
void WebCommand() {
String cmd = server.arg("CMD");
if (cmd == "dummy") {
// hogehoge...
}
else if (cmd == "reset") { // resetコマンドでWiFi再設定
WiFiManager wifiManager;
delay(1000);
Serial.println("");
Serial.println("WiFi Reset !");
Serial.println("");
wifiManager.resetSettings();
delay(3000);
ESP.reset();
}
server.send(200, "text/html", cpResponse200);
}
void loop() {
MDNS.update();
server.handleClient();
}
使い方
まっさらなマシンだったら、例えば、iPhoneなどで、「AutoConnectAP」のSSIDをみつけ、パスワード=passwordで接続すると、設定画面がでますので、それに入力すればOKです。
一度、設定すると、覚えてますので、次はそのままつながっちゃいます。
Sketchを入れ直しても、覚えてました。
なので、前述のWEBコマンドで、設定をリセットしてあげます。