Sistem Sensor Kelembaban Tanah Nirkabel dengan Helium & DFRobot – Perawatan Tanaman Real-Time
Komponen dan Perlengkapan
Helium Atom Xbee Module (1)
Helium Element Access Point (1)
DFRobot Gravity: Analog Capacitive Soil Moisture Sensor (1)
Helium Arduino/mbed Adapter (1)
Arduino UNO (1)
Aplikasi dan Layanan Online
Arduino IDE
Helium Dashboard
Tentang Proyek Ini
Berikan Suara pada Tanaman Anda dengan Sensor Kelembaban Tanah Nirkabel
Mari kita hadapi realitas. Tanaman mati terus-menerus karena kurang disirami. Anda sibuk dan pakis-pakisan itu tidak akan mengangkat tangan saat merasa kehausan. Jadi, untuk pecinta tanaman yang sedang bepergian, prototipe sonda kelembaban tanah ini adalah tiket Anda untuk pakis dan ficus yang bahagia dan sehat.
Apa yang Akan Kita Bahas
Secara menyeluruh panduan ini seharusnya memakan waktu sekitar 60 menit. Berikut adalah apa yang akan kita bahas:
Membangun sonda kelembaban tanah lengkap Anda menggunakan Sensor Kelembaban Tanah Kapasitif DF Robot Gravity, Modul Prototyping Helium Atom, Adaptor Helium Arduino, dan papan Arduino (kami memilih UNO);
Mendaftarkan Helium Element dan Modul Prototyping Helium Atom Anda di Helium Dashboard; dan membangun jaringan nirkabel luas daya rendah Anda sendiri;
Memrogram sonda kelembaban tanah Anda melalui Arduino IDE. Di tengah jalan kita juga akan menginstal pustaka Arduino Helium dan ArduinoJson;
Mengukur dan Mengirim Data Kelembaban Tanah hampir real-time dari tanaman Anda ke Helium Dashboard; dan mengalirkannya ke Helium HTTP Channel.
Baiklah. Mari kita mulai. Kami memiliki pakis yang harus selamatkan.
Membangun Sonda Kelembaban Tanah Anda
Pertama kita perlu membangun unit pengendalian. Ini cepat dan mudah. Setelah selesai, sonda lengkap Anda akan terlihat seperti ini:
Untuk membangun ini:
Pertama, colok Modul Prototyping Helium Atom Anda ke dalam Adaptor Helium Arduino lalu hubungkan unit gabungan ini ke papan Arduino yang Anda pilih. Pastikan untuk mengonfigurasi RXdan TXjumpers sesuai tergantung pada papan yang Anda gunakan. Detail lengkap tentang cara memasang semua papan ini, bersama dengan konfigurasi jumper yang benar, dapat ditemukan di sini. Lihat, selesaikan itu, dan kembali.
Selanjutnya kita perlu menghubungkan sonda kelembaban tanah sebenarnya ke Adaptor Helium Arduino menggunakan kabel jumper tiga kawat yang disediakan dengan Sonda Kelembaban Tanah DF Robot. Tiga warna kawat adalah hitam, merah, dan biru. Pada Adaptor Helium Arduino, kawat hitam terhubung ke GND; kawat merah terhubung ke 5V; dan kawat biru terhubung ke header ADO. Ada diagram hebat dari tim DFRobot tentang bagaimana koneksi ini bekerja di sini. Papan kami terlihat seperti ini ketika penyaluran dilakukan dengan benar:
Terakhir hubungkan header putih pada kabel jumper ke Sonda Kelembaban Tanah DF Robot. Meskipun ini bisa sedikit sulit, seharusnya dapat diletakkan dengan usaha minimal.
Menebarkan Helium Element Anda
Sekarang saatnya membangun Jaringan Helium Anda sendiri. Ini memakan waktu sekitar 30 detik. (Jika Anda ingin mengetahui lebih lanjut tentang bagaimana aplikasi akhir ke akhir dibangun di Helium dan bagaimana kita menangani komponen jaringan nirkabel, mulai dengan ringkasan arsitektur ini.)
Untuk melebarkan Element dan membuat cakupan jaringan untuk sensor berbasis Atom Anda, cukup colokkan ke daya dan port Ethernet langsung menggunakan kabel yang disediakan. (Catatan: Jika Anda memiliki Element backed Seluler, menggunakan konektivitas Ethernet opsional tetapi direkomendasikan sebagai cadangan.) Setelah dihubungkan, Anda akan melihat aktivitas LED. Element Anda akan terhubung ketika LED di depan berwarna hijau (menyinyalikan konektivitas Ethernet) atau teal (untuk konektivitas Seluler). Anda dapat menonton video pendek tentang Element dan cara menghubungkannya di sini.
Mendaftarkan Helium Element dan Atom di Helium Dashboard
Sekarang setelah unit pengendalian kami dibangun dan jaringan Helium Anda dibuka, saatnya untuk mendaftarkan perangkat keras Anda di Helium Dashboard. Dashboard adalah antarmuka pengguna hosted Helium untuk memantau dan mengelola penerapan perangkat keras yang terhubung. Semua perangkat keras yang dikirim Helium sudah terdaftar dalam sistem kami tetapi kita perlu mengetahui siapa yang melebarnya.
Pertama, buat akun Helium Dashboard jika Anda belum melakukannya.
Untuk mendaftarkan Atom Anda, mulai dengan memilih New Atom. Di UI, tambahkan nama (mis. Fern Saver) lalu masukkan empat digit terakhir dari MAC Address dan kode HVV Code empat digitnya. Klik Save dan selesai.
Pendaftaran Element dilakukan dengan cara yang sama. Pilih New Element, lalu berikan nama, empat digit terakhir dari MAC Address dan kode HVV Code empat digitnya. Juga pastikan untuk memasukkan lokasi untuk Element Anda sehingga Dashboard dapat menampilkannya di peta.
Anda dapat memverifikasi apakah Element Anda online dengan melihat Status & Signal di Dashboard:
Melebarkan Helium HTTP Channel
Fitur utama dari Platform Helium adalah Channels. Ini adalah konektor bawaan ke layanan web (seperti AWS IoT, Google Cloud IoT, dan Azure IoT) dan protokol (seperti MQTT dan HTTP). Dengan Channels, Helium telah melakukan semua pekerjaan berat bagi Anda ketika berkaitan dengan integrasi dengan salah satu layanan web atau protokol ini. Untuk Fern Saver, Sonda Kelembaban Tanah kita, mari kita nyalakan HTTP Channel. Ini akan memungkinkan kami mengalirkan data ke setiap layanan web yang menerima data melalui HTTP. Misalnya, Anda dapat menggunakan HTTP Channel untuk mengirim data ini ke IFTTT dan, pada gilirannya, menerima teks setiap kali Fern Saver melaporkan kelembaban di bawah tingkat tertentu.
Dalam contoh ini, kami akan menyiapkan HTTP Channel yang mengirim data ke requestb.in, layanan web yang berguna dan gratis untuk menguji layanan HTTP. Perhatikan bahwa di bawah ini, ketika kami mengunggah Sketch ke Arduino, kami akan merujuk pada nama Channel ini, HTTP, dalam kode sehingga kami tahu ke mana mengirim data.
Ini adalah seberapa cepat dan mudah untuk menyiapkan Channel ini:
Mengonfigurasi Arduino IDE Anda dan Mengunggah Sketch
Kami sekarang dapat beralih ke mengonfigurasi Arduino IDE Anda dan mengimpor pustaka yang diperlukan. Untuk memulai:
Pastikan Anda telah mengunduh Arduino IDE terbaru. Dapatkan di sini jika diperlukan.
Kemudian kita perlu menambahkan dua pustaka: Helium dan ArduinoJson. Anda dapat menambahkan pustaka dari dalam IDE dengan pergi ke Sketch -> Include Library -> Manage Libraries. Cari “helium”, pilihnya, dan klik Install. Ikuti proses instalasi yang sama untuk pustaka “ArduinoJson”. (Kami membutuhkan pustaka ini karena data kelembaban tanah yang akan kami catat diformat sebagai JSON.)
Setelah selesai, saatnya untuk melakukan pemrograman Arduino yang sebenarnya. Sumber lengkap untuk Sketch yang akan kami unggah dapat ditemukan di sini di GitHub. Berikut adalah sketsa Soil_Humidity.ino lengkap.
/* * 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 <Arduino.h> #include <ArduinoJson.h> #include <Helium.h> #include <Wire.h> // 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<JSON_OBJECT_SIZE(2) + 100> jsonBuffer; 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); }
Dengan pustaka Helium dan ArduinoJson terinstal, buat sketsa baru (File -> New dari dalam Arduino IDE), dan tempelkan kode di atas. Kemudian, dengan paket perangkat keras sonda kelembaban tanah lengkap Anda terhubung ke workstation Anda melalui kabel USB, klik tombol Upload.
LED pada Modul Prototyping Atom Anda seharusnya mulai berkedip setelah beberapa saat. Ini adalah Atom terhubung ke jaringan Helium (melalui Element yang kami lebar sebelumnya). Jika Arduino IDE tidak melempar kesalahan saat mengunggah kode, ini berhasil dan sonda kelembaban tanah kini menghasilkan pembacaan.
Catatan tentang Data Kelembaban Tanah
Seperti yang disebutkan di atas, Sketch ini akan menangkap data kelembaban tanah dan mengencode-nya sebagai JSONsebelum mengirim ke platform Helium. Menggunakan Sketch di atas, satu titik data akan terlihat seperti ini (sebagai JSON):
{ "value": 433, "percent": 55.5 }
Vale mentioning bahwa DFRobot Gravity Capacitive Soil Moisture Sensor sebenarnya menangkap pembacaan ini sebagai pembacaan analog antara pembacaan kering dan basah yang dikalibrasi. Anda dapat mendapatkan detail lengkap tentang bagaimana ini diimplementasikan dan dikalibrasi di sini. Anda mungkin ingin menyesuaikan kalibrasi sedikit.
Memverifikasi Konektivitas Sensor dan Data di Helium Dashboard
Sekarang setelah sensor Anda diterapkan, kita dapat memverifikasi bahwa itu online dan mengirim data. Di Dashboard kita dapat melakukan ini dengan beberapa cara, baik melalui tampilan Atom UI untuk sensor yang baru saja Anda terapkan.
Jika Atom Anda online, Dashboard akan menampilkan Status & Signal, beserta berbagai metadata lain tentang statusnya. Ini akan terlihat seperti ini:
Selanjutnya di dalam antarmuka Atom yang sama, kami juga menampilkan Event Log yang menunjukkan setiap titik data dari sensor dan apakah berhasil ditransmisikan ke Helium Channel atau tidak. Seperti yang kami sebutkan di atas, ini adalah konektor bawaan ke layanan web atau protokol mentah. Sebelumnya kami telah melebarkan HTTP Channel untuk organisasi Helium Anda. Dan Sketch di atas memberitahu Sonda Kelembaban Tanah untuk mengirim data ke channel ini - disebut HTTP. Dalam contoh yang digambarkan di bawah ini, kami mengirim data kami ke Helium HTTP Channel:
Kami juga menyediakan antarmuka Debug untuk setiap Atom yang akan menampilkan pembacaan Anda saat masuk (setelah Anda mengaktifkan opsi ini). Berikut adalah beberapa Data Kelembaban Tanah di Debug viewer Dashboard:
Langkah Berikutnya dan Bantuan
Selamat! Itu adalah akhir dari panduan ini. Anda kini telah melindungi pakis Anda di masa depan dengan sonda kelembaban tanah nirkabel. Ini adalah hal yang besar. Pakis Anda berterima kasih kepada Anda.
Jika Anda ingin mengetahui lebih lanjut tentang Helium dan bagaimana Anda dapat membuat prototipe sensor Anda sendiri menggunakan perangkat keras dan perangkat lunak ini, mulai di sini:
Helium Developer Documentation
Helium Developer Slack
Helium Developer Forum
Kode
Soil_Humidity.ino
Sketch Arduino lengkap untuk mulai mengirim data kelembaban tanah dari sensor Anda ke Helium Channel.
/* * 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 <Arduino.h> #include <ArduinoJson.h> #include <Helium.h> #include <Wire.h> #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<JSON_OBJECT_SIZE(2) + 100> jsonBuffer; 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); }