基於 Arduino 和 IoT 雲平臺搭建物聯網系統
在這篇文章中,我們將介紹如何搭建一款監測土壤水分的物聯網系統,用於在土壤幹燥時發出警報,提醒用戶。本項目使用了IoT 雲平臺來管理警報系統,同時存儲來自傳感器的數據。眾所周知,物聯網是當今熱門話題之一,它將改變我們的未來及生活方式。如今我們可以自己動手搭建物聯網系統,因為市場上已有一些原型板,這使得我們不用花費太多金錢及精力就可以著手物聯網項目。
搭建 IoT 系統項目
構建這個項目,我們需要:
- Arduino MKR1000;
- 濕度傳感器;
- IoT 雲平臺 Carriots 的免費賬戶(點擊這裏創建賬戶);
- IFFT 賬戶(點擊這裏,了解更多)。
該項目的核心理念是搭建一個監測土壤水分的 IoT 系統,勘測土壤的濕度。Arduino MKR1000 控制傳感器向 Carriots IoT 平臺發送數據。Carriots 平臺反過來存儲來自傳感器的數據,並檢測存儲的值何時達到閾值。下文我們會分享如何分析數據。現在可以假設 Carriots IoT 平臺能夠以某種方式調用一個 IFFT 服務,並向用戶發送一個提醒的短消息。構建該 IoT 系統,我們可以探索如何使用 IoT 生態系統的組件。此外,該項目使用 LED 矩陣顯示濕度土壤狀態。接下來,我們看看具體怎麽搭建。
檢測傳感器數據
第一步,我們必須讀取傳感器數據。該 IoT 項目使用了 YL-38 + YL-69 傳感器,這個是可以插入要檢查的土壤中的模擬傳感器。那麽如何將傳感器連接到 Arduino,如下所示:
代碼很簡單。我們 從A1 引腳讀取數據,然後計算濕度:
float moistureHum = analogRead(A1);
moistureHum = (1023 - moistureHum) * 100 /1023;
此外,還需將 Arduino MKR1000 連接到互聯網,以便它可以發送數據:
#include "WiFi101.h"
WiFiClient client;
void setup() {
Serial.begin(9600);
Serial.print("Starting...");
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
while (true);
}
connectToWifi();
}
connectToWifi()
包含:
void connectToWifi() {
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
}
這樣,如以上代碼所述,我們可以管理顯示濕度的 LED 矩陣。接下來就聚焦於物聯網雲平臺上。
連接到 IoT 雲平臺
在將數據發送到雲端之前,我們必須配置 Carriots 平臺才能管理數據。 Carriots 使用了分層結構來對設備進行分組和管理。因此,在使用設備之前,必須創建此結構。用戶一旦登錄,先點擊“Hierarchy”,再點擊“ Project”,填寫所需的數據,如下圖:
下一步創建服務,填寫所需的數據:
最後,創建組:
以上的步驟只需做一次。最後一步是配置設備。它表示我們用來發送數據的物理設備。該設備屬於在最後一步創建的組,組屬於服務,服務屬於項目。配置步驟非常簡單,如下圖所示:
至此,配置步驟已完成。我們需將 Arduino 設備連接到 Carriots 並開始發送數據。上圖中,Id.developer 這個參數很重要,它代表了將來自 Arduino 設備的數據綁定到 Carriots 設備的唯一標識符。另一個重要參數是 API 密鑰。你可以在設置>API密鑰菜單中找到它。為了發送數據,我們將這個函數添加到上面的代碼中:
void sendData(float data) {
if (client.connect(server,80)) {
Serial.println("Connected to the server....");
String jsonData = "{\"protocol\":\"v2\",\"device\":\""+DEVICE_ID+
"\",\"at\":\"now\",\"data\":{\"soil\":\""+
String(data)+"\"}}"; // Make a HTTP request
client.println("POST /streams HTTP/1.1");
client.println("Host: api.carriots.com");
client.println("Accept: application/json");
client.println("User-Agent: Arduino-Carriots");
client.println("Content-Type: application/json");
client.print("carriots.apikey: ");
client.println(API_KEY);
client.print("Content-Length: ");
int thisLength = jsonData.length();
client.println(thisLength);
client.println("Connection: close");
client.println();
client.println(jsonData);
}
}
註意該函數發送一個包含從傳感器讀取的數據的 JSON 有效載荷。必須在 loop()
方法中調用此函數。運行這個程序,我們可以發現設備向 Carriots 發送數據,如下所示:
監控物聯網傳感器數據
接下來是監控數據。通常在物聯網系統中,我們不僅希望從傳感器獲取數據,而且當這些值超出特定值時,我們希望監視這些信息以采取完善措施。本項目中,當土壤太過幹燥時,我們要告知用戶。雖然 Carriots 擁有內置的電子郵件系統,但我們更傾向於與 Carriots 集成的另一個有用的平臺,即 IFFT。該平臺提供了多種集成服務。
為了提醒用戶,我們需要兩個組件:
- 監控數據系統;
- 警報系統。
作為監控數據系統,本 IoT 系統項目使用 Carriots 監聽器。監聽是分析輸入值及應用特定規則的一個過程。當規則被驗證時,它就會調用一個腳本。對於 Carriots 的有趣方面是,我們可以使用 Groovy 作為腳本語言來調用外部服務。
警報系統建立在 IFFT 上。在完成 Carriots 的任務之前,配置 IFFT 非常有必要。如上所述,當濕度達到閾值時,我們想要發送一條短消息提醒用戶。為了實現這個功能,需要在 IFFT 中配置一個短消息服務。在此之前,我們需要一個免費的帳戶。那麽首先我們創建一個新的 Applet:
點擊“+”添加服務並搜索“Maker”服務:
選擇“Maker webhooks”來啟用 IoT Maker。接下來配置 maker 服務,並填入觸發發送消息進程的事件名稱:
最後,啟動發送消息服務,配置所有必需的參數,如目標號碼和消息體牛肉板面:
現在,我們來看一下 Carriots 平臺的監聽器。首先創建一個新的監聽器,調用與之前剛創建的 Applet 相關的 URL。當監聽器調用 URL 時,IFFT 發送一條短消息。配置監聽器流程如下圖所示:
最後一步是配置表達式。我們可以使用 Groovy 寫這個案例。
綜上,我們可以驗證當土壤水分低於閾值水平時,手機上是否會收到一條短信。
總結
通過本文,相信大家已經學會了如何使用傳感器、Arduino 和 IoT 雲平臺構建 IoT 系統。也正如本文所述,我們可以集成現有的平臺和服務來構建一款 IoT 系統。
基於 Arduino 和 IoT 雲平臺搭建物聯網系統