【问题标题】:Arduino, esp8266 and serving webpagesArduino、esp8266 和服务网页
【发布时间】:2020-03-11 13:56:05
【问题描述】:

我正在学习有关使用连接到 Arduino Uno 的 esp8266 来提供带有 Ajax 的网页的教程,该网页检索 json 文件(也由 Arduino 提供)。该教程(此处不会链接到它)看起来像是一部虚构作品,因为作者使用这样的字符串构建网页:

    String webpage = "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width, minimumscale=1.0, maximum-scale=1.0, initial-scale=1\" />";
    webpage += "<style>body { background-color: #cccccc; text-align: center; max-width: 400px; margin: 10px auto; } #datavalues { max-width: 400px; display: block; margin-top: 30px; }</style>";
    webpage += "</head><body>";
    webpage += "<div id=\"datavalues\">";
    webpage += "<h1>Light: </h1><div id=\"light\">";
    webpage += lightval;
    webpage += "</div>";
    webpage += "<h1>Count: </h1><div id=\"count\">";
    webpage += count;
    webpage += "</div>";
    webpage += "</div>";
    webpage += "<script>function loadDoc() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var obj = JSON.parse(this.responseText); document.getElementById(\"light\").innerHTML = obj.data[0].datavalue; document.getElementById(\"count\").innerHTML = obj.data[1].datavalue; } }; xhttp.open(\"GET\", \"data.json\", true); xhttp.send(); } var timedEvent = setInterval(function(){ loadDoc(); }, 2000);</script>";
    webpage += "</body></html>";

当您对其进行测试时,看起来网页对于字符串来说太长了,或者 uno 内存不足。我一直在尝试使用 c 类型的字符串(读起来它们更有效),如下所示:

    char webpage[1024] = "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width, minimumscale=1.0, maximum-scale=1.0, initial-scale=1\" />";
    strcat(webpage, "<style>body { background-color: #cccccc; text-align: center; max-width: 400px; margin: 10px auto; } #datavalues { max-width: 400px; display: block; margin-top: 30px; }</style>");

但它似乎并没有太大的区别。有没有办法从 arduino 提供这种大小的网页? / 构建和服务它的最有效方式是什么?

【问题讨论】:

  • 问题:您是否有特殊需要使用 Arduino(我猜是 Uno)。您是否使用具有 1 或 4 Mb 内存的 ESP8266 wif 模块。模块的品牌是什么(例如 12e 或 1 或?)。您对字符串问题是正确的,由于 Uno(?) 的内存有限,即使字符也无法帮助您
  • 是的,我一直在使用 uno,这是本科生学习 Arduino 的一些教学的一部分,所以即使我们可以直接使用 esp8266,我仍想使用 uno,以确保其他所有内容的一致性他们一直在努力。我一切正常,只是 ajax 太长了。
  • 会看这个@Juraj,但需要测试下面的答案示例,因为它看起来更健壮。

标签: string server arduino esp8266


【解决方案1】:

根据 Arduino (UNO) 上的可用内存,您可以将 HTML 移动到 progmem
示例代码

//HTML Code Start-----------------------------------
static const char PROGMEM INDEX_HTML[] = R"rawliteral(
<!doctype html>
<html>
.... your page code here
        <script>
   ...even with javascript
       </script>
     </body>
 </html>
 )rawliteral";
//HTML Code END-----------------------------------

然后你会在你的响应中使用它(使用像简单网络服务器这样的库或 Uno 类似的库),比如

 server.on("/index.html", HTTP_GET, []() {
    server.send(200, "text/html", (const char *)INDEX_HTML);
});

如果只是通过 wifi 发送,你会做一个

  client.print(...);

从一个最小的页面开始(编译后注意你的内存)——下一步应该是在 esp (SPIFFS/LittleFS) 中托管 Web 功能,并通过串行连接到 arduino 并在引脚之间交换数据。
最后一个提示:永远不要使用 Arduino String 类和通信任务 - 它会使堆碎片化并使 Arduino/ESP 崩溃。而是使用预定义的 char 数组和指针。

【讨论】:

  • “永远不要使用 Arduino String 类和通信任务——它会使堆碎片化并使 Arduino/ESP 崩溃”所以这就是正在发生的事情——一直试图弄清楚为什么 Arduino 会用 ajax 炸弹。最初工作,但在大约五个电话中的四个后停止。我认为 Arduino 无法处理呼叫的频率,或者只是我们太长的字符串。将使用 PROGMEM 尝试您的建议。非常感谢@Codebreaker007。
  • 什么是server.on?没有使用 esp8266 作为网络适配器的 Uno 库,server.om
  • @Juraj 您可以使用 Uno 或类似的简单网络服务器库,它通过以太网或 esp 模块提供此功能。但你是对的,我为新手编辑了我的答案。感谢您的意见,
  • 对不起,有一个图书馆。 ESP8266_AT_WebServer 库
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多