这个物联网项目探索了物联网的一个重要方面:如何使用以太网屏蔽将Arduino连接到物联网云平台 。 这方面很重要,因为可以将数据存储在云中然后进行分析。 一旦数据(如传感器值)存储在云中,便可以使用智能手机访问数据并远程控制Arduino板。

该项目由两个不同部分组成:

  1. 第一部分描述了如何从连接到Arduino板的传感器收集数据并将此信息发送到存储它的云平台。
  2. 第二部分介绍如何使用Android智能手机访问此信息。

为此,数据由DHT11传感器生成,该传感器读取温度和湿度 。 作为存储数据的云IoT平台,我们将使用Ubidots平台 。 该传感器连接到Arduino板,后者使用以太网屏蔽罩连接到网络 。 在该项目中, 以太网屏蔽是Wiznet 5500 。

项目概况

项目概述如下所示:

arduino的物联网连不上原因_传感器

一旦温度和湿度传感器开始读取值, 它将通过Arduino板将其发送到云平台 。 该项目使用Ubidots将数据存储在云中。 该平台易于使用,并且可以轻松地与Arduino集成。 此外,它具有内置的仪表板功能,因此可以创建有趣的仪表板,以使用图表显示从板发送的值。

建设物联网项目

第一步是设置Arduino草图和电线连接。 DHT11传感器非常易于使用,并且可以轻松,快速地与Arduino集成在一起,此外还有一个库可以帮助开发系统。

下图显示了该项目的示意图:

arduino的物联网连不上原因_java_02

在此草图中,DHT11传感器连接到Arduino板,该板再使用以太网屏蔽连接到网络以发送数据。

第一步,我们检查所有连接是否正确,以尝试读取温度和湿度的值。

下面的代码片段显示了用于测试传感器的Arduino草图:

#include "DHT.h"
#include <spi.h>

#define DHTPIN 2
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
}

void loop() {
  delay(50000);
 
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" *C ");
}

要记住的一件事是在您的Arduino IDE中导入DHT11库。 运行示例,您应该获得温度和湿度。

如果一切正常,是时候添加Ubidots支持使事情变得更复杂了。 这个物联网项目的目的是将数据发送到云并进行存储 ,因此我们必须实现一个负责发送数据的代理 。

我们必须开发一个HTTP客户端,该客户端调用JSON服务以传递要存储在云中的数据

参考Ubidots文档 ,有必要创建客户端必须发送的身份验证令牌。 请阅读以下内容以了解更多如何创建令牌的信息。

在此IoT项目中,Arduino HTTP客户端同时发送两个变量:温度和湿度,因此要调用的URL为:

http://things.ubidots.com/api/v1.6/collections/values

而以JSON格式发送的数据是:

[{"variable": "varId", "value":val, "timestamp":timestamp}, {"variable": "vardId1", "value":val1, "timestamp":timestamp1}]

这是HTTP客户端的Arduino草图:

#include "DHT.h"
#include <spi.h>
#include <ethernet.h>


#define DHTPIN 2
#define DHTTYPE DHT11

// Ubidots Data
String tempVarId = "5656116076254219f78cad12";
String humVarId = "565611777625421b5e91a1ef";
String token = "aIk7lh3ipJGRdgAWOwJwDlPFwCdQu6uoLWZcGsMelXVAF62ycFsanB9Yywdk";

DHT dht(DHTPIN, DHTTYPE);
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

char server[]="things.ubidots.com";

EthernetClient client;
IPAddress ip(192, 168, 1, 40); // Arduino IP Add
IPAddress myDns(8,8,8,8);
IPAddress myGateway(192,168,1,1);

void setup() {
  Serial.begin(9600);
  Serial.print("Here");
  dht.begin();
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // try to congifure using IP address instead of DHCP:
   Ethernet.begin(mac,ip,myDns,myGateway);
  }
}

void loop() {
  

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" *C ");
  save_value(t, h);
  delay(5000);
}

