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// Conexão Wi-Fi STA com ESP32 e display LCD
4// ─────────────────────────────────────────
5// O ESP32 entra em uma rede Wi-Fi como estação (STA); o endereço IP e a
6// intensidade do sinal RSSI se alternam no LCD I2C 16x2 a cada 3 s. Se a
7// conexão cair, tenta de novo a cada 30 s. O LED embutido mostra o estado
8// da conexão.
9//
10// Pinos:
11// GPIO 2 -> LED embutido (estado da conexão)
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// Credenciais do Wi-Fi. Se existir um secrets.h na pasta do sketch (definindo WIFI_SSID e
20// WIFI_PASS), ele é usado; deixe-o fora do Git. Senão vale o padrão do Wokwi; no hardware real,
21// coloque seu próprio SSID e senha!
22#if __has_include("secrets.h")
23#include "secrets.h"
24#else
25const char* WIFI_SSID = "Wokwi-GUEST";
26const char* WIFI_PASS = ""; // Wokwi-GUEST não tem senha
27#endif
28
29// Configurações de pinos e de tempo
30#define LED_PIN 2 // LED da placa
31#define WIFI_TIMEOUT_MS 15000 // Tempo limite da primeira conexão
32#define WIFI_RECOVER_MS 30000 // Intervalo de reconexão
33#define SCREEN_SWITCH_MS 3000 // Período de troca de tela
34
35LiquidCrystal_I2C lcd(0x27, 16, 2);
36
37unsigned long lastReconnect = 0; // Última tentativa (ms)
38unsigned long lastScreenSwitch = 0; // Última troca de tela (ms)
39bool showIpScreen = true; // Tela de IP ou de RSSI
40
41// RSSI -> qualidade do sinal
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// Tela: conectando
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// Tela: desconectado
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// Tela: endereço 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// Tela: RSSI (dBm) e qualidade do sinal
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// Conecta em modo STA e espera até WIFI_TIMEOUT_MS; retorna true quando conectado
90bool connectWiFi() {
91 WiFi.mode(WIFI_STA);
92 WiFi.setAutoReconnect(true);
93 WiFi.setSleep(false); // Economia de energia desligada
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 // Pinos I2C padrão da DevKit V1
109 Wire.begin(21, 22);
110 lcd.init();
111 lcd.backlight();
112
113 // Tela de abertura por 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 // Se conectado, o LED acende e o IP aparece
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 // Sem conexão, o LED pisca e uma reconexão é tentada a cada 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 // Conectado: o LED fica aceso (setAutoReconnect também pode restaurar a conexão sozinho)
153 digitalWrite(LED_PIN, HIGH);
154
155 // Enquanto conectado, alterna as telas de IP e 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}
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.
