【Ardiuno】实验使用ESP32单片机实现高级web服务器暂时动态图表功能(图文)

接下来,我们继续实验示例代码中的Wifi“高级web服务器”,配置相关的无线密码后,开始实验

#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>

const char *ssid = "XIAOFEIYU";
const char *password = "XIAOFEIU666";

WebServer server(80);

const int led = 13;

void handleRoot() {
  digitalWrite(led, 1);
  char temp[400];
  int sec = millis() / 1000;
  int min = sec / 60;
  int hr = min / 60;

  snprintf(temp, 400,

           "<html>\
  <head>\
    <meta http-equiv='refresh' content='5'/>\
    <title>ESP32 Demo</title>\
    <style>\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
    <h1>Hello from ESP32!</h1>\
    <p>Uptime: %02d:%02d:%02d</p>\
    <img src=\"/test.svg\" />\
  </body>\
</html>",

           hr, min % 60, sec % 60
          );
  server.send(200, "text/html", temp);
  digitalWrite(led, 0);
}

void handleNotFound() {
  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";

  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }

  server.send(404, "text/plain", message);
  digitalWrite(led, 0);
}

void setup(void) {
  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  Serial.begin(9600);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("esp32")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);
  server.on("/test.svg", drawGraph);
  server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
  });
  server.onNotFound(handleNotFound);
  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
  delay(2); 
}

void drawGraph() {
  String out = "";
  char temp[100];
  out += "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"400\" height=\"150\">\n";
  out += "<rect width=\"400\" height=\"150\" fill=\"rgb(250, 230, 210)\" stroke-width=\"1\" stroke=\"rgb(0, 0, 0)\" />\n";
  out += "<g stroke=\"black\">\n";
  int y = rand() % 130;
  for (int x = 10; x < 390; x += 10) {
    int y2 = rand() % 130;
    sprintf(temp, "<line x1=\"%d\" y1=\"%d\" x2=\"%d\" y2=\"%d\" stroke-width=\"1\" />\n", x, 140 - y, x + 10, 140 - y2);
    out += temp;
    y = y2;
  }
  out += "</g>\n</svg>\n";

  server.send(200, "image/svg+xml", out);
}

从串口监视器查看获取的ip地址,使用浏览器打开这个服务器,可以看到下面的图形会定时更新切换。 

这个例子给了我们一个可以生成实时图表的思路,使用硬件获取数据后可以直接以web图形的形式进行输出,直接作为服务器使用,这样的系统更为稳定,不用单独再配置计算机来进行数据的展示。 

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-13 23:00:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-13 23:00:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-13 23:00:03       87 阅读
  4. Python语言-面向对象

    2024-06-13 23:00:03       96 阅读

热门阅读

  1. 雅可比矩阵奇异求解

    2024-06-13 23:00:03       36 阅读
  2. SDK version 2018.3 doesnt match hw_server version 2015.2

    2024-06-13 23:00:03       23 阅读
  3. 英伟达SSD视觉算法模型训练代码解析

    2024-06-13 23:00:03       27 阅读
  4. Stable Diffusion 3 开源发布可下载体验

    2024-06-13 23:00:03       41 阅读
  5. Python PDF转化wolrd代码怎么写

    2024-06-13 23:00:03       32 阅读
  6. 【React】在 React 组件中,怎么使用useContext

    2024-06-13 23:00:03       32 阅读
  7. Cohere reranker 一致的排序器

    2024-06-13 23:00:03       37 阅读
  8. C# —— 逻辑运算符

    2024-06-13 23:00:03       33 阅读
  9. 异界传说-如何应对甲方提出的不合理需求

    2024-06-13 23:00:03       31 阅读
  10. MySQL(3)

    2024-06-13 23:00:03       30 阅读