きっかけ
以前に、Captive PortalをESP32やRaspberry Pi Pico WでSoftAPを使用して実装!という記事を出しましたが、それの発展形です。
動作・できること
はじめに起動するとSoftAPモード(アクセスポイント)で起動します。適当な端末でそのWiFiに接続すると、自動でSSIDとパスワード入力ページが現れます。入力すると保存し、STAモードで入力されたSSIDのWiFiに接続しに行きます。
これによって、スケッチ中にSSIDやパスワードを書く必要がなくなります。
似たようなライブラリがたくさん存在しますが、特徴としては、
・必要最低限な機能と見た目
・CSSの使用なし
・わかりやすい設定
・他のボードへの移植の簡単さ
・SSID・パスワード入力ページにMACアドレスが表示される
って感じです。MACアドレスが表示されるので、DHCPでの自動IPアドレス割り当て後に簡単にarpでIPアドレスを探せます。
対応しているボード
動作確認を行ったボードは以下の通りです。
・ESP32-WROOM
・ESP32-C3
・ESP32-S3
・ESP8266
・ESP8285
・Raspberry Pi Pico W
詳細な使用方法
ArduinoIDE_Captive_Portal_WiFi_configure
Arduinoのライブラリとなっています。ただし、登録はしていないので、手動でインストールする必要があります。
ライブラリのインストール
GitHubのレポジトリを開き、<>Code→Download ZIP でダウンロードします。その後、ArduinoIDEを開き、スケッチ→ライブラリをインクルード→.ZIP形式のライブラリをインストール で先程ダウンロードしたZIPファイルを選択すれば完了です。
コードの説明
サンプルプログラムを見てもらえば大体わかると思いますが、
コンストラクタ
CPWiFiConfigure CPWiFi(BUTTON_PIN, LED_PIN, Stream);
CPWiFiConfigure CPWiFi(BUTTON_PIN, LED_PIN);
BUTTON_PINは設定のリセットを行うためのボタンのピン番号です。LED_PINはWiFiの接続状況やモードを示すためのLEDピンです。Streamはログを出力するためな好きなシリアルを入力してください。LED_PINがプルアップされている場合は、GPIOの番号を負にしてください。ボタンがプルダウンされているときは、同様にGPIOの番号を負にしてください。
bool CPWiFi.begin()
SSID・パスワードが保存されているか探し、保存されていない場合は、SoftAPモードで起動し、保存後にtrueが返ってきます。保存されているとtrueが返ってきます。何かしらに失敗するとfalseが返ってきます。
String CPWiFi.readSSID()
String CPWiFi.readPASS()
それぞれ、SSIDとパスワードを読み出します。String型で返ってくるため、WiFi.begin()に入れる場合は.c_str()でcharに変換する必要があります。
bool CPWiFi.readButton()
SW_PINの状態を監視し、5秒程度押されていた場合は、設定がリセットされ、Trueが返されます。5秒未満の場合もしくは、ボタンが押されていない場合はFalseが返ってきます。
char boardName[25]
好きな名前を入れてください。SoftAPモードのときのSSIDの先頭につく文字です。SSIDが最大32文字なため、25文字までです。
char htmlTitle[100]
好きな名前を入れてください。SoftAPモードのときにCaptive Portalページに表示される文字列です。
サンプルコードの動作
0. 適当なボードに焼いてください。
1. LEDが素早く点滅していることを確認します。
WiFiの設定が完了しておらず、SoftAPモードで起動していることを示しています。もし点滅しない場合は、LittleFSの設定が間違っている可能性があります。スケッチの見直しとシリアルでの出力を見てください。
2. 適当な端末(スマートフォン等)でWiFiの設定を開き、SSIDが「boardName-XXXXXX」となっているアクセスポイントを探し、接続します。
boardNameはスケッチ内で定義されています。XXXXXXはMACアドレスの下6桁です。
3. キャピティブポータルによってSSIDとパスワード入力欄が自動的に現れます。
必要に応じて表示されているMACアドレスをメモしてください。
4. SSIDとパスワードを入力してからsendボタンを押してください。
5. LEDがゆっくりとした点滅に変わったことを確認します。
指定されたアクセスポイントに接続しようとしています。
6. 点滅が停止すれば接続が完了したことを示します。
7. WiFiの設定をリセットしたい場合は、boot_SWを長押しします。そうすると、LEDが点灯するので、話します。その後、素早い点滅(1の状態)に変わるので、リセット完了です。
サンプルコードへの追加
基本的には、サンプルコードをベースに書いて、そこにやりたいことを追加していく感じだと思います。サンプルコードに2箇所ある
// write what you want to do using WiFi
ってところに下にコードを書けばよいです。ただ、WiFiのリセットに使用するボタンと同じボタンを使用する場合は注意が必要で、サンプルで入っているSimple_Switch.inoを参考にしてもらえばいいと思うのですが、ボタンが押されたタイミングで、CPWiFi.readButton()を呼び出してください。そうしないとWiFiのリセットができなくなってしまいます。
oldButton_flag = Button_flag;
Button_flag = digitalRead(BOOT_SW);
if (!Button_flag && oldButton_flag) {
if (CPWiFi.readButton()) {
restart();
}
led = !led; //write what you want to do when pushed button
}
おわりに
なかなかいい感じのライブラリに仕上がりました。初めてちゃんとしたArduinoのライブラリを書いたので勉強になりました。