当前位置:   article > 正文

ESP32网页控制显示数据原来如此简单

ESP32网页控制显示数据原来如此简单

一、写在前头

        本文着重于ESP32与网页的交互,并没有针对网页进行UI优化,也不会对HTM5的组件进行详细介绍,只讲解一些关键的JS函数。

        代码以Arduino框架进行开发,使用ESPAsyncWebServer库实现WebServer,通过JS代码配合库文件的回调函数进行使用,只讲交互部分,文章内容不关注数据的来源以及控制。

二、如何对ESP32进行配置

(1)基础配置

        ESPAsyncTCP库下载

        ESPAsyncWebServer库下载

        首先需要一些基础框架,对库文件的引用,并设置好端口号和网站的首页

  1. #include <ESPAsyncWebServer.h> // 包含异步Web服务器库文件
  2. AsyncWebServer server(80); // 创建WebServer对象, 端口号80
  3. // 使用端口号80可以直接输入IP访问,使用其它端口需要输入IP:端口号访问
  4. // 一个储存网页的数组
  5. const char index_html[] PROGMEM = R"rawliteral(
  6. <!DOCTYPE HTML>
  7. <html>
  8. <head>
  9. <meta charset="utf-8">
  10. </head>
  11. <body>
  12. <h2>ESP32 网页</h2>
  13. </body>
  14. <script>
  15. </script>)rawliteral";
  16. void setup()
  17. {
  18. // 你需要再此处添加WiFi操作代码,开启热点或者连接到热点
  19. // 添加HTTP主页,当访问的时候会把网页推送给访问者
  20. server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
  21. { request->send_P(200, "text/html", index_html); });
  22. server.begin(); // 初始化HTTP服务器
  23. }
  24. void loop()
  25. {
  26. }

        当你添加上WiFi操作代码,把这个程序烧录入ESP32,并通过浏览器访问ESP32的IP地址时,浏览器会显示这个画面:

三、 如何在网页上显示数据

(1)打包你需要显示的数据

        以显示温度和湿度为例,需要将温湿度打包为HTML代码块

  1. String Merge_Data(void)
  2. {
  3. int Humidity = 50;// 此处应为获取温度代码
  4. int Temperature = 26;// 此处应为获取湿度代码
  5. // 将温湿度打包为一个HTML显示代码
  6. String dataBuffer = "<p>";
  7. dataBuffer += "<h1>传感器数据 </h1>";
  8. dataBuffer += "<b>温度: </b>";
  9. dataBuffer += String(Temperature);
  10. dataBuffer += "<br/>";
  11. dataBuffer += "<b>湿度: </b>";
  12. dataBuffer += String(Humidity );
  13. dataBuffer += "<br /></p>";
  14. // 最后要将数组返回出去
  15. return dataBuffer;
  16. }

(2)添加对应的响应

        然后在setup中,server初始化前添加响应代码,把数据返回出去。

  1. void setup()
  2. {
  3. // 你需要再此处添加WiFi操作代码,开启热点或者连接到热点
  4. // 添加HTTP主页,当访问的时候会把网页推送给访问者
  5. server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
  6. { request->send_P(200, "text/html", index_html); });
  7. // 设置反馈的信息,在HTML请求这个Ip/dht这个链接时,返回打包好的传感器数据
  8. server.on("/dht", HTTP_GET, [](AsyncWebServerRequest *request)
  9. { request->send_P(200, "text/plain", Merge_Data().c_str()); });
  10. server.begin(); // 初始化HTTP服务器
  11. }

(3)修改HTML定时请求数据

        数据打包好了,也返回给HTML了,这个时候我们就需要HTML定时去请求数据,所以我们要在HTML中使用JS代码的定时器,来定时采集数据。

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. </head>
  6. <body>
  7. <h2>ESP32 网页</h2>
  8. <!-- 创建一个ID位dht的盒子用于显示获取到的数据 -->
  9. <div id="dht">
  10. </div>
  11. </body>
  12. <script>
  13. // 设置一个定时任务, 1000ms执行一次
  14. setInterval(function () {
  15. var xhttp = new XMLHttpRequest();
  16. xhttp.onreadystatechange = function () {
  17. if (this.readyState == 4 && this.status == 200) {
  18. // 此代码会搜索ID为dht的组件,然后使用返回内容替换组件内容
  19. document.getElementById("dht").innerHTML = this.responseText;
  20. }
  21. };
  22. // 使用GET的方式请求 /dht
  23. xhttp.open("GET", "/dht", true);
  24. xhttp.send();
  25. }, 1000)
  26. </script>

        当代码请求到结果的时候,就会使用结果替换ID为dht的组件内容(此处为DIV盒子)。所以,我们在打包数据的时候就要提前对数据加上HTML代码进行美化,如果不加以美化,返回的就只会是单纯的一串字符串,可读性极差。烧录代码后,显示效果如下:

        

温湿度显示效果

 四、如何下发数据

(1)修改HTML添加必要的组件

        以按钮为例,我们需要在HTML中添加一个按钮

<button onclick="set()"> 发送数据 </button>

        按钮需要绑定onclick运行JS函数

  1. // 按下按钮会运行这个JS函数
  2. function set() {
  3. var payload = "ESP32"; // 需要发送的内容
  4. // 通过get请求给 /set
  5. var xhr = new XMLHttpRequest();
  6. xhr.open("GET", "/set?value=" + payload, true);
  7. xhr.send();
  8. }

        当我们按下按钮的时候,触发onclick事件,进而运行JS中的函数 set。

        运行JS函数后,会将payload已GET的方式提交到/set。

        

                                                                 

