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

这篇具有很好参考价值的文章主要介绍了ESP32网页控制显示数据原来如此简单。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、写在前头

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

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

二、如何对ESP32进行配置

(1)基础配置

        ESPAsyncTCP库下载

        ESPAsyncWebServer库下载

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

#include <ESPAsyncWebServer.h>    // 包含异步Web服务器库文件

AsyncWebServer server(80);        // 创建WebServer对象, 端口号80
// 使用端口号80可以直接输入IP访问,使用其它端口需要输入IP:端口号访问
// 一个储存网页的数组
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
     <h2>ESP32 网页</h2>
</body>
<script>
    
</script>)rawliteral";
void setup()
{
  // 你需要再此处添加WiFi操作代码,开启热点或者连接到热点
  // 添加HTTP主页,当访问的时候会把网页推送给访问者
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
            { request->send_P(200, "text/html", index_html); });
  server.begin();  // 初始化HTTP服务器
}


void loop()
{
}

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

esp32 网页,Arduino的那些事,javascript,开发语言,arduino,物联网,html5

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

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

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

String Merge_Data(void)
{
  int Humidity = 50;// 此处应为获取温度代码
  int Temperature = 26;// 此处应为获取湿度代码
  // 将温湿度打包为一个HTML显示代码
  String dataBuffer = "<p>";
  dataBuffer += "<h1>传感器数据 </h1>";
  dataBuffer += "<b>温度: </b>";
  dataBuffer += String(Temperature);
  dataBuffer += "<br/>";
  dataBuffer += "<b>湿度: </b>";
  dataBuffer += String(Humidity );
  dataBuffer += "<br /></p>";
  // 最后要将数组返回出去
  return dataBuffer;
}

(2)添加对应的响应

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

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

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

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

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

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

        esp32 网页,Arduino的那些事,javascript,开发语言,arduino,物联网,html5

温湿度显示效果

 四、如何下发数据

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

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

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

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

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

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

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

        esp32 网页,Arduino的那些事,javascript,开发语言,arduino,物联网,html5

                                                                 

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

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

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

        这样,数据就从HTML到了ESP32,接下来就是对HTTP_Payload 字符串内的数据进行处理即可,在此不再赘述。文章来源地址https://www.toymoban.com/news/detail-785350.html

五、最终的代码


#include <ESPAsyncWebServer.h>    // 包含异步Web服务器库文件

AsyncWebServer server(80);        // 创建WebServer对象, 端口号80
// 使用端口号80可以直接输入IP访问,使用其它端口需要输入IP:端口号访问
// 一个储存网页的数组
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML>
<html>

<head>
	<meta charset="utf-8">
</head>

<body>
	<h2>ESP32 网页</h2>
	<!-- 创建一个ID位dht的盒子用于显示获取到的数据 -->
	<div id="dht">
	</div>
	<button onclick="set()"> 发送数据 </button>
</body>

<script>
	// 按下按钮会运行这个JS函数
	function set() {
		var payload = "ESP32"; // 需要发送的内容
		// 通过get请求给 /set
		var xhr = new XMLHttpRequest();
		xhr.open("GET", "/set?value=" + payload, true);
		xhr.send();
	}
	// 设置一个定时任务, 1000ms执行一次
	setInterval(function () {
		var xhttp = new XMLHttpRequest();
		xhttp.onreadystatechange = function () {
			if (this.readyState == 4 && this.status == 200) {
				// 此代码会搜索ID为dht的组件,然后使用返回内容替换组件内容
				document.getElementById("dht").innerHTML = this.responseText;
			}
		};
		// 使用GET的方式请求 /dht
		xhttp.open("GET", "/dht", true);
		xhttp.send();
	}, 1000)

</script>)rawliteral";
String Merge_Data(void)
{
  int Humidity = 50;// 此处应为获取温度代码
  int Temperature = 26;// 此处应为获取湿度代码
  // 将温湿度打包为一个HTML显示代码
  String dataBuffer = "<p>";
  dataBuffer += "<h1>传感器数据 </h1>";
  dataBuffer += "<b>温度: </b>";
  dataBuffer += String(Temperature);
  dataBuffer += "<br/>";
  dataBuffer += "<b>湿度: </b>";
  dataBuffer += String(Humidity );
  dataBuffer += "<br /></p>";
  // 最后要将数组返回出去
  return dataBuffer;
}

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

