ESP32でWiFi接続を簡単にする「WiFiHelper」ライブラリ開発のリリースノート
はじめに
- 毎回WiFiの記述を書くのは面倒
- WiFi接続に失敗した時に再接続を試みたい
- WiFi接続はライブラリで管理してメインプログラムをキレイに保ちたい
- WiFi接続に失敗した時の詳細なエラーメッセージを出力したい
こんな私自身の悩みに応えて作ったのが、これから紹介するWiFiHelperライブラリです。
次のようなイメージで、WiFi接続をかんたんに記述できます。
WiFiHelper wifi(WIFI_SSID, WIFI_PASSWORD);
...
loop() {
wifi.on()
// この間に、HTTP clientなどでHTTPリクエストを行う
wifi.off()
}
動作環境
ESP32で動作します。ただし、ESP32のファームウェアは バージョン2.0.2 となります。それ以外のバージョンでは動作未確認です。
ライブラリのインストール
ソースコードはこちらのリポジトリで公開中です。 GitHub - aragig/WiFiHelper: ESP32におけるWiFi接続のヘルパーライブラリ
ArduinoライブラリやPlatformIOライブラリでは公開してませんので、上記のGitHubリポジトリから直接クローンするなりzipダウンロードするなりしてください。WiFiHelper.h と WiFiHelper.cpp の二つが本ライブラリのソースコードになります。プロジェクトのライブラリディレクトリへ正しく配置してください。
2024年2月時点では、バージョン0.3.5を公開中です。この WiFiHelper は、仕事でも使用してまして、今までに問題なく安定して動いてます。
platformio.iniでインストールする
PlatformIOをお使いの場合は、platformio.iniのlib_deps項目にリポジトリのURLを書くことで、WiFiHelperをインストールすることができます。
[platformio]
;src_dir = lib/xxxxx/examples/xxxxxx
[env]
platform = https://github.com/platformio/platform-espressif32.git
board = esp32dev
framework = arduino
monitor_speed = 115200
platform_packages =
framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32#2.0.2
[env:debug]
lib_deps = https://github.com/aragig/WiFiHelper.git
build_flags =
-DWIFI_SSID=\"${sysenv.WIFI_SSID}\"
-DWIFI_PASSWORD=\"${sysenv.WIFI_PASSWORD}\"
-DWIFI_HELPER_PRINT_LOG
-DWIFI_HELPER_PRINT_ERROR
ちなみに、${sysenv.WIFI_SSID} や ${sysenv.WIFI_PASSWORD} は、シェルの環境変数から情報を取り込む書き方です。~/.zsrchなどにあらかじめWiFi情報を書き込んでおくことで、セキュリティ対策になります。
使い方
ここでは examples フォルダにもありますサンプルコードをひとつ紹介して、使い方を解説していきます。
ソースコード(ESP32)
こちらはESP32で動かすソースコードになります。 WiFiHelperを使ってWiFi接続を確立し、簡単なHTTPリクエストを送信してデータを受信するプログラムになります。
#include <Arduino.h>
#include "WiFiHelper.h"
#ifndef WIFI_SSID
#define WIFI_SSID "" // TODO WiFi SSID (2.4GHz only)
#endif
#ifndef WIFI_PASSWORD
#define WIFI_PASSWORD "" // TODO WiFiパスワード
#endif
#include <HTTPClient.h>
WiFiHelper wifi(WIFI_SSID, WIFI_PASSWORD, "WiFiHelper");
struct HttpResponse {
int code;
String body;
};
HttpResponse http_request(String url) {
HttpResponse response;
response.code = -1;
response.body = "";
if (!wifi.on()) { // WiFi接続
response.code = -99;
response.body = "Failed to initialize WiFi";
return response; // WiFi初期化失敗
}
WiFiClient client;
HTTPClient http;
if (!http.begin(client, url)) {
response.code = -98;
response.body = "Failed HTTPClient begin!";
return response; // HTTPクライアント初期化失敗
}
http.addHeader("Content-Type", "application/json"); // コンテントタイプ指定
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
// 正常な応答があった場合、サーバーからの応答を取得(必要に応じて)
response.code = httpResponseCode;
response.body = http.getString();
} else {
}
http.end(); // HTTP接続終了
wifi.off(); // WiFi切断
return response;
}
void setup() {
Serial.begin(115200);
delay(10000);
}
void loop() {
String url = "http://apppppp.com/jojo.json";
Serial.println("HTTP Request... ");
HttpResponse res = http_request(url);
Serial.print("HTTP Response code: "); Serial.println(res.code);
Serial.print("HTTP Response body: ");
Serial.println(res.body);
delay(3000);
}
【解説】初期化、インスタンスの生成
#include "WiFiHelper.h" でライブラリを読み込み、 WiFiHelper wifi(WIFI_SSID, WIFI_PASSWORD, "WiFiHelper"); でWiFi接続情報を設定します。文字列リテラルの "WiFiHelper" は、デバッグ用のラベルになります。WiFiHelperを継承したクラスを作った場合に、インスタンス毎にラベルを指定してデバッグしやすくするために設けました。【解説】WiFi接続を5回トライする
http_request関数でWiFiHelperを使っています。wifi.on()でWiFi接続を試みます。WiFiHelper.cppのソースコードを読んでもらえるとわかりますが、WiFi接続は1回で確立せずに失敗することもあるため、接続できるまでデフォルトで5回トライさせています。この回数はWiFiHelper.hのWIFI_CONNECT_TRY_MAXで変更可能です。【解説】WiFi切断後も、WiFi.onで再接続可能
ESP32を運用している最中に、WiFiが何らかの理由で切断されるかもしれません。そういった場合はWiFi.on()を呼び出してあげれば良いだけです。ですからsetup内でWiFi.on()を呼び出すよりも、ソースコードのようにloop()イベント内のHTTPリクエスト前で呼び出してあげると安心です。
また、wifi.off()でWiFi接続を終了させていますが、常時WiFi接続させる場合は、この処理を省略して構いません。
【解説】WiFi接続時のイベント情報の出力
最後にWiFiHelperでは、WiFi接続時のイベントをフックしてメッセージを出力する実装を行なっています。#defineでWIFI_HELPER_PRINT_LOGやWIFI_HELPER_PRINT_ERRORを定義いただければ、デバッグに役立つと思います。
ぜひお試しください: GitHub - aragig/WiFiHelper: ESP32におけるWiFi接続のヘルパーライブラリ
\他にもライブラリ作ってます/