(2)在ESP32添加对应的响应

        上面的HTML发送过来的数据,通用需要添加对应的响应来获取内容z

  1. // 下发处理回调函数
  2. void Config_Callback(AsyncWebServerRequest *request)
  3. {
  4. if (request->hasParam("value")) // 如果有值下发
  5. {
  6. String HTTP_Payload = request->getParam("value")->value(); // 获取下发的数据
  7. Serial.printf("[%lu]%s\r\n", millis(), HTTP_Payload.c_str()); // 打印调试信息
  8. }
  9. request->send(200, "text/plain", "OK"); // 发送接收成功标志符
  10. }
  11. void setup()
  12. {
  13. // 你需要再此处添加WiFi操作代码,开启热点或者连接到热点
  14. // 添加HTTP主页,当访问的时候会把网页推送给访问者
  15. server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
  16. { request->send_P(200, "text/html", index_html); });
  17. // 设置反馈的信息,在HTML请求这个Ip/dht这个链接时,返回打包好的传感器数据
  18. server.on("/dht", HTTP_GET, [](AsyncWebServerRequest *request)
  19. { request->send_P(200, "text/plain", Merge_Data().c_str()); });
  20. server.on("/set", HTTP_GET, Config_Callback); // 绑定配置下发的处理函数
  21. server.begin(); // 初始化HTTP服务器
  22. }

        这样,数据就从HTML到了ESP32,接下来就是对HTTP_Payload 字符串内的数据进行处理即可,在此不再赘述。

五、最终的代码

  1. #include <ESPAsyncWebServer.h> // 包含异步Web服务器库文件
  2. AsyncWebServer server(80); // 创建WebServer对象, 端口号80
  3. // 使用端口号80可以直接输入IP访问,使用其它端口需要输入IP:端口号访问
  4. // 一个储存网页的数组
  5. const char index_html[] PROGMEM = R"rawliteral(
  6. <!DOCTYPE HTML>
  7. <html>
  8. <head>
  9. <meta charset="utf-8">
  10. </head>
  11. <body>
  12. <h2>ESP32 网页</h2>
  13. <!-- 创建一个ID位dht的盒子用于显示获取到的数据 -->
  14. <div id="dht">
  15. </div>
  16. <button onclick="set()"> 发送数据 </button>
  17. </body>
  18. <script>
  19. // 按下按钮会运行这个JS函数
  20. function set() {
  21. var payload = "ESP32"; // 需要发送的内容
  22. // 通过get请求给 /set
  23. var xhr = new XMLHttpRequest();
  24. xhr.open("GET", "/set?value=" + payload, true);
  25. xhr.send();
  26. }
  27. // 设置一个定时任务, 1000ms执行一次
  28. setInterval(function () {
  29. var xhttp = new XMLHttpRequest();
  30. xhttp.onreadystatechange = function () {
  31. if (this.readyState == 4 && this.status == 200) {
  32. // 此代码会搜索ID为dht的组件,然后使用返回内容替换组件内容
  33. document.getElementById("dht").innerHTML = this.responseText;
  34. }
  35. };
  36. // 使用GET的方式请求 /dht
  37. xhttp.open("GET", "/dht", true);
  38. xhttp.send();
  39. }, 1000)
  40. </script>)rawliteral";
  41. String Merge_Data(void)
  42. {
  43. int Humidity = 50;// 此处应为获取温度代码
  44. int Temperature = 26;// 此处应为获取湿度代码
  45. // 将温湿度打包为一个HTML显示代码
  46. String dataBuffer = "<p>";
  47. dataBuffer += "<h1>传感器数据 </h1>";
  48. dataBuffer += "<b>温度: </b>";
  49. dataBuffer += String(Temperature);
  50. dataBuffer += "<br/>";
  51. dataBuffer += "<b>湿度: </b>";
  52. dataBuffer += String(Humidity );
  53. dataBuffer += "<br /></p>";
  54. // 最后要将数组返回出去
  55. return dataBuffer;
  56. }
  57. // 下发处理回调函数
  58. void Config_Callback(AsyncWebServerRequest *request)
  59. {
  60. if (request->hasParam("value")) // 如果有值下发
  61. {
  62. String HTTP_Payload = request->getParam("value")->value(); // 获取下发的数据
  63. Serial.printf("[%lu]%s\r\n", millis(), HTTP_Payload.c_str()); // 打印调试信息
  64. }
  65. request->send(200, "text/plain", "OK"); // 发送接收成功标志符
  66. }
  67. void setup()
  68. {
  69. // 你需要再此处添加WiFi操作代码,开启热点或者连接到热点
  70. // 添加HTTP主页,当访问的时候会把网页推送给访问者
  71. server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
  72. { request->send_P(200, "text/html", index_html); });
  73. // 设置反馈的信息,在HTML请求这个Ip/dht这个链接时,返回打包好的传感器数据
  74. server.on("/dht", HTTP_GET, [](AsyncWebServerRequest *request)
  75. { request->send_P(200, "text/plain", Merge_Data().c_str()); });
  76. server.on("/set", HTTP_GET, Config_Callback); // 绑定配置下发的处理函数
  77. server.begin(); // 初始化HTTP服务器
  78. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/471156
推荐阅读
相关标签
  

闽ICP备14008679号