これまで開発してきた簡易IoTシステム(表示灯の点灯状況を、Webページで確認するシステム)では、WiFi環境を設定するために、WiFiManagerというライブラリを使用しています。
WiFiManagerを使うと、IoTデバイスがWiFiに接続できた時にはステーションモードに、接続できなかった時にはアクセスポイントモードに切り替わります。
また、WiFi環境だけでなく、サーバ情報なども、WiFiManagerを使って、ユーザが後から設定できるようにしています。
ただ、この機能では、ステーションモードとアクセスポイントモードの切り替わりが自動判定なので、明示的にデバイスの環境設定を変更するのが面倒です。つまり、デバイスがWiFiに接続できている限り、WiFi設定の変更フォームが表示されず、よって設定を変更することもできません。
もしも、デバイスがWiFiに接続できている状態で、あえて設定を変更したい場合は、「一旦WiFiルータをOFFにする」か、
- 「WiFi設定をリセットするコマンド」を追加したスケッチを読み込ませる
- 「WiFi設定をリセットするコマンド」を削除したスケッチを読み込ませる
- 新しいWiFi環境を設定
という手順を行う必要があります。
これに対して、新しいアイデアとして、ステーションモードとアクセスポイントモードの切り替えを、自動判定ではなく、スイッチかなにかでユーザ制御できないか?と思いつきました。
IoTデバイスの回路にタクトスイッチを追加し、スイッチを押しながら起動した時はアクセスポイントモードに、それ以外はステーションモードに強制的に設定することができれば、上記を実現することができます。
また、この方式なら、WiFi接続が不安定な時に、デバイスが勝手にアクセスポイントモードに移行してしまう問題も、回避できるかもしれません。もしも回避できれば、現状は時々発生しているデータ抜けの症状が減少するかもしれません。
この実験を行うために、まずはブレッドボードで、タクトスイッチ付きの回路を作ってみました。
次に、WiFiManagerのドキュメントを読んで、所望の機能を実現する方法がないか調べました。すると、ライブラリの中に「OnDemandWiFi」というコマンドを見つけました。名前のとおり、明示的にモード切り替えができるもののようです。
これでうまくいくかと思い、スケッチを書き換えたのですが、どうもうまく動きません。色々と確認を進めていった結果、このコマンドを使った場合、どうもdeep sleepした後は、WiFiに接続できなくなってしまうようです。
deep sleepは本デバイスでは必須の機能なので、残念ながら、今回の改良は諦めることにしました。
と、一旦は諦めたのですが、その後、回避策を思いつきました。
スイッチを押しながら起動した時に「WiFi設定をリセットするコマンド」を実行するようにすれば、WiFiネットワークに接続できないため、自動判定でアクセスポイントモードに移行されることになります。
これにより、デバイスがWiFiに接続できている状況でも、WiFi情報を設定しなおすことができるようになります。
(WiFi接続が不安定な時に、デバイスが勝手にアクセスポイントモードに移行してしまう問題については解決できませんが、これについては諦めます。)
スケッチを更新して動作確認したところ、所望の動作をしてくれました。
なお、この改訂には、回路の変更が必要で、先日作ったばかりのプリント基板も修正が必要になるので、当面は反映せず、他の改訂も必要になった時に、まとめて行うことにしようと思います。