ESP32でWiFi接続を簡単にする「WiFiHelper」ライブラリ開発のリリースノート

はじめに

  • 毎回WiFiの記述を書くのは面倒
  • WiFi接続に失敗した時に再接続を試みたい
  • WiFi接続はライブラリで管理してメインプログラムをキレイに保ちたい
  • WiFi接続に失敗した時の詳細なエラーメッセージを出力したい

こんな私自身の悩みに応えて作ったのが、これから紹介するWiFiHelperライブラリです。

次のようなイメージで、WiFi接続をかんたんに記述できます。

cpp
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.hWiFiHelper.cpp の二つが本ライブラリのソースコードになります。プロジェクトのライブラリディレクトリへ正しく配置してください。

2024年2月時点では、バージョン0.3.5を公開中です。この WiFiHelper は、仕事でも使用してまして、今までに問題なく安定して動いてます。

platformio.iniでインストールする

PlatformIOをお使いの場合は、platformio.inilib_deps項目にリポジトリのURLを書くことで、WiFiHelperをインストールすることができます。

platformio.ini
[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リクエストを送信してデータを受信するプログラムになります。

http_request.ino
#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.hWIFI_CONNECT_TRY_MAXで変更可能です。

【解説】WiFi切断後も、WiFi.onで再接続可能

ESP32を運用している最中に、WiFiが何らかの理由で切断されるかもしれません。そういった場合はWiFi.on()を呼び出してあげれば良いだけです。ですからsetup内でWiFi.on()を呼び出すよりも、ソースコードのようにloop()イベント内のHTTPリクエスト前で呼び出してあげると安心です。

また、wifi.off()でWiFi接続を終了させていますが、常時WiFi接続させる場合は、この処理を省略して構いません。

【解説】WiFi接続時のイベント情報の出力

最後にWiFiHelperでは、WiFi接続時のイベントをフックしてメッセージを出力する実装を行なっています。#defineWIFI_HELPER_PRINT_LOGWIFI_HELPER_PRINT_ERRORを定義いただければ、デバッグに役立つと思います。

ぜひお試しください: GitHub - aragig/WiFiHelper: ESP32におけるWiFi接続のヘルパーライブラリ

\他にもライブラリ作ってます/

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

関連記事