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

Видео
Схема

Исходный код
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 — слабо, и связь может обрываться.
Что происходит, когда связь теряется?
Код регулярно проверяет состояние подключения и пытается переподключиться, если связь потеряна. Благодаря этому устройство само возвращается в сеть даже после перезапуска модема.
