ESP32通过WEB页面连接WIFI+复位重连+删除已连WiFi(Arduino)

在ESP32官方的例程中,都是直接把WIFI的SSID和Password写死在程序里,但是在实际使用中网络环境是不固定的,如果更换了网络环境,就得重新修改程序,在实际运用中并不合理。我在网上找了很久也没找到类似的例程,于是便自己试着写了一个,我的思路如下:
ESP32通过WEB页面连接WIFI+复位重连+删除已连WiFi(Arduino)_第1张图片
首次上电会有一个ESP32发出的WIFI,手机连接这个WIFI,然后访问esp32的IP地址就会出现WIFI配置的网页:ESP32通过WEB页面连接WIFI+复位重连+删除已连WiFi(Arduino)_第2张图片
由于ESP32默认会自动保存WiFi信息,配置WiFi之后我们不用考虑怎么保存WiFi。

下面是完整的程序

#include <WiFi.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <esp_wifi.h>

const char* AP_SSID  = "ESP32_Config"; //热点名称
String wifi_ssid = "";
String wifi_pass = "";
String scanNetworksID = "";//用于储存扫描到的WiFi

#define ROOT_HTML  "WIFI Config by lwang

Nearby wifi:

"
WebServer server(80); #define RESET_PIN 13 //用于删除WiFi信息 void setup() { Serial.begin(115200); pinMode(RESET_PIN, INPUT_PULLUP); // 连接WiFi if (!AutoConfig()) { wifi_Config(); } //用于删除已存WiFi if (digitalRead(RESET_PIN) == LOW) { delay(1000); esp_wifi_restore(); delay(10); ESP.restart(); //复位esp32 } } void loop() { server.handleClient(); while (WiFi.status() == WL_CONNECTED) { //WIFI已连接 } } //用于配置WiFi void wifi_Config() { Serial.println("scan start"); // 扫描附近WiFi int n = WiFi.scanNetworks(); Serial.println("scan done"); if (n == 0) { Serial.println("no networks found"); scanNetworksID = "no networks found"; } else { Serial.print(n); Serial.println(" networks found"); for (int i = 0; i < n; ++i) { // Print SSID and RSSI for each network found Serial.print(i + 1); Serial.print(": "); Serial.print(WiFi.SSID(i)); Serial.print(" ("); Serial.print(WiFi.RSSI(i)); Serial.print(")"); Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*"); scanNetworksID += "

" + WiFi.SSID(i) + "

"
; delay(10); } } Serial.println(""); WiFi.mode(WIFI_AP);//配置为AP模式 boolean result = WiFi.softAP(AP_SSID, ""); //开启WIFI热点 if (result) { IPAddress myIP = WiFi.softAPIP(); //打印相关信息 Serial.println(""); Serial.print("Soft-AP IP address = "); Serial.println(myIP); Serial.println(String("MAC address = ") + WiFi.softAPmacAddress().c_str()); Serial.println("waiting ..."); } else { //开启热点失败 Serial.println("WiFiAP Failed"); delay(3000); ESP.restart(); //复位esp32 } if (MDNS.begin("esp32")) { Serial.println("MDNS responder started"); } //首页 server.on("/", []() { server.send(200, "text/html", ROOT_HTML + scanNetworksID + ""); }); //连接 server.on("/connect", []() { server.send(200, "text/html", "successd,wifi connecting...
Please close this page manually.
"
); WiFi.softAPdisconnect(true); //获取输入的WIFI账户和密码 wifi_ssid = server.arg("ssid"); wifi_pass = server.arg("pass"); server.close(); WiFi.softAPdisconnect(); Serial.println("WiFi Connect SSID:" + wifi_ssid + " PASS:" + wifi_pass); //设置为STA模式并连接WIFI WiFi.mode(WIFI_STA); WiFi.begin(wifi_ssid.c_str(), wifi_pass.c_str()); uint8_t Connect_time = 0; //用于连接计时,如果长时间连接不成功,复位设备 while (WiFi.status() != WL_CONNECTED) { //等待WIFI连接成功 delay(500); Serial.print("."); Connect_time ++; if (Connect_time > 80) { //长时间连接不上,复位设备 Serial.println("Connection timeout, check input is correct or try again later!"); delay(3000); ESP.restart(); } } Serial.println(""); Serial.println("WIFI Config Success"); Serial.printf("SSID:%s", WiFi.SSID().c_str()); Serial.print(" LocalIP:"); Serial.print(WiFi.localIP()); Serial.println(""); }); server.begin(); } //用于上电自动连接WiFi bool AutoConfig() { WiFi.begin(); for (int i = 0; i < 20; i++) { int wstatus = WiFi.status(); if (wstatus == WL_CONNECTED) { Serial.println("WIFI SmartConfig Success"); Serial.printf("SSID:%s", WiFi.SSID().c_str()); Serial.printf(", PSW:%s\r\n", WiFi.psk().c_str()); Serial.print("LocalIP:"); Serial.print(WiFi.localIP()); Serial.print(" ,GateIP:"); Serial.println(WiFi.gatewayIP()); return true; } else { Serial.print("WIFI AutoConfig Waiting......"); Serial.println(wstatus); delay(1000); } } Serial.println("WIFI AutoConfig Faild!" ); return false; }

你可能感兴趣的:(ESP32)