这个物联网项目探索了物联网的一个重要方面:如何使用以太网屏蔽将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 DHT11DHT 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支持使事情变得更复杂了。 这个物联网项目的目的是将数据发送到云并进行存储 ,因此我们必须实现一个负责发送数据的代理 。
Ubidots提供了一个有用的示例。 在Arduino中, 我们必须开发一个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