「ESP32のWiFi設定を変えるたびに、コードを書き直して再書き込みしなきゃいけないの?」
そんな悩みは、WiFi Managerを構築することで完全に解決できます。
一度作ってしまえば、スマホやPCのブラウザだけでWiFiの設定・変更が可能になります。
この記事で使用しているのは ESP32-WROOM-32D です。コスパが高く、WiFi・Bluetoothを内蔵しているためIoTプロジェクトの入門に最適なボードです。類似のEPS32でも同じようにWiFi Managerを構築できるのでお手持ちのESP32でお試しください。
ESP32を使ったIoTプロジェクトを進めていると、こんな場面に必ず直面します。
「マイコンなんだからしょうがない」と思いがちですが、実はそれは思い込みです。
WiFi Managerという仕組みを使えば、コードを一切触らずにブラウザだけでWiFi設定を変更できるようになります。

WiFi Managerとは、ESP32自身がWiFiのアクセスポイント(AP)になり、ブラウザ経由でWiFiの設定を受け付けるという仕組みです。

このプロジェクトで使うライブラリは以下の5つです。ArduinoJson のみ外部ライブラリですが、PlatformIOなら platformio.ini に書くだけで自動インストールされるため、手動での導入作業は不要です。
| ライブラリ名 | 役割 | 取得方法 |
|---|---|---|
WiFi.h |
WiFi接続・APモードの管理 | 自動(ボードパッケージ) |
WebServer.h |
HTTPサーバーの起動・ルーティング | 自動(ボードパッケージ) |
Preferences.h |
NVSへのデータ保存・読み込み | 自動(ボードパッケージ) |
ArduinoJson.h |
JSONのシリアライズ・デシリアライズ | 自動(platformio.iniで管理) |
esp_mac.h |
MACアドレスの取得 | 自動(ボードパッケージ) |
ここからは、GitHubで公開しているサンプルコードの中身を順番に解説します。
WiFiに接続できない場合、ESP32はAPモードに切り替わります。
APのSSIDは esp32-test-XXYY の形式(MACアドレスの4桁)で自動生成されるため、複数台使っても名前が衝突しません。
void startAP() {
// Generate AP SSID from the last 2 octets of the MAC address
uint8_t mac[6] = {0};
esp_efuse_mac_get_default(mac);
char apSsid[30];
snprintf(apSsid, sizeof(apSsid), AP_SSID_PREFIX "%02X%02X", mac[4], mac[5]);
WiFi.mode(WIFI_AP_STA);
WiFi.softAP(apSsid, AP_PASSWORD);
Serial.println("[AP] AP Mode started");
Serial.print("[AP] SSID: ");
Serial.print(apSsid);
Serial.print(", IP: ");
Serial.println(WiFi.softAPIP());
}
| メソッド | パス | 説明 |
|---|---|---|
| GET | / |
設定ページのHTMLを返す |
| GET | /scan |
周辺WiFiのSSID一覧をJSONで返す |
| GET | /api/status |
接続状態・IPアドレスをJSONで返す |
| POST | /connect |
SSID・パスワードを受け取り接続テストする |
ブラウザが設定ページを開いたとき、周辺のWiFi一覧を自動取得します。WiFi.scanNetworks() でスキャンし、SSID名をJSON配列として返しています。
void handleScan() {
int n = WiFi.scanNetworks();
StaticJsonDocument<1024> doc;
JsonArray array = doc.to<JsonArray>();
if (n > 0) {
for (int i = 0; i < n; ++i) {
if (WiFi.SSID(i).length() > 0) {
array.add(WiFi.SSID(i));
}
}
WiFi.scanDelete();
}
String out;
serializeJson(doc, out);
server.send(200, "application/json", out);
}
ブラウザからSSIDとパスワードがPOSTで送られると、実際に接続を試みます。
// 指定回数WiFi接続を試みる
WiFi.mode(WIFI_AP_STA);
WiFi.begin(ssid.c_str(), pass.c_str());
int retries = 0;
while (WiFi.status() != WL_CONNECTED && retries < WIFI_RETRY_TEST) {
delay(WIFI_RETRY_DELAY);
Serial.print(".");
retries++;
}
Serial.println();
接続に成功した場合のみ、Preferences(NVS)に認証情報を保存します。
// 接続成功時のみNVSに保存
prefs.begin("wifi", false);
prefs.putString("ssid", ssid);
prefs.putString("pass", pass);
prefs.end();
この記事では ESP32-WROOM-32D を使用しています。WiFi・Bluetoothを内蔵し、入手性も高いためIoTプロジェクトの入門に最適な一枚です。類似のEPS32でも同じようにWiFi Managerを構築できるのでお手持ちのESP32でお試しください。

