ESP32-C3实现网页显示ADC的电压-(改进版)

devtools/2024/10/19 7:34:57/

源码

#include <WiFi.h>
#include <WebServer.h>// 替换为你的WiFi网络名称和密码
const char* ssid = "123";
const char* password = "1234678901";WebServer server(80);  // 创建一个Web服务器对象,监听80端口// 定义ADC引脚
const int adcPin = 2;  // 使用GPIO 2作为ADC输入void setup() {Serial.begin(115200);// 连接WiFiWiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("WiFi connected.");Serial.println("IP address: ");Serial.println(WiFi.localIP());// 设置服务器路由server.on("/", handleRoot);  // 当访问根目录时调用handleRoot函数server.on("/readADC", handleReadADC);  // 当访问/readADC时调用handleReadADC函数// 启动服务器server.begin();
}void loop() {server.handleClient();  // 处理客户端请求
}void handleRoot() {String html = "<html><head><style>body { background-color: #ADD8E6; }</style>";html += "<script>";html += "function updateADC() {";html += "  var xhr = new XMLHttpRequest();";html += "  xhr.onreadystatechange = function() {";html += "    if (this.readyState == 4 && this.status == 200) {";html += "      document.getElementById('adcValue').innerHTML = this.responseText;";html += "    }";html += "  };";html += "  xhr.open('GET', '/readADC', true);";html += "  xhr.send();";html += "}";html += "setInterval(updateADC, 1000);"; // 每秒更新一次html += "</script>";html += "</head><body>";html += "<h1>ESP32-C3 ADC Readings</h1>";html += "<p>Voltage: <span id='adcValue'>0</span> V</p>";html += "</body></html>";server.send(200, "text/html", html);  // 发送网页内容
}void handleReadADC() {int adcValue = analogRead(adcPin);  // 读取ADC值float voltage = (adcValue * 3.3) / 4095.0;  // 转换ADC值为电压server.send(200, "text/plain", String(voltage, 2));  // 发送电压值,保留两位小数
}

网页实现数据显示的思路

  1. 数据采集:首先,需要确定你想要显示的数据来源。在ESP32-C3的情况下,这可能是一个ADC读取、GPIO状态、传感器数据等。

  2. 数据格式化:采集到的数据需要被格式化成可以发送给客户端(通常是浏览器)的格式,通常是JSON或纯文本。

  3. 服务器端设置

    • 创建一个Web服务器,用于处理来自客户端的请求。
    • 定义路由,这些路由会响应对特定URL的请求。
    • 在路由的处理函数中,采集数据,并将其格式化后发送给客户端。
  4. 客户端(网页)设计

    • 创建HTML页面,用于显示数据和提供用户界面。
    • 使用CSS来美化网页,使其更加友好和易于使用。
    • 使用JavaScript来处理用户交互和从服务器动态获取数据。

数据如何更新的思路

服务器端:

  1. 数据源:确保服务器端有实时或定期更新的数据源,例如数据库、传感器、API等。

  2. 数据监听:服务器端需要监听数据源的变化,或者定期检查数据是否更新。

  3. 数据推送

    • 轮询(Polling):客户端定期发送请求到服务器,询问是否有新数据。
    • 长轮询(Long Polling):客户端发送请求到服务器,服务器保持连接打开直到有新数据可发送。
    • 服务器发送事件(Server-Sent Events, SSE):服务器主动向客户端推送数据。
    • WebSocket:建立一个持久的连接,服务器可以在任何时间向客户端发送数据。

客户端:

  1. 初始化:客户端加载页面并初始化数据展示。

  2. 数据请求:根据采用的更新策略,客户端发送请求到服务器。

  3. 数据处理

    • 接收服务器响应的数据。
    • 更新页面上的数据展示。

以下是不同更新策略的具体实现思路:

轮询(Polling):(实现的)
  1. 客户端:使用setIntervalsetTimeout在JavaScript中定期发送AJAX请求到服务器。

