这个物联网项目探索了物联网的一个重要方面:如何使用以太网屏蔽将Arduino连接到物联网云平台 。 这方面很重要,因为可以将数据存储在云中然后进行分析。 一旦数据(如传感器值)存储在云中,便可以使用智能手机访问数据并远程控制Arduino板。
该项目由两个不同部分组成:
- 第一部分描述了如何从连接到Arduino板的传感器收集数据并将此信息发送到存储它的云平台。
- 第二部分介绍如何使用Android智能手机访问此信息。
为此,数据由DHT11传感器生成,该传感器读取温度和湿度 。 作为存储数据的云IoT平台,我们将使用Ubidots平台 。 该传感器连接到Arduino板,后者使用以太网屏蔽罩连接到网络 。 在该项目中, 以太网屏蔽是Wiznet 5500 。
项目概况
项目概述如下所示:
一旦温度和湿度传感器开始读取值, 它将通过Arduino板将其发送到云平台 。 该项目使用Ubidots将数据存储在云中。 该平台易于使用,并且可以轻松地与Arduino集成。 此外,它具有内置的仪表板功能,因此可以创建有趣的仪表板,以使用图表显示从板发送的值。
建设物联网项目
第一步是设置Arduino草图和电线连接。 DHT11传感器非常易于使用,并且可以轻松,快速地与Arduino集成在一起,此外还有一个库可以帮助开发系统。
下图显示了该项目的示意图:
在此草图中,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界面完成。
有必要创建两个变量:
- 一个保存温度值的
- 保持湿度值的一种。
在我们必须创建Ubidots项目之前:
配置项目后,我们可以定义变量:
我们对湿度变量执行相同的步骤,然后有了仪表板:
如您所见,这两个变量有两个我们先前在创建JSON请求时使用的ID。
这些变量的ID在Arduino草图中使用:
...
// Ubidots Data
String tempVarId = "5656116076254219f78cad12";
String humVarId = "565611777625421b5e91a1ef";
...
最后一步是创建令牌:
一旦配置了变量,我们就可以使用它们来发送数据。
运行草图,Arduino开始向Ubidots发送数据。 Ubidots提供的一项功能是可以轻松创建仪表盘的功能。 例如,对于温度,我们可以创建一个简单的仪表板来显示Arduino和DHT11发送的数据:
在真正的Arduino板下方,通过以太网屏蔽连接到DHT11。
在物联网项目的第一部分中,您学习了如何使用Ubidots和以太网屏蔽将Arduino连接到云。 Arduino读取DHT11数据值并将其发送给Ubidots。
在下一篇文章中,您将了解如何从Android智能手机读取这些值以及如何在智能手机上创建图表。
翻译自: https://www.javacodegeeks.com/2015/12/internet-things-project-connect-arduino-ubidots-android-part-1.html