1. 项目概述:ESP32 WiFi连接与IP地址打印
这个实验将带你用Arduino IDE完成ESP32的基础WiFi连接功能,并通过串口监视器打印获取到的IP地址。作为物联网开发中最基础的"Hello World"级项目,它能帮你快速验证开发环境配置是否正确,同时掌握ESP32连接WiFi网络的核心流程。
我经常建议新手从这个实验开始ESP32的学习,因为它:
- 只需基础硬件(ESP32开发板+数据线)
- 包含完整的网络连接流程
- 通过串口输出直观反馈连接状态
- 代码结构简单但包含关键要素
- 为后续Web服务器、MQTT等应用打下基础
2. 硬件准备与环境搭建
2.1 所需硬件清单
- ESP32开发板(推荐ESP32-DevKitC)
- Micro USB数据线
- 电脑(Windows/Mac/Linux均可)
注意:某些ESP32开发板需要手动安装USB转串口芯片驱动(如CH340),若设备管理器中出现未知设备,需先安装对应驱动。
2.2 软件环境配置
安装Arduino IDE:从官网下载最新版本(建议2.3.x)
添加ESP32支持:
- 文件→首选项→附加开发板管理器网址添加:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json - 工具→开发板→开发板管理器→搜索"esp32"→安装
- 文件→首选项→附加开发板管理器网址添加:
选择开发板型号:
- 工具→开发板→ESP32 Arduino→选择"ESP32 Dev Module"
- 端口选择对应的COM口(插入ESP32后出现)
3. 核心代码解析
3.1 完整代码实现
#include <WiFi.h> const char* ssid = "Your_WiFi_SSID"; // 替换为你的WiFi名称 const char* password = "Your_WiFi_Pass"; // 替换为你的WiFi密码 void setup() { Serial.begin(115200); delay(1000); // 等待串口初始化 WiFi.begin(ssid, password); Serial.println("\nConnecting to WiFi..."); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nConnected to WiFi!"); Serial.print("IP Address: "); Serial.println(WiFi.localIP()); } void loop() { // 保持连接状态 if (WiFi.status() != WL_CONNECTED) { Serial.println("WiFi disconnected!"); ESP.restart(); } delay(3000); }3.2 关键代码段解析
WiFi库引入:
#include <WiFi.h>ESP32-Arduino核心库已内置WiFi支持,无需额外安装。
连接初始化:
WiFi.begin(ssid, password);启动STA模式连接指定WiFi,需确保:
- 2.4GHz网络(ESP32不支持5GHz)
- 非企业级加密网络(如WPA2-Personal)
连接状态检测:
while (WiFi.status() != WL_CONNECTED)WiFi.status()返回连接状态,常见返回值:- WL_CONNECTED:连接成功
- WL_NO_SSID_AVAIL:SSID不可用
- WL_CONNECT_FAILED:密码错误
- WL_IDLE_STATUS:正在处理
IP地址获取:
WiFi.localIP()返回ESP32在局域网内的IPv4地址,格式为IPAddress对象。
4. 实操步骤详解
4.1 代码上传流程
- 复制完整代码到Arduino IDE
- 修改
ssid和password为你的WiFi凭证 - 点击"验证"编译代码(Ctrl+R)
- 连接开发板,选择正确端口
- 点击"上传"(Ctrl+U)
注意:上传时需按住BOOT按钮(部分型号需要),直到出现"Hard resetting..."提示。
4.2 串口监视器使用
- 上传完成后打开串口监视器(Ctrl+Shift+M)
- 设置波特率为115200
- 观察输出日志:
Connecting to WiFi... .... Connected to WiFi! IP Address: 192.168.1.100
4.3 常见问题排查
无法连接WiFi:
- 检查SSID/密码是否正确
- 确保路由器未开启MAC过滤
- 尝试重置路由器
IP地址显示0.0.0.0:
- 检查路由器DHCP服务是否开启
- 确认WiFi.status()返回WL_CONNECTED
频繁断开连接:
- 添加外接电源(USB供电可能不足)
- 调整代码中的重连机制
5. 进阶应用方向
5.1 添加重连机制
void reconnectWiFi() { if (WiFi.status() == WL_CONNECTED) return; Serial.println("Reconnecting..."); WiFi.disconnect(); WiFi.begin(ssid, password); int retries = 0; while (WiFi.status() != WL_CONNECTED && retries < 10) { delay(500); Serial.print("."); retries++; } if (WiFi.status() == WL_CONNECTED) { Serial.println("\nReconnected!"); } else { Serial.println("\nFailed to reconnect"); } }5.2 多网络配置
const char* ssids[] = {"Home_WiFi", "Office_WiFi"}; const char* passwords[] = {"home123", "office456"}; void connectMultiWiFi() { for (int i = 0; i < 2; i++) { WiFi.begin(ssids[i], passwords[i]); Serial.printf("Trying %s...\n", ssids[i]); int retry = 0; while (retry < 10 && WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); retry++; } if (WiFi.status() == WL_CONNECTED) break; } }5.3 信号强度检测
void checkRSSI() { long rssi = WiFi.RSSI(); Serial.print("Signal strength: "); Serial.print(rssi); Serial.println(" dBm"); if (rssi > -50) { Serial.println("Excellent signal"); } else if (rssi > -60) { Serial.println("Good signal"); } else if (rssi > -70) { Serial.println("Fair signal"); } else { Serial.println("Weak signal"); } }6. 项目优化建议
6.1 添加LED状态指示
#define WIFI_LED 2 // ESP32内置LED通常接GPIO2 void setup() { pinMode(WIFI_LED, OUTPUT); // ...其他初始化代码 } void loop() { if (WiFi.status() == WL_CONNECTED) { digitalWrite(WIFI_LED, HIGH); } else { digitalWrite(WIFI_LED, LOW); } // ...其他代码 }6.2 保存WiFi配置
使用Preferences库保存网络配置:
#include <Preferences.h> Preferences prefs; void saveWiFiConfig() { prefs.begin("wifi-config"); prefs.putString("ssid", ssid); prefs.putString("password", password); prefs.end(); } void loadWiFiConfig() { prefs.begin("wifi-config"); ssid = prefs.getString("ssid", ""); password = prefs.getString("password", ""); prefs.end(); }6.3 添加Web配置界面
结合WebServer库创建配网页面:
#include <WebServer.h> WebServer server(80); void handleRoot() { String html = "<form action='/save'>" "SSID: <input type='text' name='ssid'><br>" "Password: <input type='password' name='pass'><br>" "<input type='submit' value='Save'>" "</form>"; server.send(200, "text/html", html); } void handleSave() { ssid = server.arg("ssid"); password = server.arg("pass"); server.send(200, "text/plain", "Credentials saved"); WiFi.begin(ssid.c_str(), password.c_str()); }7. 实际应用案例
7.1 智能家居设备
通过IP地址实现:
- 手机APP控制
- 定时任务设置
- 状态监控
7.2 工业传感器节点
- 定时上报数据到服务器
- 远程配置采集参数
- 固件OTA升级
7.3 教学演示系统
- 网络通信原理展示
- IoT开发入门教学
- 协议分析实验
经验分享:在实际项目中,建议将WiFi连接模块封装成独立类,方便不同项目复用。同时添加配网超时、低功耗模式等生产级功能。