ESP8266は簡単にWi-Fiが使えてArduinoでプログラミングができるので非常に使い勝手がいいのですが、Wi-FiのSSIDやパスワードをプログラムに書くのが一般的になっていていい手段がないものかと常々思っていたんです。
以前、ESP8266をAP(アクセスポイント)モードにしてWebサーバーを動かし、SSIDとパスワードの入力後にSTA(ステーション)モードで再起動するようなことをしたことがあるのですが、Wi-Fi設定のためだけのコードが本来行いたかったコード量と変わらなくなってしまったりして、うーん...という感じになっていました。
そんな時にESP8266のWi-Fiを設定するアプリがあると教えてもらったのが「ESP-TOUCH」です。
でも、その時はドキュメントをちらちらっと読んでArduinoでは使えないのかなっと思ってしまったんです。
ESP-TOUCHアプリ
EspressifのサイトにはAndroidとiOS用のアプリがダウンロードできるように見えますが...
「Download」をクリックするとソースプログラムのあるGitHubのサイトに飛びます!
自分でmakeしなくてはいけないのか!っと一瞬思いましたが、冷静になってググってみたら、iOSはEspressifがApp Storeに登録したアプリが見つかりました。
※2020/12/15追記 12/11にiOS 14.0に対応したバージョン2.1.0がリリースされていました。(アイコンが新しくなっています。)
このバージョンだと起動後に「EspTouch」と「EspTouch V2」が選べるようになっていますが、「EspTouch」の方で動きます。
※2020/5/8追記 iOSでうまく動かない現象が起きているようです。
しかし、Androidは個人名のアプリしか見つかりません。
ぼくはAndroidしか持っていないので、仕方なく評判の良さげな2番目のアプリを使うことにしました。
EspTouchアプリを起動すると最初に「位置情報」の許可を求められます。ここで許可しないとスマホが繋がっているSSIDとBSSIDが表示されなくなります。また、ESP8266は2.4GHzにしか対応していないので、EspTouchを使うときはスマホを2.4GHzのWi-Fiに繋げておく必要があります。
ESP8266の準備ができていたら、Wi-Fiのパスワードを入力して一番下の「CONFIRM」ボタンをタップします。
すると構成中のダイアログが表示されて...
構成が終わると、構成されたESP8266のBSSIDとIPアドレスが表示されます。
ESP8266 Smart Config
ESP8266でもArduinoでESP-TOUCHが使えるとわかったのは、このドキュメントのSmart Configセクションを読んだからです。
SSIDとパスワードを含んだ特別なパケットを探査するみたいなことと、次の3つのファンクションがあるということが書かれています。
WiFi.beginSmartConfig() WiFi.smartConfigDone() WiFi.stopSmartConfig()
実際の使用例はこんな感じになります。
int i = 1; Serial.print("Connecting"); while (WiFi.status() != WL_CONNECTED) { if (i++ > 20) { // 10 seconds Serial.println("Smart Config Start!"); WiFi.beginSmartConfig(); while(!WiFi.smartConfigDone()) { delay(500); Serial.print("."); } Serial.println("Smart Config Done!"); } delay(500); Serial.print("."); }
簡単に説明すると、Wi-Fiに10秒間接続できなかったらSmart Configを開始してSmart Configが終了するまで待っています。WiFi.beginはありません。
ESP8266は前回接続したWi-FiのSSIDとパスワードを不揮発メモリに保存するようになっていて、電源が入ると自動的に繋ぎにいくようにできているそうなんです。
Blynkを使う場合
普通にBlynkを使うとsetup()に次のようなコードを書いていると思います。
Blynk.begin(AUTH_TOKEN, WIFI_SSID, WIFI_PASS);
でも、Wi-Fi接続は別で行っているので、Wi-Fi接続なしでBlynkサーバーを使うだけのコードにする必要があります。
Blynk.begin(wifiClient, AUTH_TOKEN);
ただし、wificlientが引き数になっている通り、このコードを実行する前に次のコードでBlynkサーバーに接続しておく必要があります。
wifiClient.connect(BLYNK_DEFAULT_DOMAIN, BLYNK_DEFAULT_PORT);
サンプルBlynkプロジェクト
実際に動くものがないと動作がわかりづらいので、サンプルとしてLEDが点滅するだけのプロジェクトを作りました。
LED Widgetで使っているバーチャルピンは「V1」です。
サンプルスケッチ
上のサンプルBlynkプロジェクト用のスケッチです。
/* * ESP8266 Smart Config sample using Blynk * January 16, 2020 * By Hiroyuki ITO * http://intellectualcuriosity.hatenablog.com/ * MIT Licensed. */ #define BLYNK_PRINT Serial // Comment this out to disable prints and save space #include <ESP8266WiFi.h> #include <BlynkSimpleStream.h> // Blynk Auth Token #define AUTH_TOKEN "YourAuthToken" // Global Objects WiFiClient wifiClient; BlynkTimer timer; WidgetLED led(V1); boolean ledON = false; /* * just blink LED. */ void LEDBlink() { if (ledON) { led.off(); ledON = false; } else { led.on(); ledON = true; } } /* * Connect WiFi and Blynk */ void connectWiFiAndBlynk() { if (WiFi.status() != WL_CONNECTED) { BLYNK_LOG2("Connecting to ", WiFi.SSID()); int i = 1; while (WiFi.status() != WL_CONNECTED) { // Smart Config if (i++ > 20) { // 10 seconds BLYNK_LOG(""); BLYNK_LOG("Smart Config Start!"); WiFi.beginSmartConfig(); while(!WiFi.smartConfigDone()) { delay(500); Serial.print("."); } BLYNK_LOG(""); BLYNK_LOG("Smart Config Done!"); } delay(500); Serial.print("."); } BLYNK_LOG("Connected."); BLYNK_LOG1(WiFi.localIP()); wifiClient.connect(BLYNK_DEFAULT_DOMAIN, BLYNK_DEFAULT_PORT); } if (!wifiClient.connected()) { wifiClient.stop(); wifiClient.connect(BLYNK_DEFAULT_DOMAIN, BLYNK_DEFAULT_PORT); } } void setup() { Serial.begin(74880); // Initialize Blynk WiFi.mode(WIFI_STA); connectWiFiAndBlynk(); Blynk.begin(wifiClient, AUTH_TOKEN); // Initialize BlynkTimer timer.setInterval(2000, LEDBlink); // every 2 seconds } void loop() { connectWiFiAndBlynk(); // Check Connection Blynk.run(); timer.run(); }
サンプルスケッチのシリアルモニタ表示例
スケッチとWi-Fi設定を消してArduino IDEでこのサンプルスケッチを書き込んだ後、EspTouchアプリでWi-Fi設定を行ったときのシリアルモニタ表示例です。
通信速度を「74880bps」にしないと文字化けを起こすので注意してください。
誰かのお役に立てれば幸いです!