知的好奇心 for IoT

IoT関連の知的好奇心を探求するブログです

BlynkでもSmart ConfigでESP8266のWi-FiをESP-TOUCH(スマホのアプリ)を使って設定する方法

ESP8266は簡単にWi-Fiが使えてArduinoでプログラミングができるので非常に使い勝手がいいのですが、Wi-FiSSIDやパスワードをプログラムに書くのが一般的になっていていい手段がないものかと常々思っていたんです。

以前、ESP8266をAP(アクセスポイント)モードにしてWebサーバーを動かし、SSIDとパスワードの入力後にSTA(ステーション)モードで再起動するようなことをしたことがあるのですが、Wi-Fi設定のためだけのコードが本来行いたかったコード量と変わらなくなってしまったりして、うーん...という感じになっていました。

そんな時にESP8266のWi-Fiを設定するアプリがあると教えてもらったのが「ESP-TOUCH」です。

でも、その時はドキュメントをちらちらっと読んでArduinoでは使えないのかなっと思ってしまったんです。

 

ESP-TOUCHアプリ

EspressifのサイトにはAndroidiOS用のアプリがダウンロードできるように見えますが...

f:id:IntellectualCuriosity:20200115234445p:plain

「Download」をクリックするとソースプログラムのあるGitHubのサイトに飛びます!

自分でmakeしなくてはいけないのか!っと一瞬思いましたが、冷静になってググってみたら、iOSはEspressifがApp Storeに登録したアプリが見つかりました。

※2020/12/15追記 12/11にiOS 14.0に対応したバージョン2.1.0がリリースされていました。(アイコンが新しくなっています。)

Espressif Esptouch

Espressif Esptouch

  • ESPRESSIF SYSTEMS (SHANGHAI) CO., LTD.
  • ユーティリティ
  • 無料

このバージョンだと起動後に「EspTouch」と「EspTouch V2」が選べるようになっていますが、「EspTouch」の方で動きます。
※2020/5/8追記 iOSでうまく動かない現象が起きているようです。

Espressif Esptouch

Espressif Esptouch

  • Espressif
  • Utilities
  • Free

しかし、Androidは個人名のアプリしか見つかりません。

f:id:IntellectualCuriosity:20200116002705p:plain

ぼくはAndroidしか持っていないので、仕方なく評判の良さげな2番目のアプリを使うことにしました。

EspTouchアプリを起動すると最初に「位置情報」の許可を求められます。ここで許可しないとスマホが繋がっているSSIDとBSSIDが表示されなくなります。また、ESP8266は2.4GHzにしか対応していないので、EspTouchを使うときはスマホを2.4GHzのWi-Fiに繋げておく必要があります。

ESP8266の準備ができていたら、Wi-Fiのパスワードを入力して一番下の「CONFIRM」ボタンをタップします。

f:id:IntellectualCuriosity:20200116111653j:plain

 すると構成中のダイアログが表示されて...

f:id:IntellectualCuriosity:20200116112815j:plain

構成が終わると、構成されたESP8266のBSSIDとIPアドレスが表示されます。

f:id:IntellectualCuriosity:20200116113041j:plain

 

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-FiSSIDとパスワードを不揮発メモリに保存するようになっていて、電源が入ると自動的に繋ぎにいくようにできているそうなんです。

 

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」です。

f:id:IntellectualCuriosity:20200116133106j:plain

 

サンプルスケッチ

上のサンプル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設定を行ったときのシリアルモニタ表示例です。

f:id:IntellectualCuriosity:20200116134744p:plain

通信速度を「74880bps」にしないと文字化けを起こすので注意してください。

 

誰かのお役に立てれば幸いです!