通过HTTP从Arduino中读取数值

101 阅读2分钟

在本教程中,我想扩展Arduino Web服务器教程,以读取传感器测量的数值,这样我们就可以在浏览器上打开一个页面,看到数据。

例如,我们要用一个DHT11传感器来测量温度,用一个接近传感器来测量与物体的距离。

我们通过伸出/on URL来点亮Arduino上的内置LED,并通过打开/off URL来关闭它。其他的都没有作用。

这是另一个教程的代码。

#include <SPI.h>
#include <WiFiNINA.h>

WiFiServer server(80);

void setup() {
  char ssid[] = SECRET_SSID;
  char pass[] = SECRET_PASS;

  Serial.begin(9600);
  while (!Serial);

  int status = WL_IDLE_STATUS;
  while (status != WL_CONNECTED) {
    Serial.print("Connecting to ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, pass);
    delay(5000);
  }

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

  server.begin();
}

void loop() {
  WiFiClient client = server.available();
  if (client) {
    String line = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);

        if (c != '\n' && c != '\r') {
          line += c;
        }

        if (c == '\n') {
          if (line.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");  // the connection will be closed after completion of the response
            client.println();
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("test");
            client.println("</html>");
            break;
          } else {
            line = "";
          }
        }
      }
    }

    client.stop();
  }
}

在你看到的最后一个else ,我们有一个完整的行,所以我们可以在清除它之前检查其内容。在这种情况下,我们可以检查GET /onGET /off

if (line.startsWith("GET /on ")){
  digitalWrite(LED_BUILTIN, HIGH);
}
if (line.startsWith("GET /off ")) {
  digitalWrite(LED_BUILTIN, LOW);
}

就这样了!现在在Arduino上加载代码,并调用/on URL,或/off URL。

我使用我的本地网络路由器给Arduino保留了一个静态IP,我在我的/etc/hosts 文件中把它命名为arduino.local ,所以伸手到http://arduino.local/on ,就可以把LED打开,伸手到http://arduino.local/off ,就可以把LED关闭。

下面是完整的程序。

#include <SPI.h>
#include <WiFiNINA.h>

WiFiServer server(80);

void setup() {
  char ssid[] = SECRET_SSID;
  char pass[] = SECRET_PASS;

  Serial.begin(9600);
  while (!Serial);

  int status = WL_IDLE_STATUS;
  while (status != WL_CONNECTED) {
    Serial.print("Connecting to ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, pass);
    delay(5000);
  }

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

  server.begin();
}

void loop() {
  WiFiClient client = server.available();
  if (client) {
    String line = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);

        if (c != '\n' && c != '\r') {
          line += c;
        }

        if (c == '\n') {
          if (line.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");  // the connection will be closed after completion of the response
            client.println();
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("test");
            client.println("</html>");
            break;
          } else {
            if (line.startsWith("GET /on ")){
              digitalWrite(LED_BUILTIN, HIGH);
            }
            if (line.startsWith("GET /off ")) {
              digitalWrite(LED_BUILTIN, LOW);
            }

            line = "";
          }
        }
      }
    }

    client.stop();
  }
}