找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1486|回复: 3
打印 上一主题 下一主题
收起左侧

用思维导图分析代码,让初学者更轻松搞懂程序的运作

[复制链接]
跳转到指定楼层
楼主
学习和使用ESP8266,在ardoinoIDE写程序一个多月了。
刚开始看代码时,由于水平比较低,
分析代码比较难,
所以,在一边学习时,一边用思维导图去分析代码。
分析完,感觉思路有些清晰,
希望这个思维导图对一些初学者有些参考意义。



















  1. #include <ESP8266WiFi.h>
  2. #include <DNSServer.h>
  3. #include <ESP8266WebServer.h>

  4. const char* AP_NAME = "qyz-SET-WIFI";//写入自己设计的wifi名字
  5. //暂时存储wifi账号密码
  6. char sta_ssid[32] = {0};
  7. char sta_password[64] = {0};


  8. //配网页面代码
  9. const char* page_html = "\
  10. <!DOCTYPE html>\r\n\
  11. <html lang='en'>\r\n\
  12. <head>\r\n\
  13.   <meta charset='UTF-8'>\r\n\
  14.   <meta name='viewport' content='width=device-width, initial-scale=1.0'>\r\n\
  15.   <title>Document</title>\r\n\
  16. </head>\r\n\
  17. <body>\r\n\
  18.   <form name='input' action='/' method='POST'>\r\n\
  19.         qyz设计测试: <br>\r\n\
  20.         wifi名称: <br>\r\n\
  21.         <input type='text' name='ssid'><br>\r\n\
  22.         wifi密码:<br>\r\n\
  23.         <input type='text' name='password'><br>\r\n\
  24.         <input type='submit' value='保存'>\r\n\
  25.     </form>\r\n\
  26. </body>\r\n\
  27. </html>\r\n\
  28. ";

  29. const byte DNS_PORT = 53;//DNS端口号
  30. IPAddress apIP(192, 168, 4, 1);//esp8266-AP-IP地址
  31. DNSServer dnsServer;//创建dnsServer实例
  32. ESP8266WebServer server(80);//创建WebServer

  33. void handleRoot() {//访问主页回调函数
  34.   server.send(200, "text/html", page_html);
  35. }

  36. void handleRootPost() {//Post回调函数
  37.   Serial.println("handleRootPost");
  38.   if (server.hasArg("ssid")) {//判断是否有账号参数
  39.     Serial.print("got ssid:");
  40.     strcpy(sta_ssid, server.arg("ssid").c_str());//将账号参数拷贝到sta_ssid中
  41.     Serial.println(sta_ssid);
  42.   } else {//没有参数
  43.     Serial.println("error, not found ssid");
  44.     server.send(200, "text/html", "<meta charset='UTF-8'>没有输入1error, not found ssid");//返回错误页面
  45.     return;
  46.   }
  47.   //密码与账号同理
  48.   if (server.hasArg("password")) {
  49.     Serial.print("got password:");
  50.     strcpy(sta_password, server.arg("password").c_str());
  51.     Serial.println(sta_password);
  52.   } else {
  53.     Serial.println("error, not found password");
  54.     server.send(200, "text/html", "<meta charset='UTF-8'>没有输入2error, not found password");
  55.     return;
  56.   }

  57.   server.send(200, "text/html", "<meta charset='UTF-8'>保存成功");//返回保存成功页面
  58.   delay(2000);
  59.   //连接wifi
  60.   connectNewWifi();
  61. }


  62. void initBasic(void){//初始化基础
  63.   Serial.begin(115200);
  64.   WiFi.hostname("Smart-ESP8266");//设置ESP8266设备名
  65. }

  66. void initSoftAP(void){//初始化AP模式
  67.   WiFi.mode(WIFI_AP);
  68.   WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
  69.   if(WiFi.softAP(AP_NAME)){
  70.     Serial.println("ESP8266 SoftAP is right");
  71.   }
  72. }

  73. void initWebServer(void){//初始化WebServer
  74.   //server.on("/",handleRoot);
  75.   //上面那行必须以下面这种格式去写否则无法强制门户
  76.   server.on("/", HTTP_GET, handleRoot);//设置主页回调函数
  77.   server.onNotFound(handleRoot);//设置无法响应的http请求的回调函数
  78.   server.on("/", HTTP_POST, handleRootPost);//设置Post请求回调函数
  79.   server.begin();//启动WebServer
  80.   Serial.println("WebServer started!");
  81. }

  82. void initDNS(void){//初始化DNS服务器
  83.   if(dnsServer.start(DNS_PORT, "*", apIP)){//判断将所有地址映射到esp8266的ip上是否成功
  84.     Serial.println("start dnsserver success.");
  85.   }
  86.   else Serial.println("start dnsserver failed.");
  87. }

  88. void connectNewWifi(void){

  89.   WiFi.mode(WIFI_STA);//切换为STA模式
  90.   WiFi.setAutoConnect(true);//设置自动连接
  91.   WiFi.begin();//连接上一次连接成功的wifi
  92.   Serial.println("");
  93.   Serial.print("Connect to wifi");

  94.   int count = 0;
  95.    while (WiFi.status() != WL_CONNECTED) {
  96.     delay(500);
  97.     count++;
  98.     if(count > 10){//如果5秒内没有连上,就开启Web配网 可适当调整这个时间
  99.       initSoftAP();
  100.       initWebServer();
  101.       initDNS();
  102.       break;//跳出 防止无限初始化
  103.     }
  104.     Serial.print(".");
  105.   }
  106.   Serial.println("");
  107.   if(WiFi.status() == WL_CONNECTED){//如果连接上 就输出IP信息 防止未连接上break后会误输出
  108.     Serial.println("WIFI Connected!");
  109.     Serial.print("IP address: ");
  110.     Serial.println(WiFi.localIP());//打印esp8266的IP地址
  111.     server.stop();
  112.   }
  113. }

  114. void setup() {
  115.   initBasic();
  116.   connectNewWifi();
  117. }

  118. void loop() {
  119.   server.handleClient();
  120.   dnsServer.processNextRequest();
  121. }
复制代码

评分

参与人数 2黑币 +120 收起 理由
wps10025 + 30 赞一个!
admin + 90

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:310441 发表于 2022-10-23 08:07 来自手机 | 只看该作者
思路很清晰!
回复

使用道具 举报

板凳
ID:607710 发表于 2022-12-19 07:49 来自手机 | 只看该作者
我一直都是这样做的,包括自己编写的时候也是先写大纲。
回复

使用道具 举报

地板
ID:1062304 发表于 2023-2-14 16:02 | 只看该作者
脉络很清晰,有助于思考
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表