物联网项目:将Arduino连接到Ubidots和Android –第1部分
這個物聯網項目探索了物聯網的一個重要方面:如何使用以太網屏蔽將Arduino連接到物聯網云平臺 。 這方面很重要,因為可以將數據存儲在云中然后進行分析。 一旦數據(如傳感器值)存儲在云中,便可以使用智能手機訪問數據并遠程控制Arduino板。
該項目由兩個不同部分組成:
為此,數據由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
總結
以上是生活随笔為你收集整理的物联网项目:将Arduino连接到Ubidots和Android –第1部分的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: obs电脑录屏快捷键(obs录屏怎么用教
- 下一篇: jsf集成spring_Spring和J
