ESP32 怎么联网(连上 WiFi)
目标一句话:
让 ESP32 以 STA 模式 连接你家的路由器,拿到 IP 地址,保持稳定在线。
你以后只要记住这套流程,任何 wifi 项目第一步都可以直接套用。
1. 先搞清楚:ESP32 联网的“角色”和模式
ESP32 自带 WiFi,有两种主要工作模式:
-
STA 模式(Station)
-
就像你的手机 / 笔记本:去连一个现成的路由器
-
ESP32 会从路由器拿到一个 IP 地址,比如
192.168.1.123 -
后面所有联网操作(HTTP/MQTT/时钟同步)都是基于这个 IP
-
-
AP 模式(Access Point)
-
ESP32 自己开热点,比如
ESP32_AP -
手机 / 电脑连到它身上
-
常用在“配网、局域控制”这种场景
-
我们现在先学 最常用、也是最基础的:STA 模式连接路由器。
2. 联网的 4 步大纲(你先记这个骨架)
只看概念,不看代码:
-
设置工作模式:STA
WiFi.mode(WIFI_STA); -
启动连接:给它 SSID + 密码
WiFi.begin(ssid, password); -
等待连接成功:轮询
WiFi.status()while (WiFi.status() != WL_CONNECTED) { ... } -
成功后:拿 IP 地址、网关等信息
WiFi.localIP(); WiFi.gatewayIP(); WiFi.subnetMask();
以后你只要看到一个 WiFi demo,本质上就是这四步,只是多了点健壮性处理。
3. 每一步细化讲一下(带一点底层理解)
3.1 WiFi.mode(WIFI_STA);:告诉它“我去连别人”
ESP32 可以:
-
只当 STA:
WIFI_STA -
只当 AP:
WIFI_AP -
同时当 STA+AP:
WIFI_AP_STA
如果你只是想连路由器:
WiFi.mode(WIFI_STA); // 只做客户端
有时会配合断开旧连接用:
WiFi.mode(WIFI_STA);
WiFi.disconnect(true); // 清理上一次连接信息
delay(100);
记住点:
强烈建议显式设置模式,不要全靠默认值。
3.2 WiFi.begin(ssid, password);:发起连接请求
用法:
WiFi.begin("YourWifiName", "YourWifiPassword");
你也可以把这俩放在常量里:
const char* WIFI_SSID = "xxx";
const char* WIFI_PWD = "yyy";
WiFi.begin(WIFI_SSID, WIFI_PWD);
底层会做的事包括:
-
设置 WiFi STA 配置(SSID / 加密方式 / 密码)
-
启动 WiFi 驱动、开始扫描 / 关联 / 四次握手
-
拿 DHCP 地址
这一步是异步的:
你
begin()完,并不是立刻连上,要靠下一步不断检查状态。
3.3 WiFi.status():轮询连接状态
典型写法:
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected!");
几个常见状态值:
-
WL_IDLE_STATUS:空闲 -
WL_DISCONNECTED:断开 -
WL_CONNECTED:连接成功 -
WL_CONNECT_FAILED:连接失败 -
WL_NO_SSID_AVAIL:找不到 WiFi
你现在最需要记住的只有一个:连上就是 WL_CONNECTED。
3.4 WiFi.localIP():拿到 IP,表示“真正进网了”
连上后,可以这样打印:
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
典型结果:
IP address: 192.168.1.123
这就说明:
-
ESP32 作为 STA,已经通过 DHCP 从路由器拿到了 IP
-
在局域网里可以被其它设备访问(TCP/UDP)
-
ESP32 自己也可以发 HTTP、MQTT、NTP 请求出去了
你还可以看更多信息:
Serial.print("Gateway: ");
Serial.println(WiFi.gatewayIP());
Serial.print("Subnet: ");
Serial.println(WiFi.subnetMask());
WiFi.gatewayIP() 的意思是:返回当前这个 WiFi 连接的“默认网关”的 IP 地址。
WiFi.subnetMask() 返回的是当前网络的子网掩码(Subnet Mask)。
4. 把这四步组合成一个“联网模板函数”
知识点版我们写成一个函数,方便拷贝:
#include <WiFi.h>
const char* WIFI_SSID = "你的WiFi";
const char* WIFI_PWD = "你的密码";
bool connectWiFiStation(uint32_t timeout_ms = 20000) {
WiFi.mode(WIFI_STA); // 1. 设置为 STA 模式
WiFi.disconnect(true); // 断开之前的连接并清理配置
delay(100);
Serial.printf("Connecting to %s ...\n", WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PWD); // 2. 发起连接
uint32_t start = millis();
// 3. 等待连接完成或者超时
while (WiFi.status() != WL_CONNECTED) {
if (millis() - start > timeout_ms) {
Serial.println("WiFi connect timeout!");
return false; // 连接失败
}
Serial.print(".");
delay(500);
}
// 4. 连接成功,打印 IP 信息
Serial.println("\nWiFi connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("Gateway: ");
Serial.println(WiFi.gatewayIP());
Serial.print("Subnet: ");
Serial.println(WiFi.subnetMask());
return true;
}
在 setup() 里用:
void setup() {
Serial.begin(115200);
delay(1000);
if (!connectWiFiStation(20000)) { // 20 秒连不上
Serial.println("Give up, reboot...");
ESP.restart(); // 简单粗暴:重启
}
}
void loop() {
// 这里写联网后的逻辑
}
你不需要把这段记住,但要理解它做的四件事:
模式 → begin → 等状态 → 打印 IP / 判失败。
5. 一些容易踩的点(知识点形式记一下)
-
只能连 2.4GHz WiFi
-
ESP32 不支持 5G,路由器如果只开 5G,永远连不上
-
有些路由器的“合并 2.4G+5G SSID”模式会有坑,必要时给 2.4G 单独一个名字
-
-
密码错、SSID 写错也只会卡在等待里
-
这时候
WiFi.status()会是WL_CONNECT_FAILED或WL_NO_SSID_AVAIL -
你可以把
while那段写得更精细一点,根据状态输出提示(等以后再说)
-
-
WiFi 连接会掉线
-
路由器重启 / 信号弱 / 干扰大,
WiFi.status()可能会从WL_CONNECTED变成别的 -
稍高级一点的写法会在
loop()里定期检查:不连了就重新begin()一次
-
-
ESP32 的 WiFi 和 ADC2 冲突
-
知识点先记一下:如果你以后发现 WiFi 一开,ADC 某些通道坏了,多半用了 ADC2 的通道
-
一般建议用 ADC1 的 GPIO 做模拟输入
-
6. 这块知识学会之后,你能干啥?
有了“联网模板”(上面的 4 步),你后面所有操作都建立在这上面,比如:
-
模块 2:HTTP 客户端
-
在连上 WiFi 后,使用
HTTPClient,去访问一个网址(比如返回 JSON)
-
-
模块 3:MQTT 客户端
-
用
WiFiClient+PubSubClient,连接到 MQTT 服务器,发布/订阅主题
-
-
模块 4:NTP 时间同步
-
通过 UDP 向 NTP 服务器发请求,获得当前时间
-
它们的共同前提都是:先跑一遍“联网模板”。
3944

被折叠的 条评论
为什么被折叠?



