|
學(xué)習(xí)和使用ESP8266,在ardoinoIDE寫(xiě)程序一個(gè)多月了。
剛開(kāi)始看代碼時(shí),由于水平比較低,
分析代碼比較難,
所以,在一邊學(xué)習(xí)時(shí),一邊用思維導(dǎo)圖去分析代碼。
分析完,感覺(jué)思路有些清晰,
希望這個(gè)思維導(dǎo)圖對(duì)一些初學(xué)者有些參考意義。
001-簡(jiǎn)概.png (31.94 KB, 下載次數(shù): 82)
下載附件
2022-10-22 15:56 上傳
003-.jpg (76.71 KB, 下載次數(shù): 75)
下載附件
2022-10-22 15:56 上傳
002-arduino-用WEB網(wǎng)頁(yè)-輸入WIFI名與密碼.png (637.01 KB, 下載次數(shù): 84)
下載附件
2022-10-22 15:56 上傳
004-.png (196.82 KB, 下載次數(shù): 64)
下載附件
2022-10-22 15:56 上傳
005-.png (149.34 KB, 下載次數(shù): 68)
下載附件
2022-10-22 15:56 上傳
006-.png (79.72 KB, 下載次數(shù): 67)
下載附件
2022-10-22 15:56 上傳
- #include <ESP8266WiFi.h>
- #include <DNSServer.h>
- #include <ESP8266WebServer.h>
-
- const char* AP_NAME = "qyz-SET-WIFI";//寫(xiě)入自己設(shè)計(jì)的wifi名字
- //暫時(shí)存儲(chǔ)wifi賬號(hào)密碼
- char sta_ssid[32] = {0};
- char sta_password[64] = {0};
- //配網(wǎng)頁(yè)面代碼
- const char* page_html = "\
- <!DOCTYPE html>\r\n\
- <html lang='en'>\r\n\
- <head>\r\n\
- <meta charset='UTF-8'>\r\n\
- <meta name='viewport' content='width=device-width, initial-scale=1.0'>\r\n\
- <title>Document</title>\r\n\
- </head>\r\n\
- <body>\r\n\
- <form name='input' action='/' method='POST'>\r\n\
- qyz設(shè)計(jì)測(cè)試: <br>\r\n\
- wifi名稱(chēng): <br>\r\n\
- <input type='text' name='ssid'><br>\r\n\
- wifi密碼:<br>\r\n\
- <input type='text' name='password'><br>\r\n\
- <input type='submit' value='保存'>\r\n\
- </form>\r\n\
- </body>\r\n\
- </html>\r\n\
- ";
-
- const byte DNS_PORT = 53;//DNS端口號(hào)
- IPAddress apIP(192, 168, 4, 1);//esp8266-AP-IP地址
- DNSServer dnsServer;//創(chuàng)建dnsServer實(shí)例
- ESP8266WebServer server(80);//創(chuàng)建WebServer
-
- void handleRoot() {//訪問(wèn)主頁(yè)回調(diào)函數(shù)
- server.send(200, "text/html", page_html);
- }
-
- void handleRootPost() {//Post回調(diào)函數(shù)
- Serial.println("handleRootPost");
- if (server.hasArg("ssid")) {//判斷是否有賬號(hào)參數(shù)
- Serial.print("got ssid:");
- strcpy(sta_ssid, server.arg("ssid").c_str());//將賬號(hào)參數(shù)拷貝到sta_ssid中
- Serial.println(sta_ssid);
- } else {//沒(méi)有參數(shù)
- Serial.println("error, not found ssid");
- server.send(200, "text/html", "<meta charset='UTF-8'>沒(méi)有輸入1error, not found ssid");//返回錯(cuò)誤頁(yè)面
- return;
- }
- //密碼與賬號(hào)同理
- if (server.hasArg("password")) {
- Serial.print("got password:");
- strcpy(sta_password, server.arg("password").c_str());
- Serial.println(sta_password);
- } else {
- Serial.println("error, not found password");
- server.send(200, "text/html", "<meta charset='UTF-8'>沒(méi)有輸入2error, not found password");
- return;
- }
-
- server.send(200, "text/html", "<meta charset='UTF-8'>保存成功");//返回保存成功頁(yè)面
- delay(2000);
- //連接wifi
- connectNewWifi();
- }
-
- void initBasic(void){//初始化基礎(chǔ)
- Serial.begin(115200);
- WiFi.hostname("Smart-ESP8266");//設(shè)置ESP8266設(shè)備名
- }
-
- void initSoftAP(void){//初始化AP模式
- WiFi.mode(WIFI_AP);
- WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
- if(WiFi.softAP(AP_NAME)){
- Serial.println("ESP8266 SoftAP is right");
- }
- }
-
- void initWebServer(void){//初始化WebServer
- //server.on("/",handleRoot);
- //上面那行必須以下面這種格式去寫(xiě)否則無(wú)法強(qiáng)制門(mén)戶
- server.on("/", HTTP_GET, handleRoot);//設(shè)置主頁(yè)回調(diào)函數(shù)
- server.onNotFound(handleRoot);//設(shè)置無(wú)法響應(yīng)的http請(qǐng)求的回調(diào)函數(shù)
- server.on("/", HTTP_POST, handleRootPost);//設(shè)置Post請(qǐng)求回調(diào)函數(shù)
- server.begin();//啟動(dòng)WebServer
- Serial.println("WebServer started!");
- }
-
- void initDNS(void){//初始化DNS服務(wù)器
- if(dnsServer.start(DNS_PORT, "*", apIP)){//判斷將所有地址映射到esp8266的ip上是否成功
- Serial.println("start dnsserver success.");
- }
- else Serial.println("start dnsserver failed.");
- }
-
- void connectNewWifi(void){
- WiFi.mode(WIFI_STA);//切換為STA模式
- WiFi.setAutoConnect(true);//設(shè)置自動(dòng)連接
- WiFi.begin();//連接上一次連接成功的wifi
- Serial.println("");
- Serial.print("Connect to wifi");
- int count = 0;
- while (WiFi.status() != WL_CONNECTED) {
- delay(500);
- count++;
- if(count > 10){//如果5秒內(nèi)沒(méi)有連上,就開(kāi)啟Web配網(wǎng) 可適當(dāng)調(diào)整這個(gè)時(shí)間
- initSoftAP();
- initWebServer();
- initDNS();
- break;//跳出 防止無(wú)限初始化
- }
- Serial.print(".");
- }
- Serial.println("");
- if(WiFi.status() == WL_CONNECTED){//如果連接上 就輸出IP信息 防止未連接上break后會(huì)誤輸出
- Serial.println("WIFI Connected!");
- Serial.print("IP address: ");
- Serial.println(WiFi.localIP());//打印esp8266的IP地址
- server.stop();
- }
- }
-
- void setup() {
- initBasic();
- connectNewWifi();
- }
-
- void loop() {
- server.handleClient();
- dnsServer.processNextRequest();
- }
復(fù)制代碼 |
評(píng)分
-
查看全部評(píng)分
|