--- notion-id: 263ca4d7-cb7b-8060-a669-e9846a21bf35 --- ### 一、ESP32配网_无BOOT ```javascript #include #include #include #include // 创建对象 WebServer server(80); DNSServer dnsServer; Preferences preferences; // 配置参数 const char* ap_ssid = "ESP32-Config"; // 配网热点名称 const char* ap_password = ""; // 热点密码,留空为开放网络 const byte DNS_PORT = 53; // 存储WiFi信息 String saved_ssid = ""; String saved_password = ""; bool wifi_configured = false; // HTML页面 const char* config_html = R"( ESP32 WiFi配置

ESP32 WiFi配置

点击扫描按钮搜索附近的WiFi网络
)"; void setup() { Serial.begin(115200); Serial.println("启动ESP32 WiFi配网程序..."); // 初始化Preferences preferences.begin("wifi-config", false); // 读取保存的WiFi信息 saved_ssid = preferences.getString("ssid", ""); saved_password = preferences.getString("password", ""); if(saved_ssid.length() > 0) { Serial.println("找到保存的WiFi配置,尝试连接: " + saved_ssid); if(connectToWiFi(saved_ssid, saved_password)) { wifi_configured = true; Serial.println("WiFi连接成功!"); Serial.print("IP地址: "); Serial.println(WiFi.localIP()); return; } else { Serial.println("保存的WiFi连接失败,启动配网模式"); } } // 启动配网模式 startConfigMode(); } bool connectToWiFi(String ssid, String password) { WiFi.begin(ssid.c_str(), password.c_str()); int attempts = 0; while(WiFi.status() != WL_CONNECTED && attempts < 20) { delay(500); Serial.print("."); attempts++; } Serial.println(); return WiFi.status() == WL_CONNECTED; } void startConfigMode() { Serial.println("启动配网模式..."); // 设置为AP模式 WiFi.mode(WIFI_AP); WiFi.softAP(ap_ssid, ap_password); Serial.print("配网热点已启动: "); Serial.println(ap_ssid); Serial.print("IP地址: "); Serial.println(WiFi.softAPIP()); // 启动DNS服务器(强制门户) dnsServer.start(DNS_PORT, "*", WiFi.softAPIP()); // 设置Web服务器路由 server.on("/", HTTP_GET, handleRoot); server.on("/scan", HTTP_GET, handleScan); server.on("/connect", HTTP_POST, handleConnect); server.onNotFound(handleRoot); // 所有未找到的请求都重定向到根页面 server.begin(); Serial.println("配网服务器已启动"); Serial.println("请连接WiFi热点 '" + String(ap_ssid) + "' 并访问 192.168.4.1"); } void handleRoot() { server.send(200, "text/html", config_html); } void handleScan() { Serial.println("开始扫描WiFi网络..."); int networkCount = WiFi.scanNetworks(); String json = "{\"networks\":["; if(networkCount > 0) { for(int i = 0; i < networkCount; i++) { if(i > 0) json += ","; json += "{"; json += "\"ssid\":\"" + WiFi.SSID(i) + "\","; json += "\"rssi\":" + String(WiFi.RSSI(i)) + ","; json += "\"encryption\":" + String(WiFi.encryptionType(i) != WIFI_AUTH_OPEN); json += "}"; } } json += "]}"; Serial.println("找到 " + String(networkCount) + " 个网络"); server.send(200, "application/json", json); } void handleConnect() { String ssid = server.arg("ssid"); String password = server.arg("password"); Serial.println("尝试连接WiFi: " + ssid); if(ssid.length() == 0) { server.send(400, "text/plain", "SSID不能为空"); return; } // 尝试连接WiFi WiFi.mode(WIFI_STA); if(connectToWiFi(ssid, password)) { // 连接成功,保存配置 preferences.putString("ssid", ssid); preferences.putString("password", password); Serial.println("WiFi连接成功!"); Serial.print("IP地址: "); Serial.println(WiFi.localIP()); server.send(200, "text/plain", "OK"); // 延迟后重启,让浏览器接收到响应 delay(2000); ESP.restart(); } else { Serial.println("WiFi连接失败"); server.send(400, "text/plain", "连接失败,请检查密码"); // 重新启动AP模式 delay(1000); startConfigMode(); } } void loop() { if(!wifi_configured) { dnsServer.processNextRequest(); server.handleClient(); } else { // WiFi已配置,执行您的主要程序逻辑 // 这里可以添加您的其他功能代码 delay(1000); // 检查WiFi连接状态 if(WiFi.status() != WL_CONNECTED) { Serial.println("WiFi连接断开,重新启动配网模式"); wifi_configured = false; startConfigMode(); } } } ``` **主要修改和新增功能:** ### **二、 **ESP32配网_有BOOT - **上电检测**:启动时检测BOOT键,如果按下则清除配置并进入配网模式 - **运行时检测**:正常运行时长按BOOT键2秒可重新进入配网模式 - **配网时检测**:配网模式下长按BOOT键3秒可重启设备 **2. 新增功能** - 添加了"清除WiFi配置"按钮和接口 - 更好的状态提示和用户反馈 - 改进的按键消抖处理 - 更详细的串口日志输出 **3. 使用说明** - **重新配网方式1**:断电,按住BOOT键,重新上电 - **重新配网方式2**:设备运行时长按BOOT键2秒 - **重启设备**:配网页面中点击"清除配置"按钮,或配网时长按BOOT键3秒 ```javascript #include #include #include #include // 创建对象 WebServer server(80); DNSServer dnsServer; Preferences preferences; // 配置参数 const char* ap_ssid = "ESP32-Config"; // 配网热点名称 const char* ap_password = ""; // 热点密码,留空为开放网络 const byte DNS_PORT = 53; const int BOOT_PIN = 0; // BOOT按键引脚 // 存储WiFi信息 String saved_ssid = ""; String saved_password = ""; bool wifi_configured = false; bool force_config_mode = false; // 强制配网模式标志 // HTML页面 const char* config_html = R"( ESP32 WiFi配置

ESP32 WiFi配置

点击扫描按钮搜索附近的WiFi网络
)"; void setup() { Serial.begin(115200); Serial.println("启动ESP32 WiFi配网程序..."); // 初始化BOOT按键引脚 pinMode(BOOT_PIN, INPUT_PULLUP); // 检测BOOT键是否被按下(上电时检测) delay(100); // 等待电路稳定 if (digitalRead(BOOT_PIN) == LOW) { Serial.println("检测到BOOT键按下,强制进入配网模式"); // 消抖处理,确保真的是按下 delay(50); if (digitalRead(BOOT_PIN) == LOW) { Serial.println("确认BOOT键按下,清除WiFi配置并进入配网模式"); // 清除保存的WiFi配置 preferences.begin("wifi-config", false); preferences.clear(); preferences.end(); force_config_mode = true; startConfigMode(); return; // 直接返回,不执行后续的正常启动流程 } } // 正常启动流程 Serial.println("正常启动模式"); // 初始化Preferences preferences.begin("wifi-config", false); // 读取保存的WiFi信息 saved_ssid = preferences.getString("ssid", ""); saved_password = preferences.getString("password", ""); if(saved_ssid.length() > 0) { Serial.println("找到保存的WiFi配置,尝试连接: " + saved_ssid); if(connectToWiFi(saved_ssid, saved_password)) { wifi_configured = true; Serial.println("WiFi连接成功!"); Serial.print("IP地址: "); Serial.println(WiFi.localIP()); // 显示当前状态信息 Serial.println("====================================="); Serial.println("设备已联网,主程序正在运行中..."); Serial.println("如需重新配网,请重启时按住BOOT键"); Serial.println("====================================="); return; } else { Serial.println("保存的WiFi连接失败,启动配网模式"); } } else { Serial.println("未找到保存的WiFi配置"); } // 启动配网模式 startConfigMode(); } bool connectToWiFi(String ssid, String password) { Serial.println("正在连接WiFi: " + ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid.c_str(), password.c_str()); int attempts = 0; while(WiFi.status() != WL_CONNECTED && attempts < 20) { delay(500); Serial.print("."); attempts++; // 如果在连接过程中检测到BOOT键,立即停止连接 if(digitalRead(BOOT_PIN) == LOW) { Serial.println("\n检测到BOOT键按下,停止连接"); return false; } } Serial.println(); return WiFi.status() == WL_CONNECTED; } void startConfigMode() { Serial.println("启动配网模式..."); force_config_mode = true; // 设置为AP模式 WiFi.mode(WIFI_AP); WiFi.softAP(ap_ssid, ap_password); Serial.println("====================================="); Serial.print("配网热点已启动: "); Serial.println(ap_ssid); Serial.print("请连接此WiFi热点,然后访问: "); Serial.println(WiFi.softAPIP()); Serial.println("在网页中选择要连接的WiFi并输入密码"); Serial.println("====================================="); // 启动DNS服务器(强制门户) dnsServer.start(DNS_PORT, "*", WiFi.softAPIP()); // 设置Web服务器路由 server.on("/", HTTP_GET, handleRoot); server.on("/scan", HTTP_GET, handleScan); server.on("/connect", HTTP_POST, handleConnect); server.on("/clear", HTTP_POST, handleClear); // 新增清除配置接口 server.onNotFound(handleRoot); // 所有未找到的请求都重定向到根页面 server.begin(); Serial.println("配网服务器已启动"); } void handleRoot() { server.send(200, "text/html", config_html); } void handleScan() { Serial.println("开始扫描WiFi网络..."); int networkCount = WiFi.scanNetworks(); String json = "{\"networks\":["; if(networkCount > 0) { for(int i = 0; i < networkCount; i++) { if(i > 0) json += ","; json += "{"; json += "\"ssid\":\"" + WiFi.SSID(i) + "\","; json += "\"rssi\":" + String(WiFi.RSSI(i)) + ","; json += "\"encryption\":" + String(WiFi.encryptionType(i) != WIFI_AUTH_OPEN); json += "}"; } } json += "]}"; Serial.println("找到 " + String(networkCount) + " 个网络"); server.send(200, "application/json", json); } void handleConnect() { String ssid = server.arg("ssid"); String password = server.arg("password"); Serial.println("尝试连接WiFi: " + ssid); if(ssid.length() == 0) { server.send(400, "text/plain", "SSID不能为空"); return; } // 尝试连接WiFi WiFi.mode(WIFI_STA); if(connectToWiFi(ssid, password)) { // 连接成功,保存配置 preferences.putString("ssid", ssid); preferences.putString("password", password); Serial.println("WiFi连接成功!"); Serial.print("IP地址: "); Serial.println(WiFi.localIP()); server.send(200, "text/plain", "OK"); // 延迟后重启,让浏览器接收到响应 delay(2000); Serial.println("重启设备..."); ESP.restart(); } else { Serial.println("WiFi连接失败"); server.send(400, "text/plain", "连接失败,请检查密码"); // 重新启动AP模式 delay(1000); startConfigMode(); } } // 新增:处理清除配置请求 void handleClear() { Serial.println("收到清除配置请求"); preferences.clear(); Serial.println("WiFi配置已清除"); server.send(200, "text/plain", "OK"); // 延迟后重启 delay(2000); Serial.println("重启设备..."); ESP.restart(); } void loop() { if(force_config_mode || !wifi_configured) { // 配网模式 dnsServer.processNextRequest(); server.handleClient(); // 在配网模式下也可以检测BOOT键长按来重启 static unsigned long boot_press_start = 0; if(digitalRead(BOOT_PIN) == LOW) { if(boot_press_start == 0) { boot_press_start = millis(); } else if(millis() - boot_press_start > 3000) { // 长按3秒 Serial.println("检测到BOOT键长按,重启设备..."); ESP.restart(); } } else { boot_press_start = 0; } } else { // WiFi已配置,执行主要程序逻辑 // 检查WiFi连接状态 if(WiFi.status() != WL_CONNECTED) { Serial.println("WiFi连接断开,尝试重连..."); if(!connectToWiFi(saved_ssid, saved_password)) { Serial.println("重连失败,启动配网模式"); wifi_configured = false; force_config_mode = false; startConfigMode(); } } // 检测BOOT键按下(运行时重新配网) static unsigned long boot_press_start = 0; if(digitalRead(BOOT_PIN) == LOW) { if(boot_press_start == 0) { boot_press_start = millis(); Serial.println("检测到BOOT键按下..."); } else if(millis() - boot_press_start > 2000) { // 长按2秒 Serial.println("BOOT键长按2秒,进入重新配网模式"); wifi_configured = false; force_config_mode = false; // 可选:清除保存的配置 // preferences.clear(); startConfigMode(); boot_press_start = 0; return; } } else { if(boot_press_start > 0 && millis() - boot_press_start > 100) { Serial.println("BOOT键释放"); } boot_press_start = 0; } // 这里添加您的主要程序逻辑 delay(100); } } ```