#127上級

ESP32 Wi-Fi STA接続(LCDディスプレイ付き)

このプロジェクトでは、ESP32をステーション(STA)モードで家庭のWi-Fiネットワークに接続し、安全で障害に強い接続を実現します。SSIDとパスワードを別の`secrets.h`ファイルに保存してGitへの流出を防ぎ、自動再接続の仕組みを実装します。RSSIによる信号強度とIPアドレスはI2C LCDディスプレイに表示します。内蔵LEDは状態表示に使います。実運用を想定した接続管理の仕組みです。

4.4(21)
33 完了
ESP32 Wi-Fi STA接続(LCDディスプレイ付き)
ESP32を家庭の無線ネットワークに接続することは、インターネットを使うプロジェクトの第一歩です。接続するとボード上のLEDが点灯し、小さなディスプレイにはネットワーク上のボードのアドレスと信号強度が3秒ごとに交互に表示されます。信号強度は「非常に良好」から「非常に弱い」までの言葉で表します。接続が切れるとLEDが点滅し、30秒ごとに再接続を試みます。

動画

回路図

ESP32 Wi-Fi STA接続(LCDディスプレイ付き) - Circuit

ソースコード

Arduino (C++)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   ESP32 Wi-Fi STA Connection (with LCD Screen)
4// ─────────────────────────────────────────
5// The ESP32 joins a Wi-Fi network as a station (STA); the IP address and
6// the RSSI signal strength take turns on the 16x2 I2C LCD every 3 s. If
7// the link drops it retries every 30 s. The built-in LED shows the link
8// status.
9//
10// Pins:
11//   GPIO 2  -> Built-in LED (connection status)
12//   GPIO 21 -> LCD SDA, GPIO 22 -> LCD SCL
13//   LCD VCC -> 5V (VIN), GND -> GND
14
15#include <Wire.h>
16#include <LiquidCrystal_I2C.h>
17#include <WiFi.h>
18
19// Wi-Fi credentials. If secrets.h exists in the sketch folder (defining WIFI_SSID and WIFI_PASS) it
20// is used, keep it out of Git. Otherwise the Wokwi default applies; for real hardware put your own
21// SSID and password!
22#if __has_include("secrets.h")
23#include "secrets.h"
24#else
25const char* WIFI_SSID = "Wokwi-GUEST";
26const char* WIFI_PASS = "";   // Wokwi-GUEST has no password
27#endif
28
29// Pin and timing settings
30#define LED_PIN              2          // Onboard LED
31#define WIFI_TIMEOUT_MS      15000      // Initial connect timeout
32#define WIFI_RECOVER_MS      30000      // Reconnect interval
33#define SCREEN_SWITCH_MS     3000       // Screen switch period
34
35LiquidCrystal_I2C lcd(0x27, 16, 2);
36
37unsigned long lastReconnect = 0;      // Last retry (ms)
38unsigned long lastScreenSwitch = 0;   // Last screen switch (ms)
39bool showIpScreen = true;             // IP or RSSI screen
40
41// RSSI -> signal quality
42const char* rssiQuality(int rssi) {
43  if (rssi >= -55) return "Mukemmel";
44  if (rssi >= -65) return "Iyi";
45  if (rssi >= -75) return "Orta";
46  if (rssi >= -85) return "Zayif";
47  return "Cok zayif";
48}
49
50// Screen: connecting
51void showConnecting() {
52  lcd.clear();
53  lcd.setCursor(0, 0);
54  lcd.print("Baglaniliyor...");
55  lcd.setCursor(0, 1);
56  lcd.print("Connecting...");
57}
58
59// Screen: disconnected
60void showDisconnected() {
61  lcd.clear();
62  lcd.setCursor(0, 0);
63  lcd.print("Baglanti yok");
64  lcd.setCursor(0, 1);
65  lcd.print("Disconnected");
66}
67
68// Screen: IP address
69void showIpInfo() {
70  lcd.clear();
71  lcd.setCursor(0, 0);
72  lcd.print("IP:");
73  lcd.setCursor(0, 1);
74  lcd.print(WiFi.localIP());
75}
76
77// Screen: RSSI (dBm) and signal quality
78void showRssiInfo() {
79  int rssi = WiFi.RSSI();
80  lcd.clear();
81  lcd.setCursor(0, 0);
82  lcd.print("RSSI:");
83  lcd.print(rssi);
84  lcd.print(" dBm");
85  lcd.setCursor(0, 1);
86  lcd.print(rssiQuality(rssi));
87}
88
89// Connects in STA mode, waits up to WIFI_TIMEOUT_MS; returns true when connected
90bool connectWiFi() {
91  WiFi.mode(WIFI_STA);
92  WiFi.setAutoReconnect(true);
93  WiFi.setSleep(false);   // Power save off
94  WiFi.setHostname("bluegrays-esp32");
95  WiFi.begin(WIFI_SSID, WIFI_PASS);
96
97  unsigned long start = millis();
98  while (WiFi.status() != WL_CONNECTED && millis() - start < WIFI_TIMEOUT_MS) {
99    delay(500);
100  }
101  return WiFi.status() == WL_CONNECTED;
102}
103
104void setup() {
105  pinMode(LED_PIN, OUTPUT);
106  digitalWrite(LED_PIN, LOW);
107
108  // DevKit V1 default I2C pins
109  Wire.begin(21, 22);
110  lcd.init();
111  lcd.backlight();
112
113  // Splash screen 3 s
114  lcd.setCursor(3, 0);
115  lcd.print("BlueGrays");
116  lcd.setCursor(2, 1);
117  lcd.print("Wi-Fi STA v1");
118  delay(3000);
119
120  // If connected, the LED turns on and the IP is shown
121  showConnecting();
122  if (connectWiFi()) {
123    digitalWrite(LED_PIN, HIGH);
124    showIpInfo();
125    lastScreenSwitch = millis();
126  } else {
127    showDisconnected();
128  }
129}
130
131void loop() {
132  // Without a link the LED blinks and a reconnect is tried every 30 s
133  if (WiFi.status() != WL_CONNECTED) {
134    digitalWrite(LED_PIN, (millis() / 500) % 2);
135    if (millis() - lastReconnect > WIFI_RECOVER_MS) {
136      showConnecting();
137      WiFi.disconnect();
138      WiFi.reconnect();
139      lastReconnect = millis();
140      delay(3000);
141      if (WiFi.status() == WL_CONNECTED) {
142        digitalWrite(LED_PIN, HIGH);
143        showIpInfo();
144        lastScreenSwitch = millis();
145      } else {
146        showDisconnected();
147      }
148    }
149    return;
150  }
151
152  // Connected: the LED stays on (setAutoReconnect may also restore the link by itself)
153  digitalWrite(LED_PIN, HIGH);
154
155  // While connected, alternate IP and RSSI screens
156  if (millis() - lastScreenSwitch > SCREEN_SWITCH_MS) {
157    lastScreenSwitch = millis();
158    showIpScreen = !showIpScreen;
159    if (showIpScreen) showIpInfo();
160    else showRssiInfo();
161  }
162
163  delay(50);
164}
165

よくある質問

Wi-Fiのパスワードを別のファイルに保存するのはなぜですか?▾

secrets.hファイルをGitの管理対象から外しておけば(.gitignore)、コードを共有してもパスワードが公開されません。実際のプロジェクトでも使われる安全な管理方法です。

ESP32は5 GHzのWi-Fiに接続できますか?▾

いいえ。ESP32は2.4 GHzのネットワークのみに対応しています。モデムの2.4 GHz帯が有効になっているか確認してください。デュアルバンドのネットワークで問題が起きる場合は、2.4 GHz帯に別の名前(SSID)を設定してください。

RSSIの値は何を表していますか?▾

信号の強さを表し、単位はdBmです。−50 dBmなら非常に良好、−70 dBmなら実用範囲です。−80 dBmを下回ると弱く、接続が切れる可能性があります。

接続が切れるとどうなりますか?▾

コードが接続状態を定期的に確認し、切断されると再接続を試みます。この自動再接続により、モデムが再起動しても機器は自動でネットワークに接続し直します。