ESP32 怎么联网

ModelEngine·创作计划征文活动 10w+人浏览 1.4k人参与

ESP32 怎么联网(连上 WiFi)

目标一句话:

让 ESP32 以 STA 模式 连接你家的路由器,拿到 IP 地址,保持稳定在线。

你以后只要记住这套流程,任何 wifi 项目第一步都可以直接套用。


1. 先搞清楚:ESP32 联网的“角色”和模式

ESP32 自带 WiFi,有两种主要工作模式:

  1. STA 模式(Station)

    • 就像你的手机 / 笔记本:去连一个现成的路由器

    • ESP32 会从路由器拿到一个 IP 地址,比如 192.168.1.123

    • 后面所有联网操作(HTTP/MQTT/时钟同步)都是基于这个 IP

  2. AP 模式(Access Point)

    • ESP32 自己开热点,比如 ESP32_AP

    • 手机 / 电脑连到它身上

    • 常用在“配网、局域控制”这种场景

我们现在先学 最常用、也是最基础的:STA 模式连接路由器


2. 联网的 4 步大纲(你先记这个骨架)

只看概念,不看代码:

  1. 设置工作模式:STA

    WiFi.mode(WIFI_STA);
    
  2. 启动连接:给它 SSID + 密码

    WiFi.begin(ssid, password);
    
  3. 等待连接成功:轮询 WiFi.status()

    while (WiFi.status() != WL_CONNECTED) { ... }
    
  4. 成功后:拿 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. 一些容易踩的点(知识点形式记一下)

  1. 只能连 2.4GHz WiFi

    • ESP32 不支持 5G,路由器如果只开 5G,永远连不上

    • 有些路由器的“合并 2.4G+5G SSID”模式会有坑,必要时给 2.4G 单独一个名字

  2. 密码错、SSID 写错也只会卡在等待里

    • 这时候 WiFi.status() 会是 WL_CONNECT_FAILEDWL_NO_SSID_AVAIL

    • 你可以把 while 那段写得更精细一点,根据状态输出提示(等以后再说)

  3. WiFi 连接会掉线

    • 路由器重启 / 信号弱 / 干扰大,WiFi.status() 可能会从 WL_CONNECTED 变成别的

    • 稍高级一点的写法会在 loop() 里定期检查:不连了就重新 begin() 一次

  4. ESP32 的 WiFi 和 ADC2 冲突

    • 知识点先记一下:如果你以后发现 WiFi 一开,ADC 某些通道坏了,多半用了 ADC2 的通道

    • 一般建议用 ADC1 的 GPIO 做模拟输入


6. 这块知识学会之后,你能干啥?

有了“联网模板”(上面的 4 步),你后面所有操作都建立在这上面,比如:

  • 模块 2:HTTP 客户端

    • 在连上 WiFi 后,使用 HTTPClient,去访问一个网址(比如返回 JSON)

  • 模块 3:MQTT 客户端

    • WiFiClient + PubSubClient,连接到 MQTT 服务器,发布/订阅主题

  • 模块 4:NTP 时间同步

    • 通过 UDP 向 NTP 服务器发请求,获得当前时间

它们的共同前提都是:先跑一遍“联网模板”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱嵌入式的乌鸦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值