void save_value(float tempValue, float humValue)
{
  Serial.println("Sending data...");
  // if you get a connection, report back via serial:
  int num = 0;
  delay(2000);
  
  // Post single value to single var
  // String varString = "{\"value\":"+ String(tempValue) + "}";
  String varString = "[{\"variable\": \"" + tempVarId + "\", \"value\":" + String(tempValue) + "}";
  varString += ",{\"variable\": \"" + humVarId + "\", \"value\":" + String(humValue) + "}]";
  num = varString.length();

  Serial.println("Connecting...");

  if (client.connect(server,80))
  {
       //client.println("POST /api/v1.6/variables/"+tempVarId+"/values HTTP/1.1");
       //Serial.println("POST /api/v1.6/variables/"+tempVarId+"/values HTTP/1.1");
       client.println("POST /api/v1.6/collections/values HTTP/1.1");
       Serial.println("POST /api/v1.6/collections/values HTTP/1.1");
       
       client.println("Content-Type: application/json");
       Serial.println("Content-Type: application/json");
       client.println("Content-Length: "+String(num));
       Serial.println("Content-Length: "+String(num));
       client.println("X-Auth-Token: "+token);
       Serial.println("X-Auth-Token: "+token);
       client.println("Host: things.ubidots.com\n");
       Serial.println("Host: things.ubidots.com\n");
       client.print(varString);
       Serial.print(varString+"\n");
    
  }
  else
  {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }

boolean sta = client.connected();
    Serial.println("Connection ["+String(sta)+"]");
  if (!client.connected())
  {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }
  
  Serial.println("Reading..");
  while (client.available())
  {
    char c = client.read();
    Serial.print(c);
  }
  client.flush();
  client.stop();

}

请注意,在第65和66行,我们使用变量id(请参阅以下内容以了解如何获取ID)构建JSON数据以传递给服务,在第83行,我们在标头中发送身份验证令牌。

几乎已经阅读了Ubidots的Arduino HTTP客户端,是时候在Ubidots中配置项目了。

现在,有必要在Ubidots上配置项目,以便Arduino客户端可以发送数据。 这可以使用Ubidots Web界面完成。

有必要创建两个变量:

  1. 一个保存温度值的
  2. 保持湿度值的一种。

在我们必须创建Ubidots项目之前:

arduino的物联网连不上原因_arduino的物联网连不上原因_03

配置项目后,我们可以定义变量:

arduino的物联网连不上原因_arduino的物联网连不上原因_04

我们对湿度变量执行相同的步骤,然后有了仪表板:

arduino的物联网连不上原因_python_05

如您所见,这两个变量有两个我们先前在创建JSON请求时使用的ID。

这些变量的ID在Arduino草图中使用:

...
// Ubidots Data
String tempVarId = "5656116076254219f78cad12";
String humVarId = "565611777625421b5e91a1ef";
...

最后一步是创建令牌:

arduino的物联网连不上原因_传感器_06

一旦配置了变量,我们就可以使用它们来发送数据。

运行草图,Arduino开始向Ubidots发送数据。 Ubidots提供的一项功能是可以轻松创建仪表盘的功能。 例如,对于温度,我们可以创建一个简单的仪表板来显示Arduino和DHT11发送的数据:

arduino的物联网连不上原因_java_07

arduino的物联网连不上原因_传感器_08

在真正的Arduino板下方,通过以太网屏蔽连接到DHT11。

arduino的物联网连不上原因_传感器_09

在物联网项目的第一部分中,您学习了如何使用Ubidots和以太网屏蔽将Arduino连接到云。 Arduino读取DHT11数据值并将其发送给Ubidots。

在下一篇文章中,您将了解如何从Android智能手机读取这些值以及如何在智能手机上创建图表。

翻译自: https://www.javacodegeeks.com/2015/12/internet-things-project-connect-arduino-ubidots-android-part-1.html