代码功能
建立WiFi连接:在启动时连接指定名称和密码的WiFi网络
监控连接状态:持续检查WiFi连接状态,断开时自动重连
串口输出信息:通过串口输出连接状态和IP地址
工作流程
初始化串口用于调试输出
启动WiFi连接过程
循环等待直到连接成功(显示连接进度点)
连接成功后输出IP地址
持续维护功能
每5秒检查一次WiFi连接状态
检测到断开时自动尝试重连
输出断开提示信息
关键函数说明
函数/常量 | 作用说明 |
---|---|
WiFi.begin(ssid, pass) | 启动WiFi连接(非阻塞式,需后续检查状态) |
WiFi.status() | 返回连接状态(WL_CONNECTED=连接成功) |
WiFi.localIP() | 获取设备分配的本地IP地址 |
WiFi.reconnect() | 尝试重新连接最后配置的网络 |
WL_CONNECTED | 网络连接状态常量(值为3),表示连接成功 |
代码
arduino2.x版本调试
#include <WiFi.h>
#include <WiFiClientSecure.h>
// WiFi配置(可通过串口动态修改)
String wifi_ssid = "你的WiFi名称";
String wifi_pass = "你的WiFi密码";
// 连接状态追踪
unsigned long connectionStartTime = 0;
const int WIFI_TIMEOUT = 30000; // 30秒连接超时
// WiFi事件回调
void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) {
switch (event) {
case ARDUINO_EVENT_WIFI_STA_CONNECTED:
Serial.println("已连接至AP");
break;
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
Serial.print("\nWiFi断开! 原因: ");
Serial.println(WiFi.disconnectReasonName((wifi_err_reason_t)info.wifi_sta_disconnected.reason));
Serial.println("5秒后尝试重连...");
WiFi.reconnect();
break;
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
Serial.print("获取到IP: ");
Serial.println(WiFi.localIP());
Serial.print("信号强度: ");
Serial.print(WiFi.RSSI());
Serial.println(" dBm");
break;
default: break;
}
}
void setup() {
Serial.begin(115200);
while(!Serial); // 等待串口初始化(C3的USB串口)
// 注册WiFi事件回调
WiFi.onEvent(WiFiEvent);
Serial.println("\nESP32-C3 SuperMini WiFi连接示例");
Serial.println("-----------------------------");
// 检查存储的凭据
if(wifi_ssid == "你的WiFi名称" || wifi_pass == "你的WiFi密码"){
Serial.println("请先修改默认的WiFi凭据!");
}
startWiFiConnection();
}
void startWiFiConnection() {
Serial.println("启动WiFi连接...");
// 设置WiFi模式
WiFi.mode(WIFI_STA);
// 配置自动重连
WiFi.setAutoReconnect(true);
WiFi.persistent(true);
// 开始连接
connectionStartTime = millis();
WiFi.begin(wifi_ssid.c_str(), wifi_pass.c_str());
}
void checkConnectionStatus() {
static wl_status_t lastStatus = WL_IDLE_STATUS;
if (WiFi.status() != lastStatus) {
lastStatus = WiFi.status();
switch (lastStatus) {
case WL_NO_SSID_AVAIL:
Serial.println("网络不可用");
break;
case WL_CONNECT_FAILED:
Serial.println("密码错误?");
break;
case WL_CONNECTION_LOST:
Serial.println("连接丢失");
break;
}
}
// 连接超时处理
if (millis() - connectionStartTime > WIFI_TIMEOUT &&
WiFi.status() != WL_CONNECTED) {
Serial.println("\n连接超时! 重启WiFi...");
WiFi.disconnect();
delay(1000);
startWiFiConnection();
}
}
void loop() {
checkConnectionStatus();
// 连接成功后的操作
if (WiFi.status() == WL_CONNECTED) {
// 示例:每10秒显示一次连接状态
static unsigned long lastPrint = 0;
if (millis() - lastPrint > 10000) {
lastPrint = millis();
Serial.print("[在线] IP: ");
Serial.print(WiFi.localIP());
Serial.print(" | RSSI: ");
Serial.print(WiFi.RSSI());
Serial.println(" dBm");
}
}
delay(1000); // 主循环延时
}
// 串口命令处理
void serialEvent() {
while (Serial.available()) {
String command = Serial.readStringUntil('\n');
command.trim();
if (command.startsWith("SSID:")) {
wifi_ssid = command.substring(5);
Serial.println("新SSID设置: " + wifi_ssid);
}
else if (command.startsWith("PASS:")) {
wifi_pass = command.substring(5);
Serial.println("新密码已设置");
}
else if (command == "RECONNECT") {
Serial.println("手动重启WiFi...");
WiFi.disconnect();
startWiFiConnection();
}
else if (command == "STATUS") {
Serial.println("当前状态: " + String(WiFi.status()));
Serial.println("当前SSID: " + wifi_ssid);
}
else if (command == "SCAN") {
scanNetworks();
}
}
}
void scanNetworks() {
Serial.println("开始扫描网络...");
int networks = WiFi.scanNetworks();
if (networks == 0) {
Serial.println("未发现网络");
} else {
Serial.printf("发现 %d 个网络:\n", networks);
for (int i = 0; i < networks; i++) {
Serial.printf("%2d: %s (%ddBm) %s\n",
i + 1,
WiFi.SSID(i).c_str(),
WiFi.RSSI(i),
(WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? "开放" : "加密");
}
}
Serial.println();
}
参考文件
https://www.cnblogs.com/wuqiyang/p/18932778