你是否需要一種快速的方法來監(jiān)測您最喜歡的蕨類植物的土壤水分含量?正巧,這篇文章里就有答案。
本文涵蓋的內(nèi)容
以下是我們將要討論的內(nèi)容:
使用DF Robot重力電容式土壤濕度傳感器、氦原子原型模塊、氦 Arduino 適配器和 Arduino 板構(gòu)建完整的土壤濕度探頭;
在氦儀表板中注冊您的氦元素和氦原子原型模塊;建立自己的低功耗廣域無線網(wǎng)絡(luò);
通過 Arduino IDE 對土壤濕度探頭進(jìn)行編程;
近乎實時地測量土壤水分?jǐn)?shù)據(jù)并將其發(fā)送到氦儀表板;并將其通過管道傳輸?shù)?Helium HTTP 通道。
讓我們開始吧。
構(gòu)建土壤濕度探頭
首先,我們需要構(gòu)建傳感單元。這是快速和容易的。完成后,您的完整探測應(yīng)如下所示:
要構(gòu)建這個,首先,將您的 Helium Atom 原型模塊固定到 Helium Arduino 適配器中,然后將此組合單元連接到您選擇的 Arduino 板。確保根據(jù)您使用的板相應(yīng)地配置和跳線。
接下來,我們需要使用 DF Robot Soil Moisture Probe 隨附的三線跨接電纜將實際的土壤濕度探頭連接到 Helium Arduino 適配器。三種電線顏色是黑色、紅色和藍(lán)色。在 Helium Arduino 適配器上,黑線連接到GND; 紅線連接到5V;藍(lán)線連接到接頭。正確接線后,我們的電路板如下所示:
最后將跨接電纜上的白色接頭連接到 DF 機器人土壤濕度探頭。
部署 Helium 網(wǎng)絡(luò)
現(xiàn)在是時候建立您自己的 Helium 網(wǎng)絡(luò)了。這大約需要 30 秒。
要部署Element并為基于 Atom 的傳感器創(chuàng)建網(wǎng)絡(luò)覆蓋范圍,只需使用提供的電源線將其插入電源和帶電以太網(wǎng)端口即可。
注意:如果您有支持蜂窩網(wǎng)絡(luò)的元素,則使用以太網(wǎng)連接是可選的,但建議作為備份。
一旦插入,您將看到一些 LED 活動。當(dāng)前置 LED 變?yōu)榫G色(表示以太網(wǎng)連接)或藍(lán)綠色(表示蜂窩連接)時,您的 Element 將被連接。
在 Helium Dashboard 中注冊
現(xiàn)在我們的傳感單元已經(jīng)構(gòu)建并且您的 Helium 網(wǎng)絡(luò)已經(jīng)部署,是時候在Helium Dashboard 中注冊您的硬件了。Dashboard 是 Helium 的托管用戶界面,用于監(jiān)控和管理連接的硬件部署。Helium 發(fā)布的所有硬件都已在我們的系統(tǒng)中注冊,但我們需要知道是誰在部署它。
首先,創(chuàng)建一個 Helium Dashboard 帳戶。
要注冊您的 Atom,首先選擇New Atom 。在 UI 中,添加一個名稱(例如Fern Saver ),然后輸入其最后四個MAC Address及其四個 digit HVV Code。點擊保存,你就完成了。
元素注冊的完成方式完全相同。選擇新元素,然后提供名稱、其最后四個MAC Address及其四位數(shù)字HVV Code。還要確保為您的元素輸入一個位置,以便儀表板可以在地圖上顯示它。
您可以通過查看儀表板中的狀態(tài)和信號來驗證您的元素是否在線:
部署 Helium HTTP 通道
Helium 平臺的一個主要特點是通道。這些是 Web 服務(wù)(如 AWS IoT、Google Cloud IoT 和 Azure IoT)和協(xié)議(如MQTT和HTTP)的預(yù)構(gòu)建連接器。借助 Channels,Helium 為您完成了與這些 Web 服務(wù)或協(xié)議之一集成的所有繁重工作。對于 Fern Saver,我們的土壤水分探測器,讓我們啟動一個HTTP 通道。這將使我們能夠通過管道將數(shù)據(jù)傳送到任何通過 HTTP 接受數(shù)據(jù)的 Web 服務(wù)。例如,您可以使用 HTTP 通道將此數(shù)據(jù)發(fā)送到IFTTT ,然后在每次 Fern Saver 報告濕度低于特定水平時接收文本。
在此示例中,我們將設(shè)置一個 HTTP 通道,將數(shù)據(jù)發(fā)送到requestb.in,這是一個方便、免費的 Web 服務(wù),用于測試 HTTP 服務(wù)。請注意,在下面,當(dāng)我們將 Sketch 上傳到 Arduino 時,我們將HTTP在代碼中引用此通道名稱 , 以便我們知道將數(shù)據(jù)發(fā)送到哪里。
配置您的 Arduino IDE 并上傳 Sketch
我們現(xiàn)在可以繼續(xù)配置您的 Arduino IDE 并導(dǎo)入所需的庫。開始:
然后我們需要添加兩個庫:Helium和ArduinoJson. 您可以通過轉(zhuǎn)到Sketch Include Library Manage Libraries 從 IDE 中添加庫。搜索“helium”,選擇它,然后點擊Install 。為“ArduinoJson”庫遵循相同的安裝過程。(我們需要這個庫,因為我們將記錄的土壤水分日期格式為 JSON。)-》-》
一旦完成,就該進(jìn)行一些實際的 Arduino 編程了。以下是完整的Soil_Humidity.ino 草圖。
/*
* Copyright 2017, Helium Systems, Inc.
* All Rights Reserved. See LICENCE.txt for license information
*
* Taking humidity readings using the SEN0192 capacitive humidity
* sensor. Wiring instructions:
* https://www.dfrobot.com/wiki/index.php/Capacitive_Soil_Moisture_Sensor_SKU:SEN0193
*
* Install the following libraries through Sketch->Manage Libraries:
* - ArduinoJson
* - Helium
*/
#include "Board.h"
#include
#include
#include
#include
// This Channel Name should correspond the Channel you've deployed in Helium
// Dashboard to ingest this data.
#define CHANNEL_NAME "HTTP"
// Delay for one second #define CHANNEL_DELAY 5000
// Send very 60 cycles (seconds)
#define CHANNEL_SEND_CYCLE 12
Helium helium(&atom_serial);
Channel channel(&helium);
int channel_counter;
void report_status(int status, int result = 0)
{
if (helium_status_OK == status)
{
if (result == 0)
{
Serial.println(F("Succeeded"));
}
else
{
Serial.print(F("Failed - "));
Serial.println(result);
}
}
else
{
Serial.println(F("Failed"));
}
}
void
connect()
{
while (!helium.connected())
{
Serial.print(F("Connecting - "));
int status = helium.connect();
report_status(status);
if (helium_status_OK != status)
{
delay(1000);
}
}
}
void
channel_create(const char * channel_name)
{
int8_t result;
int status;
do
{
// Ensure we're connected
connect();
Serial.print(F("Creating Channel - "));
status = channel.begin(channel_name, &result);
// Print status and result
report_status(status, result);
if (helium_status_OK != status)
{
delay(1000);
}
} while (helium_status_OK != status || result != 0);
}
void
channel_send(const char * channel_name, void const * data, size_t len)
{
int status;
int8_t result;
do
{
// Try to send
Serial.print(F("Sending - "));
status = channel.send(data, len, &result);
report_status(status, result);
// Create the channel if any service errors are returned
if (status == helium_status_OK && result != 0)
{
channel_create(channel_name);
}
else if (status != helium_status_OK)
{
delay(1000);
}
} while (helium_status_OK != status || result != 0);
}
void
setup()
{
Serial.begin(9600);
Serial.println(F("Starting"));
helium.begin(HELIUM_BAUD_RATE);
channel_create(CHANNEL_NAME);
channel_counter = 0; }
#define DRY_VALUE 536 // Taken in air
#define WET_VALUE 303 // Taken in water
#define HUM_RANGE (DRY_VALUE - WET_VALUE)
void
loop()
{
Serial.print(F("Reading - "));
float reading = analogRead(A0);
float percent = 100 * (1 - (reading - WET_VALUE) / HUM_RANGE);
Serial.print(reading);
Serial.print(" - ");
Serial.println(percent);
if (--channel_counter <= 0) ? ??
{
StaticJsonBuffer
JsonObject & root = jsonBuffer.createObject();
root[F("value")] = reading;
root[F("percent")] = percent;
char buffer[HELIUM_MAX_DATA_SIZE];
size_t used = root.printTo(buffer, HELIUM_MAX_DATA_SIZE);
channel_send(CHANNEL_NAME, buffer, used);
channel_counter = CHANNEL_SEND_CYCLE;
}
delay(CHANNEL_DELAY);
}
安裝Helium 和ArduinoJson 庫后,創(chuàng)建一個新草圖(從 Arduino IDE 中的File -》 New ),然后粘貼上面的代碼。然后,將完整的土壤濕度探頭硬件包通過 USB 電纜連接到您的工作站,點擊上傳按鈕。
Atom Prototyping Module 上的 LED 應(yīng)在片刻后開始閃爍。這是連接到 Helium 網(wǎng)絡(luò)的 Atom(通過我們之前部署的 Element)。如果 Arduino IDE 在上傳代碼時沒有拋出任何錯誤,則說明這是成功的,土壤濕度探頭現(xiàn)在正在生成讀數(shù)。
關(guān)于土壤水分?jǐn)?shù)據(jù)的注釋
如上所述,此 Sketch 將捕獲土壤水分?jǐn)?shù)據(jù)并對其進(jìn)行編碼,就像在發(fā)送到 Helium 平臺之前一樣。使用上面的 Sketch,一個數(shù)據(jù)點看起來像這樣(as ):JSON JSON
{
“value”: 433,
“percent”: 55.5
}
值得注意的是,DFRobot 重力電容式土壤濕度傳感器實際上將這些讀數(shù)捕獲為校準(zhǔn)的干濕讀數(shù)之間的模擬讀數(shù)。
在 Helium Dashboard 中驗證傳感器連接性和數(shù)據(jù)
現(xiàn)在您的傳感器已部署,我們可以驗證它是否在線并正在傳輸數(shù)據(jù)。在 Dashboard 中,我們可以通過幾種方式執(zhí)行此操作,都可以通過您剛剛部署的傳感器的Atom UI視圖。
如果您的 Atom 在線,儀表板將顯示其狀態(tài)和信號,以及有關(guān)其狀態(tài)的各種其他元數(shù)據(jù)。它看起來像這樣:
在同一個 Atom 界面的下方,我們還顯示了一個事件日志,顯示來自傳感器的每個數(shù)據(jù)點以及它是否成功傳輸?shù)胶ねǖ?。如上所述,這些是 Web 服務(wù)或原始協(xié)議的預(yù)構(gòu)建連接器。之前我們?yōu)槟?Helium 組織部署了一個HTTP 通道。而上面的 Sketch 告訴 Soil Moisture probe 將數(shù)據(jù)發(fā)送到這個通道 - 稱為HTTP。然而,在下圖的示例中,我們將數(shù)據(jù)發(fā)送到 Helium HTTP 通道:
我們還為每個 Atom 提供了一個Debug界面,它將在您的讀數(shù)進(jìn)入時顯示您的讀數(shù)(一旦您啟用了此選項)。這是儀表板的調(diào)試查看器中的一些土壤水分?jǐn)?shù)據(jù):
恭喜!本文到此結(jié)束。您現(xiàn)在已經(jīng)使用無線土壤濕度探頭為您的蕨類植物提供了面向未來的保障。
土壤濕度相關(guān)代碼:
/*
* Copyright 2017, Helium Systems, Inc.
* All Rights Reserved. See LICENCE.txt for license information
*
* Taking humidity readings using the SEN0192 capacitive humidity
* sensor. Wiring instructions:
* https://www.dfrobot.com/wiki/index.php/Capacitive_Soil_Moisture_Sensor_SKU:SEN0193
*
* Install the following libraries through Sketch->Manage Libraries:
* - ArduinoJson
* - Helium
*/
#include "Board.h"
#include
#include
#include
#include
#define CHANNEL_NAME "Helium MQTT"
// Delay for one second
#define CHANNEL_DELAY 5000
// Send very 60 cycles (seconds)
#define CHANNEL_SEND_CYCLE 12
Helium helium(&atom_serial);
Channel channel(&helium);
int channel_counter;
void
report_status(int status, int result = 0)
{
if (helium_status_OK == status)
{
if (result == 0)
{
Serial.println(F("Succeeded"));
}
else
{
Serial.print(F("Failed - "));
Serial.println(result);
}
}
else
{
Serial.println(F("Failed"));
}
}
void
connect()
{
while (!helium.connected())
{
Serial.print(F("Connecting - "));
int status = helium.connect();
report_status(status);
if (helium_status_OK != status)
{
delay(1000);
}
}
}
void
channel_create(const char * channel_name)
{
int8_t result;
int status;
do
{
// Ensure we're connected
connect();
Serial.print(F("Creating Channel - "));
status = channel.begin(channel_name, &result);
// Print status and result
report_status(status, result);
if (helium_status_OK != status)
{
delay(1000);
}
} while (helium_status_OK != status || result != 0);
}
void
channel_send(const char * channel_name, void const * data, size_t len)
{
int status;
int8_t result;
do
{
// Try to send
Serial.print(F("Sending - "));
status = channel.send(data, len, &result);
report_status(status, result);
// Create the channel if any service errors are returned
if (status == helium_status_OK && result != 0)
{
channel_create(channel_name);
}
else if (status != helium_status_OK)
{
delay(1000);
}
} while (helium_status_OK != status || result != 0);
}
void
setup()
{
Serial.begin(9600);
Serial.println(F("Starting"));
helium.begin(HELIUM_BAUD_RATE);
channel_create(CHANNEL_NAME);
channel_counter = 0;
}
#define DRY_VALUE 536 // Taken in air
#define WET_VALUE 303 // Taken in water
#define HUM_RANGE (DRY_VALUE - WET_VALUE)
void
loop()
{
Serial.print(F("Reading - "));
float reading = analogRead(A0);
float percent = 100 * (1 - (reading - WET_VALUE) / HUM_RANGE);
Serial.print(reading);
Serial.print(" - ");
Serial.println(percent);
if (--channel_counter <= 0)
{
StaticJsonBuffer
JsonObject & root = jsonBuffer.createObject();
root[F("value")] = reading;
root[F("percent")] = percent;
char buffer[HELIUM_MAX_DATA_SIZE];
size_t used = root.printTo(buffer, HELIUM_MAX_DATA_SIZE);
channel_send(CHANNEL_NAME, buffer, used);
channel_counter = CHANNEL_SEND_CYCLE;
}
delay(CHANNEL_DELAY);
}
-
探頭
+關(guān)注
關(guān)注
0文章
1216瀏覽量
41637 -
Arduino
+關(guān)注
關(guān)注
188文章
6469瀏覽量
187112 -
Helium
+關(guān)注
關(guān)注
0文章
12瀏覽量
4823
發(fā)布評論請先 登錄
相關(guān)推薦
評論