#127Продвинутый

Подключение ESP32 к Wi-Fi в режиме STA (с экраном LCD)

В этом проекте ESP32 надёжно и устойчиво к сбоям подключается к домашней сети Wi-Fi в режиме станции (STA). SSID и пароль хранятся в отдельном файле secrets.h, чтобы не утекли в Git; настроено автоматическое переподключение, а уровень сигнала RSSI и IP-адрес выводятся на I2C LCD-экран. Встроенный светодиод служит индикатором состояния. Это менеджер подключения уровня реальных устройств.

4.4(21)
34 собрано
Подключение ESP32 к Wi-Fi в режиме STA (с экраном LCD)
Подключение ESP32 к домашней беспроводной сети — первый шаг любого проекта, который выходит в интернет. После подключения огонёк на плате горит постоянно, а маленький экран каждые три секунды по очереди показывает адрес платы в сети и силу сигнала словами — от «отлично» до «очень слабо». Если связь пропадает, огонёк мигает, и плата каждые 30 секунд пытается переподключиться.

Видео

Схема

Подключение ESP32 к Wi-Fi в режиме STA (с экраном LCD) - Circuit

Исходный код

C++ (Arduino IDE)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   Подключение ESP32 к Wi-Fi в режиме STA (с экраном LCD)
4// ─────────────────────────────────────────
5// ESP32 подключается к сети Wi-Fi как станция (STA); IP-адрес и уровень
6// сигнала RSSI сменяют друг друга на I2C LCD 16x2 каждые 3 с. Если связь
7// пропала, повторная попытка каждые 30 с. Встроенный светодиод показывает
8// состояние связи.
9//
10// Пины:
11//   GPIO 2  -> Встроенный светодиод (состояние подключения)
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. Если в папке скетча есть secrets.h (с WIFI_SSID и WIFI_PASS), используется он, не
20// добавляй его в Git. Иначе действует значение по умолчанию для Wokwi; для реального железа впиши
21// свои SSID и пароль!
22#if __has_include("secrets.h")
23#include "secrets.h"
24#else
25const char* WIFI_SSID = "Wokwi-GUEST";
26const char* WIFI_PASS = "";   // У Wokwi-GUEST нет пароля
27#endif
28
29// Настройки пинов и времени
30#define LED_PIN              2          // Встроенный светодиод
31#define WIFI_TIMEOUT_MS      15000      // Тайм-аут первого подключения
32#define WIFI_RECOVER_MS      30000      // Интервал переподключения
33#define SCREEN_SWITCH_MS     3000       // Период смены экрана
34
35LiquidCrystal_I2C lcd(0x27, 16, 2);
36
37unsigned long lastReconnect = 0;      // Последняя попытка (мс)
38unsigned long lastScreenSwitch = 0;   // Последняя смена экрана (мс)
39bool showIpScreen = true;             // Экран IP или RSSI
40
41// RSSI -> качество сигнала
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// Экран: подключение
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// Экран: нет связи
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// Экран: IP-адрес
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// Экран: RSSI (dBm) и качество сигнала
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// Подключается в режиме STA, ждёт до WIFI_TIMEOUT_MS; возвращает true при подключении
90bool connectWiFi() {
91  WiFi.mode(WIFI_STA);
92  WiFi.setAutoReconnect(true);
93  WiFi.setSleep(false);   // Энергосбережение выкл
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  // Пины I2C DevKit V1 по умолчанию
109  Wire.begin(21, 22);
110  lcd.init();
111  lcd.backlight();
112
113  // Заставка 3 с
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  // При подключении светодиод загорается и показывается IP
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  // Без связи светодиод мигает, и каждые 30 с делается попытка переподключения
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  // Подключено: светодиод горит (setAutoReconnect тоже может сам восстановить связь)
153  digitalWrite(LED_PIN, HIGH);
154
155  // При подключении чередовать экраны IP и RSSI
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 подключиться к Wi-Fi 5 GHz?

Нет, ESP32 поддерживает только сети 2,4 GHz. Убедись, что диапазон 2,4 GHz на модеме включён; если с двухдиапазонными сетями есть проблемы, задай для диапазона 2,4 GHz отдельное имя (SSID).

Что означает значение RSSI?

Это уровень сигнала в dBm. −50 dBm — очень хорошо, −70 dBm — приемлемо, а всё ниже −80 dBm — слабо, и связь может обрываться.

Что происходит, когда связь теряется?

Код регулярно проверяет состояние подключения и пытается переподключиться, если связь потеряна. Благодаря этому устройство само возвращается в сеть даже после перезапуска модема.