#127Avançado

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.

4.4(21)
33 concluído
Conexão Wi-Fi STA com ESP32 e display LCD
Conectar o ESP32 à rede sem fio de casa é o primeiro passo de qualquer projeto que acessa a internet. Quando a conexão é estabelecida, a luz da placa fica acesa e o pequeno display alterna a cada três segundos entre o endereço da placa na rede e a intensidade do sinal, descrita em palavras que vão de excelente a muito fraco. Se a conexão cair, a luz pisca e a placa tenta se reconectar a cada 30 segundos.

Vídeo

Esquema do circuito

Conexão Wi-Fi STA com ESP32 e display LCD - Circuit

Código-fonte

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

Perguntas 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.