到了这里,关于ESP32网页控制显示数据原来如此简单的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ESP32(MicroPython) 网页控制环形WS2812

    ESP32(MicroPython)网页控制环形WS2812 本程序用于提供网页控制环形WS2812,为了不影响网页正常运行,本程序取消了流水灯形式,改为每个灯或每2个灯或每4个灯取随机亮度,延时和亮度可调。主控换成ESP32C3,感觉网页流畅度比ESP32-EROOM32低一些。 程序如下

    2024年02月15日
    浏览(41)
  • ESP32作为服务器,使用网页控制LED小灯

    项目描述 ESP32-S开发板加入局域网,使用platformIO编写好ESP32的代码后,编译下载到ESP32中,访问ESP32的IP地址,使用网页控制连接着的LED小灯 项目准备: ESP32-S开发板 一根数据线 电脑 LED小灯 开发环境:vscode + PlatformIO 原理剖析 这个ESP32作为服务器,浏览器作为客户端,这是一个简

    2023年04月26日
    浏览(51)
  • 阿里云iot haas Micropython连接esp32;esp32物联网设备上报信息及云端信息获取;远程控制设备自带led熄灭;网页界面交互远程控制

    参考:https://blog.csdn.net/HaaSTech/article/details/125975052 https://iot.console.aliyun.com/ https://www.bbsmax.com/A/x9J2X8nZd6/ 首先烧录阿里云iot haas固件: https://haas.iot.aliyun.com/haasapi/index.html#/Python/docs/zh-CN/startup/ESP32_startup ***直接下载后可以通过vscode插件烧录;烧录好后也可以在thony编辑运行代码

    2024年02月02日
    浏览(50)
  • ESP32(MicroPython) WS2812点阵+可交互超声波云台+网页显示温湿度

    ESP32 RGB点阵 三种随机颜色模式 由于之前的RGB点阵程序中的后两个模式灯的颜色过饱和影响观感,本程序把这两个模式整合到所有灯取随机颜色的程序,分别实现所有灯各取随机颜色、每一圈的灯取随机颜色和每相邻4灯取同一种随机颜色。 本程序增加了服务器功能,可以通

    2024年02月12日
    浏览(44)
  • 毕业设计——基于STM32的智能家具控制系统(ESP-01S(8266)、手机app远程控制、远程显示温度)

    智能家具系统分为两个不同版本系列: ①系列一:手机app远程控制、远程检测温湿度显示在app,(云平台)    ---------本文章 ②系列二:语音识别控制                https://blog.csdn.net/m0_59113542/article/details/123742383 步进电机及相关驱动 步进电机28BYJ48 uln2003驱动板器4相5线

    2023年04月09日
    浏览(71)
  • 物联网开发笔记(91)- 使用Micropython开发ESP32开发板之通过串口SPI控制ILI9341 液晶屏显示文字

    一、目的         这一节我们学习如何使用ESP32开发板,通过串口SPI控制ILI9341 液晶屏。我使用的是3.2寸的,分辨率240x320 V1.0,TFT屏幕。文末有购买地址。 二、环境         ESP32(固件:esp32-20220618-v1.19.1.bin) + Thonny(V4.0.1) + ILI9341 液晶屏模块 + 几根杜邦线 + Win10 64位商业版

    2024年02月16日
    浏览(50)
  • ESP32-CAM , io控制,UDP 数据发送,视频传输

    主代码 附件文件

    2024年02月11日
    浏览(85)
  • 蓝牙串口调试助手通过PC蓝牙发送数据给ESP32同时在串口上显示

    OK,好久没有更新Blog啦 今天把之前积累的代码放上,给需要学习的程序猿们使用 我还是不太喜欢写文字,倒是比较喜欢客套,哈哈 硬件图: ESP32和USB-micro-B数据线一根 蓝牙串口调试助手通过PC蓝牙发送数据给ESP32同时在串口上显示 具体代码如下:

    2024年02月09日
    浏览(42)
  • ESP32上实现环境温湿度检测上传数据并通过微信小程序显示

    共包含三个步骤 Arduino端代码  onenet云平台产品准备  微信小程序代码 1. Arduino端代码如下: #include WiFi.h #include \\\"DHT.h\\\" #include \\\"PubSubClient.h\\\" #include \\\"Ticker.h\\\" #define DHTPIN 17      #define DHTTYPE DHT11    DHT dht(DHTPIN, DHTTYPE); int god=0; const char *ssid     = \\\"FAST_CAED9A\\\"; const char *password = \\\"13837

    2024年02月11日
    浏览(47)
  • ESP32设备驱动-OLED显示单个或多个DS18B20传感器数据

    在本文中,我们将介绍如何ESP32驱动单个或多个DS18B20传感器,并将DS18B20传感器数据在OLE中显示。 DS18B20 是一种温度传感器,本质上是单线可编程的。 它广泛用于测量存在于硬环境中的化学溶液和物质的温度。 使用此传感器的优势之一是我们只需要 ESP 板上的一个引脚即可传

    2024年02月07日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包