その他に必要なもの:
sudo apt update
sudo apt install -y python3 python3-pip python3-venv wget
cd ~
wget -O get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py
python3 get-platformio.py
~/.platformio/penv/bin/platformio --version
pio コマンドを使いやすくするため、PATHを通すecho 'export PATH=$PATH:$HOME/.platformio/penv/bin' >> ~/.bashrc
source ~/.bashrc
pio --version
git clone https://github.com/saitogo555/esp32-wifi-manager.git
cd esp32-wifi-manager
pwd
ls
PlatformIOは platformio.ini をもとに、必要な依存ライブラリ(ArduinoJson v6系)を自動取得します。
[platformio]
src_dir = .
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
extra_scripts = pre:tools/embed_html.py
lib_deps =
bblanchon/ArduinoJson @ ^6.21.4
board = esp32dev:ESP32-WROOM-32D を含む汎用ESP32開発ボード設定lib_deps:ArduinoJson v6系を自動取得するよう指定済みextra_scripts:HTMLファイルをヘッダーに変換するスクリプトをビルド前に実行ESP32をPCにUSB接続したあと、PlatformIO CLIでビルド・書き込み・シリアルモニターを実行できます。
pio run
ls /dev/ttyUSB* /dev/ttyACM* 2>/dev/null
たとえば /dev/ttyUSB0 が表示された場合は、そのポートを使って書き込みとモニターを行います。
pio run -e esp32dev -t upload --upload-port /dev/ttyUSB0
pio device monitor -b 115200 -p /dev/ttyUSB0
# ① ビルドのみ
./scripts/build.sh
# ② 書き込み
./scripts/write.sh
# ③ シリアルモニター
./scripts/monitor.sh

./scripts/write.sh で書き込み完了後、シリアルモニターを起動する./scripts/monitor.sh
--- WiFi Manager Starting ---
[AP] AP Mode started
[AP] SSID: esp32-test-A1B2, IP: 192.168.4.1
[HTTP] Server started
esp32-test-XXYY(XXYYはMACアドレスの末尾4桁)に接続する12345678http://192.168.4.1 を開く
main.ino 冒頭の定数を変更するだけで動作を調整できます。
#define AP_SSID_PREFIX "esp32-test-" // APのSSIDプレフィックス(自由に変更可)
#define AP_PASSWORD "12345678" // APのパスワード(8文字以上必須)
#define WIFI_RETRY_MAX 20 // 起動時の接続リトライ回数
#define WIFI_RETRY_DELAY 500 // リトライ間隔(ミリ秒)
http://192.168.4.1にアクセスしても画面が開かない スマホのモバイルデータ通信がオンの場合、ESP32のAPではなくモバイル回線が使われることがあります。WiFi接続後、一時的にモバイルデータをオフにして再度アクセスしてみてください。
PlatformIOのターミナルで pio run --target erase を実行すると、NVSを含む全フラッシュが消去されます。
USBデバイスをWSL2に転送する usbipd コマンドを使うことで対応できます。
winget install --interactive --exact dorssel.usbipd-win
# Windows PowerShell(管理者)で実行
usbipd list
usbipd bind --force --busid <BUSID>
usbipd attach --wsl --busid <BUSID>
接続後、WSL2上では /dev/ttyUSB0 としてデバイスが認識されます。
WiFi.softAP(apSsid) のようにパスワード引数を省略するとオープンAPになります。ただし誰でも接続できるためセキュリティリスクがあります。テスト環境のみでの使用を推奨します。
ESP32シリーズ全般(ESP32-S3など)でも基本的な動作は可能ですが、MACアドレス取得のAPIや一部ピン配置が異なる場合があります。動作確認済みなのはESP32-WROOM-32Dです。
WiFi Managerを使えば、コードを一切触らずにブラウザだけでESP32のWiFi設定を変更できるようになります。
ESP32-WROOM-32Dはコスパが良く入手性も高いため、IoTプロジェクトの入門に最適な一枚です。ぜひこのWiFi Managerと組み合わせて試してみてください。