Conexão Wi-Fi STA com ESP32 e display LCD
Neste projeto, conectamos o ESP32 à rede Wi-Fi de casa no modo estação (STA), de forma segura e tolerante a falhas. Guardamos o SSID e a senha em um arquivo `secrets.h` separado para evitar que sejam expostos no Git, configuramos um mecanismo de reconexão automática e exibimos o nível de sinal RSSI e o endereço IP em um display LCD I2C. O LED integrado funciona como indicador de status. É um gerenciador de conexão pronto para uso em produção.

Vídeo
Esquema do circuito

Código-fonte
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}
165Perguntas frequentes
Por que guardamos a senha do Wi-Fi em um arquivo separado?▾
Se você não adicionar o arquivo secrets.h ao Git (.gitignore), sua senha não será exposta ao compartilhar o código. Essa é uma boa prática de segurança usada em projetos reais.
O ESP32 pode se conectar ao Wi-Fi de 5 GHz?▾
Não, o ESP32 só aceita redes de 2,4 GHz. Verifique se a banda de 2,4 GHz do modem está ativada; se tiver problemas com redes de duas bandas, configure um nome (SSID) separado para a banda de 2,4 GHz.
O que significa o valor de RSSI?▾
É a intensidade do sinal, medida em dBm. −50 dBm é muito bom, −70 dBm é aceitável e abaixo de −80 dBm o sinal é fraco e a conexão pode cair.
O que acontece quando a conexão cai?▾
O código verifica regularmente o status da conexão e tenta se reconectar quando ela cai. Essa reconexão automática garante que o dispositivo volte à rede sozinho, mesmo se o modem reiniciar.
