【ESP32C3】连接指定wifi最小代码

代码功能

建立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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值