自宅近くの里山地域に畑を借り、そこで家庭菜園を楽しみながら、屋外でのIoT実証実験を行っています。
畑には数台のIoTデバイスとモバイルWi-Fiルータ(ソーラー発電で常時稼働)を設置し、各IoTデバイスからモバイルWi-Fiルータ経由でWebサーバにデータを送信しています。
さて、畑に新たなIoTデバイスを設置する際には、まず自宅でIoTデバイスの製作と動作確認を行い、それを畑に持っていって設置することになります。
その際、自宅と畑とではWi-FiネットワークのSSIDやパスワードが異なるため、自宅での動作確認が完了した後、スケッチ中のSSIDとパスワードを変更してデバイスに再書き込みを行った上で畑に設置する必要があります。
畑に設置するIoTデバイスは防水ケースに収納していることが多く、スケッチを書き込む度にケースから取り出す必要があったりと、このスケッチ書き換え作業は結構面倒です。
自宅と畑とでスケッチを書き換えなくても良い方法がないかと考えていたところ、最近偶然「WiFiMulti」というものを見つけました。
「WiFiMulti」は、事前に複数のSSIDを登録しておくことで、その中で最も信号強度が強いアクセスポイントに接続してくれる機能のようです。自宅と畑のSSIDを登録しておけば、IoTデバイスがどちらの場所にあってもWi-Fi接続できるはずであり、今回の目的にうってつけです。
そんな訳で、早速「WiFiMulti」を試してみることにしました。
畑に設置しているIoTデバイスは「M5Stamp Pico」や「Timer Camera」など、ESP32を搭載したM5Stack社の製品が多いのですが、今回はより基本的な「ESP32-DevKitC」で試します。2台のモバイルWi-Fiルータを使って動作確認してみることにします。
スケッチは以下のとおりです。
#include <WiFi.h>
#include <WiFiMulti.h>
WiFiMulti wifiMulti;
void setup() {
Serial.begin(115200);
Serial.println("");
Serial.println("### WiFiMulti TEST");
esp_sleep_enable_timer_wakeup(30 * 1000 * 1000);
wifiMulti.addAP("SSID-1", "PASSWORD-1"); // モバイルWi-Fiルータ1
wifiMulti.addAP("SSID-2", "PASSWORD-2"); // モバイルWi-Fiルータ2
Serial.println("### CONNECTING TO WIFI");
if(wifiMulti.run() != WL_CONNECTED) {
Serial.println("### WIFI CONNECT ERROR");
esp_deep_sleep_start();
}
Serial.print("### WIFI CONNECTED TO ");
Serial.println(WiFi.SSID());
WiFi.disconnect(true);
Serial.println("### WIFI DISCONNECTED");
esp_deep_sleep_start();
}
void loop() {
}
「wifiMulti.addAP();」で、2台のモバイルWi-FiルータのSSIDとパスワードを定義しています。
「wifiMulti.run()」でWi-Fi接続し、どのルータに繋がったかをシリアルモニタに出力します。
その後、WI-Fiを切断してディープスリープに移行します。これを30秒毎に繰り返します。
このスケッチを「ESP32-DevKitC」に書き込み、2台のモバイルWi-Fiルータの電源をON/OFFしたり場所を移動させたりして、シリアルモニタに出力される内容を確認しました。
### WiFiMulti TEST
### CONNECTING TO WIFI
### WIFI CONNECT ERROR →Wi-Fi接続不可
:
: モバイルWi-Fiルータ1(SSID-1)を電源ON
:
### WiFiMulti TEST
### CONNECTING TO WIFI
### WIFI CONNECTED TO SSID-1 →モバイルWi-Fiルータ1に接続
### WIFI DISCONNECTED
:
: 少し離れた場所でモバイルWi-Fiルータ2(SSID-2)を電源ON
:
### WiFiMulti TEST
### CONNECTING TO WIFI
### WIFI CONNECTED TO SSID-1 →モバイルWi-Fiルータ1に接続
### WIFI DISCONNECTED
:
: モバイルWi-Fiルータ1(SSID-1)をより離れた場所に移動
:
### WiFiMulti TEST
### CONNECTING TO WIFI
### WIFI CONNECTED TO SSID-2 →モバイルWi-Fiルータ2に接続
### WIFI DISCONNECTED
:
: モバイルWi-Fiルータ2(SSID-2)を電源OFF
:
### WiFiMulti TEST
### CONNECTING TO WIFI
### WIFI CONNECTED TO SSID-1 →モバイルWi-Fiルータ1に接続
### WIFI DISCONNECTED
:
: モバイルWi-Fiルータ1(SSID-1)を電源OFF
:
### WiFiMulti TEST
### CONNECTING TO WIFI
### WIFI CONNECT ERROR →Wi-Fi接続不可
所望のとおりに動作することが確認できました。
今後はこの方法を使うことで、畑へのIoTデバイス設置作業がかなり楽になりそうです。
また、実は畑にはWi-Fi中継機(SSIDは親機と異なる)も設置しているのですが、この中継機のSSIDも登録しておけば自動的に信号強度の強い方に接続してくれるはずで、畑の中でのIoTデバイス設置場所についても、より融通がきくようになりそうです。