function fetchData() {fetch('/data').then(response => response.json()).then(data => {updateUI(data);setTimeout(fetchData, 5000); // 每5秒请求一次});
}fetchData();
  1. 服务器端:处理请求并返回当前数据。

void handleData() {// 获取数据String jsonData = getLatestData();server.send(200, "application/json", jsonData);
}
长轮询(Long Polling):
  1. 客户端:发送请求到服务器,并等待直到服务器有新数据返回。

function longPolling() {fetch('/data').then(response => response.json()).then(data => {updateUI(data);longPolling(); // 重新发起长轮询});
}longPolling();
  1. 服务器端:保持连接打开,直到有新数据可发送。

void handleData() {// 等待直到有新数据String jsonData = waitForNewData();server.send(200, "application/json", jsonData);
}
服务器发送事件(Server-Sent Events, SSE):
  1. 客户端:创建一个EventSource来监听服务器发送的事件。

var eventSource = new EventSource('/events');
eventSource.onmessage = function(event) {var data = JSON.parse(event.data);updateUI(data);
};
  1. 服务器端:发送事件到客户端。

void handleEvents() {// 发送新数据作为事件String eventData = getEventData();server.sendContent("data: " + eventData + "\n\n");
}
WebSocket:
  1. 客户端:建立WebSocket连接,并监听消息。

var socket = new WebSocket('ws://example.com/socket');
socket.onmessage = function(event) {var data = JSON.parse(event.data);updateUI(data);
};
  1. 服务器端:处理WebSocket连接,并在有新数据时发送消息。

void onWebSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {if (type == WStype_TEXT) {// 发送新数据String data = getWebSocketData();webSocket.sendTXT(num, data);}
}

选择哪种策略取决于应用的需求,例如数据更新频率、延迟敏感度、服务器和客户端的资源限制等。轮询是最简单的方法,但可能不是最高效的;WebSocket提供了全双工通信,但实现起来相对复杂。


http://www.ppmy.cn/devtools/125103.html

相关文章

桶排序(Bucket Sort)

桶排序&#xff08;Bucket Sort&#xff09;是一种用于排序的算法&#xff0c;适合于分布均匀的数值数据。其基本思路是将数据分到有限数量的桶中&#xff0c;每个桶再单独进行排序&#xff0c;最后将各个桶中的元素合并起来。 桶排序首先要确认桶的数量。桶的数量应该与待排序…

Java后端面试题(day16)

目录 java常见的引用类型java中深拷贝和浅拷贝如何设计一个秒杀系统?谈一下对高并发的理解&#xff0c;平时怎么处理高并发问题?Comparable和Comparator区别&#xff1f;解决hash冲突有哪些方法&#xff1f;Synchronized锁的升级过程 java常见的引用类型 java的引用类型一般分…

Python 工具库每日推荐 【BeautifulSoup】

文章目录 引言Python工具库的重要性今日推荐:BeautifulSoup工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例获取 BeautifulSoup 官网文档首页的标题与所有图片案例分析扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计模式 专栏…

【机器学习】金融预测 —— 风险管理与股市预测

我的主页&#xff1a;2的n次方_ 在金融领域&#xff0c;机器学习&#xff08;ML&#xff09;已经成为了不可或缺的工具。金融预测&#xff0c;尤其是风险管理和股市预测&#xff0c;涉及海量数据和复杂模式的分析&#xff0c;而这些正是机器学习擅长处理的领域。通过分析历…

Python的pandas库基本操作(数据分析)

一、安装,导入 1、安装 使用包管理器安装: pip3 install pandas 2、导入 import pandas as pd as是为了方便引用起的别名 二、DateFrame 在Pandas库中,DataFrame 是一种非常重要的数据结构,它提供了一种灵活的方式来存储和操作结构化数据。DataFrame 类似于Excel中…

【优选算法】(第三十五篇)

目录 验证栈序列&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 N叉树的层序遍历&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 验证栈序列&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;L…

KDD 2024论文分享┆用于序列推荐的数据集再生

论文简介 本推文介绍了2024 KDD的最佳学生论文《Dataset Regeneration for Sequential Recommendation》。该论文提出了一种基于数据中心化范式的新框架&#xff0c;称为DR4SR&#xff0c;该框架通过模型无关的数据再生机制&#xff0c;能够生成具有出色跨架构泛化能力的理想训…

阿里云NAS之间迁移实践

本文将介绍如何通过LocalFs的最佳实践来进行阿里云NAS之间数据的迁移。 概述 阿里云提供的在线迁移服务是一种存储产品数据通道&#xff0c;客户有时需要在阿里云NAS之间进行数据迁移。本文档详细介绍了针对这一场景的相关内容。 警告 迁移过程数据不保证数据一致性&#x…