ブログ/こばさんの wakwak 山歩き Twitter

2018-05-15 ESP32 は SSID と パスワード を内部で保持する

ESP32 は SSID と パスワード を内部で保持する

| ESP32 は SSID と パスワード を内部で保持するを含むブックマーク

 いつもの趣味の延長でなく、お仕事で ESP を使うことになりそうな案配なのですが、まだ正式発注は受けていない状態ながら先行して着手しちゃってます。

(もし失注だったら気持ちを巻き戻して、「仕事云々は錯覚で、趣味の延長だった」って自分に言い聞かせれば済む)


 本番では ESP8266 ですが、ESP8266 の 1.5 的なシリアルじゃなくて、3つも物理シリアルを使えたり、デバッグに BT-SPP も使えちゃったり(繋ぐ手間が省ける)、等々で融通が利くので、手応えを探りきるあたりまで(試作の試作まで)ESP32 のほうが仕事が早そう、という判断です。

 機種依存に注意しながら8割方は ESP32 で作って、耐久試験・最終調整・最終試験 だけ ESP8266 で流すみたいな。


 いつもは WiFi 接続に必要な情報をプログラムの中で書いちゃってるんですけど、今回は外部から変更が効かないといけないため、WiFiManager なるライブラリを弄り倒している次第ですが、その途中で発覚したことを記事にします。


 ESP32 は前回の SSID/PASS を内部で保持し再利用する

(スケッチを書き換えても接続情報は内部に残ったまま)


 という個人的に驚愕の事実。

 「そんなことも知らなかったのかよ、すっかり既知の、当たり前田のクラッカーだぜ」って方には耳タコの話題になると思うのでブラウザを閉じて下さって大丈夫です。

 それ以上の話題はありません。


 グダグダ書くより検証コードを書いた方が早いですよね

#include <WiFi.h>

const char *ssid = "<YOUR SSID>";
const char *pass = "<YOUR PASSWORD>";

void setup() {
  Serial.begin(115200);

  WiFi.mode(WIFI_STA); 
  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(100);
  }

  Serial.println();
  Serial.print("WiFi connected IP:");
  Serial.println(WiFi.localIP());
}

void loop() {;}

 ssid と pass のところは各自の環境値をセットして下さい。

 コンパイル&書き込み&実行すると、WiFi に繋がって IP アドレスが取れてくると思います。


 至って普通ですが、その同じ筐体を使って次のコードをコンパイルして流し込みます。

#include <WiFi.h>

void setup() {
  Serial.begin(115200);

  WiFi.mode(WIFI_STA); 
  WiFi.begin();

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(100);
  }

  Serial.println();
  Serial.print("WiFi connected IP:");
  Serial.println(WiFi.localIP());
}

void loop() {;}

 ssid やら pass やら、バッサリ削除して WiFi.begin(); だけにしてしまいました。

 接続に必要な認証情報がないので、WiFi.status() はいつまで経っても WL_CONNECTED にならないと錯覚するじゃないですか。


 それがドッコイ、実は繋がってしまうんですよ


 前回使用した認証情報が内部のどっかに記録・保存されて、違うスケッチを書き込んでも内部的に生きたままで、わざわざ明示しなければ前回の情報を再利用して使う、という風のようなのです。


 廃棄したり手放すときには、中身のないダミースケッチを書き込んで終了という風じゃなくて、きちんと erase_flash してやらないといけない、ってこと覚えておいたほうがいいです。


 DOS 窓から実行する場合、\Arduino\hardware\espressif\esp32\tools みたいなとこで

esptool --chip esp32 --port COM3 erase_flash

※ COM3 のところは環境依存


(追記)

 廃棄時注意という風な書き方でしたけれど、同じ筐体をずっと自分で使うのだったら、この特性を逆手に取って「いちいち接続情報をプログラムに書かない」って風がいいかもしれませんね。


 新品を開封したら、自分のところの環境に応じた値で WiFi.begin(ssid, pass); を初回の1回だけ通してやって、以後は無指定 WiFi.begin(); 運用、という風に。