はじめに
前回(#3 RGB LED編)でハードウェア側の動作確認がすべて完了しました。
今回から通信系に入ります。まずは Wi-Fi 接続です。
やることは単純で、Wi-Fi に繋いで IP アドレスをシリアルモニタに表示するだけ。
……のはずが、シリアルモニタに何も表示されないという問題にぶつかりました。
環境
| 項目 | 内容 |
|---|---|
| ボード | ESP32-S3-DevKitC-1-N8R8 |
| IDE | Arduino IDE 2.x |
| ライブラリ | WiFi.h(ESP32標準) |
パスワードは secrets.h に分ける
Wi-Fi の SSID とパスワードをコードに直接書くのは危険です。GitHub に上げた瞬間に流出します。
別ファイル secrets.h に分離します。スケッチと同じフォルダに作成してください。
// secrets.h
#define SECRET_SSID "自分のWi-Fi名"
#define SECRET_PASSWORD "自分のWi-Fiパスワード"
そして .gitignore に必ず追加します。
secrets.h
.DS_Store
注意:.gitignore は先頭にドットが必要です。
私は以前これを gitignore と書いてしまい、機能せずに secrets.h を GitHub に上げてしまいました。ファイル名は正確に。
また、.gitignore は secrets.h を作る前に用意するのが鉄則です。Git は一度追跡を始めたファイルを、後から .gitignore に書いても無視してくれません。
コード
#include <WiFi.h>
#include "secrets.h"
const char* ssid = SECRET_SSID;
const char* password = SECRET_PASSWORD;
void setup() {
Serial.begin(115200);
delay(1000);
WiFi.begin(ssid, password);
Serial.print("接続中");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("Wi-Fi接続成功!");
Serial.print("IPアドレス: ");
Serial.println(WiFi.localIP());
}
void loop() {
}
while ループで、接続が完了するまで 0.5 秒ごとにドットを表示しながら待ちます。
つまずき① ライブラリ名のタイポ
書き込もうとしたらエラーが出ました。
fatal error: Wi-Fi.h: No such file or directory
1 | #include <Wi-Fi.h>
原因は単純で、ハイフンを入れてしまっていたことです。
#include <Wi-Fi.h> // ❌
#include <WiFi.h> // ⭕️
日本語だと「Wi-Fi」とハイフン付きで書くので、つい癖で入れてしまいました。プログラム上は WiFi(ハイフンなし、F は大文字)です。
フォルダ名は 05_Wi-Fi_Test のようにハイフンありでも問題ありませんが、#include の中身は正確でなければいけません。
つまずき② シリアルモニタに何も表示されない
タイポを直して書き込みは成功。シリアルモニタを開きました。
しかし、何も表示されません。
真っ白のまま、ドットの1つも出てきません。
コード自体はシンプルなので、間違っているようには見えませんでした。「これは設定の問題だろうな」とは思ったのですが、何をどう直せばいいのか分からず、結局 AI に聞いて解決しました。
原因:setup() の出力は一瞬で流れる
ESP32 は電源が入った瞬間、あるいは書き込み直後に setup() を実行します。
今回のコードは、出力がすべて setup() の中にあります。
void setup() {
Serial.println("Wi-Fi接続成功!"); // ここで出力
Serial.println(WiFi.localIP());
}
void loop() {
// 空っぽ
}
つまり 起動直後の数秒間しか出力されません。
シリアルモニタを開くのが少しでも遅れると、その出力は流れ去ってしまいます。loop() が空なので、二度と表示されることはありません。
解決:リセットボタンを押す
シリアルモニタを開いた状態で、ボード上の RST(リセット)ボタンを押す。
これだけです。
リセットすると setup() が最初から実行され、今度はシリアルモニタが開いているので出力が見えます。
接続中.....
Wi-Fi接続成功!
IPアドレス: 192.168.1.42
表示された瞬間は素直に嬉しかったです。
他に確認すべきこと
リセットで解決しない場合は、以下も確認してください。
① ボーレートが 115200 か
シリアルモニタ右下のドロップダウンを確認します。コード側の Serial.begin(115200) と一致していないと、文字化けするか何も出ません。
② USB CDC On Boot の設定
ツール メニューにある項目です。ESP32-S3 は USB 端子が2つあり、どちらに挿しているかで適切な設定が変わります。
| 挿している端子 | 推奨設定 |
|---|---|
| UART側 | Disabled |
| USB側 | Enabled |
私は UART 側を使っているので Disabled のままで動きました。
③ delay を入れる
void setup() {
Serial.begin(115200);
delay(1000); // シリアルの準備を待つ
...
}
Serial.begin() の直後は通信が安定していないことがあります。1秒待つと確実です。
根本的な対策:loop() でも出力する
毎回リセットを押すのが面倒なら、loop() の中で定期的に状態を出力する手もあります。
void loop() {
Serial.print("IPアドレス: ");
Serial.println(WiFi.localIP());
delay(5000);
}
デバッグ中はこうしておくと、いつシリアルモニタを開いても状況が分かります。
まとめ
| 症状 | 原因 | 対処 |
|---|---|---|
Wi-Fi.h: No such file |
ハイフンを入れた |
WiFi.h に修正 |
| シリアルモニタが真っ白 | setup()の出力を見逃した | RSTボタンを押す |
学んだこと
① タイポは日本語の癖から生まれる
「Wi-Fi」という日本語表記が染み付いていると、WiFi と書くべき場面でハイフンを入れてしまいます。エラーメッセージをよく読めば Wi-Fi.h と書かれているので、すぐ気づけるはずでした。
② 「動かない」には表示されていないだけの場合がある
プログラムは正しく動いていて、Wi-Fi にも繋がっていました。ただそれを見る手段の問題だった、というオチです。
「動いていない」と「見えていない」は別物だと学びました。
③ 分からないときは聞く
設定の問題だろうと当たりはついていましたが、具体的な原因までは辿り着けませんでした。1人で30分悩むより、聞いて5分で解決して次に進む方が結果的に学べます。
これで ESP32-S3 がネットワークに繋がりました。
次回はこの Wi-Fi を使って、ブラウザから CO2 データを見られる Web サーバーを立てます。