ESP8266でSmartConfigを試してみた

長らく放置していたESP8266基板ですが、やっと動かしました。前回の記事から数えて約1年(ぉぃ)。回路図の定数に不適切な部分があってブートローダから先に進んでなかったのと、秋月のFT234X搭載の超小型UART変換基板だとなぜかLinux側が固まってしまうという事象に悩まされたためです(汗)。

で、まだ最低限の機能しか試してないのですが、回路図はこんな感じです。回路図の電源周りにいろいろわけのわからないFETが入っていますが、これはソフトウェア制御で電源OFFできるようにするのと、電池使用時に電源電圧を自身で測定できるようにするためです。電池を使えば Amazon Dash Button 相当のことができる予定です。

回路図

UART変換基板は結局秋月のAE-TTL-232Rを使いました。

開発環境はArduino IDE 1.6.12を使っています。昔調べた方法でボードマネージャでESP-8266を使えるようにして、ボードはGeneric ESP8266 Module、FlashメモリサイズはESP-WROOM-02に合わせて1M(64K SPIFFS)を選択しました。

2016-11-05-02-29-33

さらに1年間の進化は素晴らしいもので、smartconfigというWiFi周りの設定をAndroidスマートフォンでやる仕組みが登場していました。ArduinoのコードはGitHubのここから持ってきました。少しこの基板にあわせて修正したのが以下のファイルです。

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

void setup() {
  int cnt = 0;  

  // set for STA mode
  WiFi.mode(WIFI_STA);
  
  // put your setup code here, to run once:
  Serial.begin(9600);
  
  // led status at pin16
  pinMode(12,OUTPUT);
  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  
  //configure pin0 
  pinMode(0, INPUT_PULLUP);

  // deplay for 2 sec for smartConfig
  Serial.println("2 sec before clear SmartConfig");
  delay(2000);
  
  // read pullup
  int isSmartConfig = digitalRead(0);
  if (isSmartConfig==0) {
    // bink for clear config
    blinkClearConfig();
    Serial.println("clear config");
    // reset default config
    WiFi.disconnect();

  }

  // if wifi cannot connect start smartconfig
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if(cnt++ >= 15){
       WiFi.beginSmartConfig();
       while(1){
           delay(500);
           if(WiFi.smartConfigDone()){
             Serial.println("SmartConfig Success");
             blinkSmartConfig();
             break;
           }
       }
    }
  }

  Serial.println("");
  Serial.println("");
  
  WiFi.printDiag(Serial);

  // Print the IP address
  Serial.println(WiFi.localIP());

}


void blinkSmartConfig() {
    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(50);              // wait for a second 
    digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
    delay(50);
}

void blinkClearConfig() {
  int i=0;
  while(i<=3) {
    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(100);              // wait for a second 
    digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
    delay(100);
    i++;
  }
}

void blinkStartConfig() {
  pinMode(13,OUTPUT);
  int i=0;
    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
}


void loop() {
  int isSW1 = digitalRead(0);
  if(isSW1==0){
    for(int i=5;i>0;i--){
      delay(1000);
      Serial.println(i);    
    }
    Serial.println("Power off");    
    delay(500);
    pinMode(15,OUTPUT);
    digitalWrite(15, HIGH);   // Power-off the board (HIGH is the voltage level)
    delay(5000);
  }
  delay(100);
  digitalWrite(12, 1-digitalRead(12));   // Blink the LED
}

修正したのは起動時のGPIO12のLEDの点灯と、ステータスのGPIOをGPIO16からGPIO13に変更、初期化が完了したら電源OFFする制御を追加したことです。これをコンパイルしてボードに書き込んでやります。

シリアルモニタで動作を確認しながら、スマートフォンで「ESP8266 SmartConfig」というアプリを動作させてESP8266モジュールに接続させる先のSSID(スマートフォンがつながってるSSIDが勝手に表示されます)と、パスワードを入力してCONFIRMを押してしばらく待つとESP8266側の接続設定がされるという便利なものです。

設定したSSIDとパスワードはフラッシュメモリ内に保存されて、次回は勝手にロードしてくれます。(上記のソースでは、起動後2秒たった瞬間にGPIO0がLレベルだと設定をクリアして再度設定待ちになります)

<���������$�������ɕ����Ɂ�����
�����5R�................SmartConfig Success
.SmartConfig Success
.SmartConfig Success


Mode: STA
PHY mode: N
Channel: 4
AP id: 0
Status: 5
Auto connect: 1
SSID (17): xxxxxxx-yyyyyy-z
Passphrase (10): xxxxxxxxxx
BSSID set: 1
??.??.???.??
5
4
3
2
1
Power off

上記は電源投入〜SmartConfigによる設定〜APへの接続〜シャットダウンまでのシリアルコンソールのログです。楽でいいですね!

3 Replies to “ESP8266でSmartConfigを試してみた”

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)