Pemantau Kesehatan Sungai: Sistem Kualitas Air Berbasis Arduino
Komponen dan Perlengkapan
Arduino MKR1000
×
1
Sensor Tinggi Air
×
1
Sensor pH
×
1
LED (generik)
Putih jika Mungkin
×
1
Resistor 221 ohm
×
2
Fotoresistansi
×
1
Kawat Jumper (generik)
×
1
Alat dan Mesin yang Diperlukan
Pematik Solder (generik)
Besi Korek Api
Aplikasi dan Layanan Online
Arduino Web Editor
Sigfox
Wia
Tentang Proyek Ini
Ringkasan
Sungai atau danau dapat menjadi sumber kesenangan dan relaksasi yang luar biasa. Namun jika sungai menjadi kotor dan tercemar, semua kesenangan hilang. Banyak orang tergantung pada air sungai untuk memberi makan ternak mereka dan tidak mampu memberi air kotor pada hewan mereka.
Bayangkan tinggal tepat di samping sungai (jika Anda tidak), Anda tidak akan ingin terbangun di tengah malam karena rumah Anda terbanjir karena sungai. Atau bagaimana jika tetangga Anda memutuskan untuk membuang beberapa petrol ke sungai, Anda tidak akan ingin hewan Anda sakit.
MyRiver menyelesaikan semua masalah tersebut, dapat bekerja di daerah terpisolat berkat Sigfox sehingga semua orang memiliki akses ke perangkat. Perangkat akan membaca pH air, tingkat polusinya menggunakan metode inovatif, dan ketinggian air. Anda akan dapat memantau sungai secara langsung di ponsel atau komputer Anda di mana saja berkat Wia. Dengan cara ini Anda dapat mengetahui apakah ada masalah dengan aliran dan memungkinkan Anda bertindak sebelum terlambat. Akan memberitahu Anda segera jika ada masalah dengan sungai.
Video
Gambar
Fungsi
Perangkat ini didasarkan pada Arduino MKR FOX, dirancang untuk penggunaan jarak jauh, pengguna dapat menempatkan perangkat di sungai atau danau dan memantau dari mana saja. Berkat mode hemat daya SAM D, perangkat dapat bekerja untuk waktu yang lama pada 2 baterai AA.
Perangkat melakukan pembacaan setiap 30 menit, lalu tidur, periode tidur dapat diatur ulang, meskipun waktu tidur minimum harus 20 menit.
MKR FOX membaca pH sungai menggunakan sensor pH, juga mendapatkan ketinggian air menggunakan sensor ketinggian air, dan mendeteksi apakah tercemar oleh zat yang tidak larut dengan memancarkan cahaya LED ke fotoresistansi, jika pembacaan fotoresistansi rendah, berarti zat padat (minyak, petrol, merkuri, dll.) ada di sungai. Perangkat kemudian mengirim semua data ke Sigfox, di mana data diinjak ke Wia, diproses dan divisualisasikan. Pengguna diberitahu tentang kondisi sungai. Di bawah ini adalah gambar ringkasan fungsi.
Buffer akan dikirim ke Sigfox dienkode sebagai HEX, Sigfox akan mentransfer data ke Wia, data akan melewati alur, data akan dikonversi kembali ke string dan kemudian ke nilai sensor. Kemudian akan diproses dan pengguna akan diberitahu jika nilai di luar batas.
Di bawah ini adalah gambar lain yang menggambarkan ringkasan kode proyek, dijelaskan di bawah.
Read Sensors akan membaca nilai sensor pH, ketinggian air dan fotoresistansi dan menyimpannya dalam variabel.
Format Buffer akan menggabungkan semua nilai ke dalam buffer 12 Byte yang dapat dikirim ke Sigfox.
Parse Data akan memparsing buffer ke Sigfox.
MKR FOX hanya dapat mengirim 12 byte melalui Sigfox, ini berarti semua nilai sensor harus digabungkan ke dalam 12 byte, nilai mentah maksimum setiap sensor adalah 1024 (karena semuanya analog), jadi setiap sensor mewakili satu bagian dari buffer (4 byte). Arduino harus menggabungkan nilai dan menambahkan nol di awal setiap nilai sampai nilai memiliki 4 byte. Gambar di bawah ini menggambarkan proses ini.
Arduino menerima nilai sensor sebagai bilangan bulat, kemudian mengonversi bilangan bulat menjadi string dan menambahkan nol di awal setiap nilai sampai memiliki 4 byte, misalnya, jika nilai fotoresistansi adalah 620, satu nol akan ditambahkan, 0620. Tapi jika sensor ketinggian air sama dengan 24, dua nol ditambahkan, 0024. Perangkat kemudian menggabungkan nilai-nilai ke dalam buffer 12 byte dan mengirim data ke SigFox.
Perangkat dalam Aksi
Di bawah ini sejumlah foto yang menampilkan fungsionalitas proyek, untuk tampilan yang lebih baik, lihat video di atas.
Manfaat
Pengguna yang mengoperasikan proyek ini akan mendapatkan manfaat dalam:
Memantau dengan mudah ketinggian air, pH dan tingkat polusi sungai dari mana saja kapan saja
Menerima notifikasi jika sungai tercemar oleh zat larut atau tidak larut atau sedang banjir
Kemudahan penggunaan dan pemasangan
Bekerja di semua negara yang cakupan Sigfox
Membangun Proyek
Langkah 1: Alat yang Diperlukan
Proyek ini memerlukan semua komponen disolder bersama, tidak terlalu banyak hal selain sensor. Daftar bahan tertera di bawah ini.
1, Arduino MKR FOX 1200
1, Sensor pH
1, Sensor Ketinggian Air
1, Fotoresistansi
1, LED Putih
2, Resistor (220Ω)
Kawat Jumper
Langkah 2: Menghubungkan Rangkaian
Diagram rangkaian proyek ini sedikit membingungkan karena komponen tidak ditempatkan pada breadboard, jika Anda mengalami kesulitan, coba unduh file Fritzing di bawah ini dan pindahkan kawat di komputer Anda.
Ringkasan Rangkaian
Gambar di bawah ini akan menggambarkan bagaimana rangkaian seharusnya terlihat ketika selesai.
Mempersiapkan MKR FOX
Gambar di bawah ini akan memandu Anda melalui menghubungkan kotak baterai dan antena ke MKR FOX, Perhatikan bahwa kotak baterai harus dihubungkan setelah sensor dihubungkan. Pemasangan kabel dan pengaturan lainnya ditemukan di bawah membangun proyek / Akhir.
Langkah 3: Memahami Kode
Ada 3 bagian utama dalam kode:
Read Sensors
Format Buffer
Parse Data
Bagian-bagian ini dijelaskan di bawah ini.
Read Sensors
struct GetValue // created Structures to ease out loops { int riverLevel() // get level of the river { const int val = analogRead(A2); if(proDebug) { Serial.print(" River Level "); Serial.println(val); } return val; } int riverPh() // get ph of the river { const int val = (analogRead(A1) / 5 * 3.3); if(proDebug) { Serial.print(" River Ph "); Serial.println(val); } return val; } int riverPol() // get pollution level of the river { const int val = analogRead(A3); if(proDebug) { Serial.print(" River Pollution "); Serial.println(val); } return val; } };
Struktur di atas berisi loop yang membaca setiap nilai sensor, ada loop terpisah untuk setiap nilai.
Format Buffer
String data(int level, int ph, int pol) // merge sensor values into buffer { int values[3] = {level, ph, pol}; String newValues; for(int i = 0; i < 3; i++) // will run through all values, adding 0s to the start { if(values[i] < 10) { newValues += "000"; Serial.println("Option 1"); } else if(values[i] < 100) { newValues += "00"; Serial.println("Option 2"); } else if(values[i] < 1000) { newValues += "0"; Serial.println("Option 3"); } else {}; newValues += values[i]; Serial.print(" Run "); Serial.print(i); Serial.print("/3 "); Serial.println(newValues); } return newValues; }
Loop di atas mengambil 3 nilai sensor lalu menempatkannya ke dalam array. Kemudian melalui setiap nilai, menambahkan nol di awal setiap nilai sampai nilai berukuran 4 byte, kemudian menambahkan setiap nilai ke string yang dikembalikan.
Parse Data
void parseData(String data) // send buffer to SigFox { SigFox.beginPacket(); SigFox.print(data); int ret = SigFox.endPacket(); }
Bagian ini mengambil string untuk diuraikan lalu mengirim nilai ke Sigfox.
Langkah 4: Pengaturan Integrasi Wia Sigfox
Langkah ini akan menggambarkan cara mengatur Wia untuk menerima pesan dari Sigfox, Wia adalah platform IoT profesional yang memungkinkan pengguna untuk mensosialisasikan data menggunakan widget di web atau aplikasi seluler, juga memungkinkan pengguna untuk membuat blok kode yang disebut alur, yang memungkinkan pengguna untuk memproses data. Data direpresentasikan oleh peristiwa.
Untuk memulai, pastikan Anda memiliki akun Sigfox dan akun Wia. Unduh aplikasi Wia di iOS atau Android untuk memungkinkan Anda menerima notifikasi. Gambar di bawah ini akan menggambarkan koneksi Sigfox dan Wia.
Set Type ke Data Uplink
Set Channel ke URL
Tidak perlu mengisi Custom Payload Configuration
Set pola URL ke "https://api.wia.io/v1/events"
Set HTTPMethod ke POST
Buat header bernama Authorisation dengan nilai Bearer (nilai ini akan diedit nanti)
Set ContentType ke application/json
Salin kode dari tautan ini ke tubuh webhook.
Terakhir, klik OK dan Anda selesai.
Langkah 5: Pengaturan Alur Wia
Bagian ini akan memerlukan waktu lebih lama untuk diselesaikan, alur akan mengonversi data yang diterima dari HEX ke String, kemudian akan memparsing string menjadi 3 nilai sensor dan mengonversinya menjadi bilangan bulat, kemudian akan mengonversi nilai polusi sungai dan ketinggian air ke deskriptor High atau Ok dan nilai pH mentah ke nilai pH aktual, kemudian akan memberitahu pengguna jika nilai di luar batas.
Panduan di bawah ini akan menggambarkan proses ini langkah demi langkah. Anda akan diminta untuk memasukkan potongan kode tertentu ke dalam Fungsi Wia, potongan kode ini dimasukkan di bawah, cukup salin dan tempelkan kode ke dalam fungsi. Data yang akan disertakan dalam email juga dimasukkan di bawah, kerjakan seperti dengan fungsi.
Fungsi Wia
processPayload
if(input.body) { output.body.name = "value"; output.body.data = toByteArrayStr(input.body.data.sigfoxData); } function toByteArrayStr(sigfoxData) { let result = Buffer(sigfoxData, 'hex'); return result.toString('utf8'); }
let minVal = 200; let maxVal = 0; if(input.body.data.sigfoxData) { let data = input.body.data.sigfoxData; let processedData = toByteArrayStr(data); let newData = cutString(processedData); output.body.name = "waterPollution"; output.body.data = processData(newData); } function toByteArrayStr(sigfoxData) { let result = Buffer(sigfoxData, 'hex'); return result.toString('utf8'); } function cutString(data) { let newVal = data[8]; newVal += data[9]; newVal += data[10]; newVal += data[11]; let finalVal = parseInt(newVal); return finalVal; } function processData(data) { if(data < minVal) { return "POLLUTED"; } else { return "OK"; } }
riverPh
let minVal = 300; let maxVal = 600; if(input.body.data.sigfoxData) { let data = input.body.data.sigfoxData; let processedData = toByteArrayStr(data); let newData = cutString(processedData); let finalVal = (newData / 73.1428571); let valueToSend = finalVal.toFixed(2); output.body.name = "waterPh"; output.body.data = valueToSend; } function toByteArrayStr(sigfoxData) { let result = Buffer(sigfoxData, 'hex'); return result.toString('utf8'); } function cutString(data) { let newVal = data[4]; newVal += data[5]; newVal += data[6]; newVal += data[7]; let finalVal = parseInt(newVal); return newVal; }
riverLevel
let minVal = 0; let maxVal = 200; if(input.body.data.sigfoxData) { let data = input.body.data.sigfoxData; let processedData = toByteArrayStr(data); let newData = cutString(processedData); output.body.name = "waterLevel"; output.body.data = processData(newData); } function cutString(data) { let newVal = data[0]; newVal += data[1]; newVal += data[2]; newVal += data[3]; let finalVal = parseInt(newVal); return finalVal; } function toByteArrayStr(sigfoxData) { let result = Buffer(sigfoxData, 'hex'); return result.toString('utf8'); } function processData(data) { if(data > maxVal) { return "HIGH"; } else { return "OK"; } }
Email Wia
riverPollutionEmail
Automatic Messaging System Data Warning - myWater device ${trigger.source.device.id} detected a problem in the stream. Warning - Water Is Polluted by Insoluble Substances. Information Device ${trigger.source.device.id} Raw Data ${input.body.data}
riverPhEmail
Automatic Messaging System Data Warning - myWater device ${trigger.source.device.id} detected a problem in the stream. Warning - Water Ph is not Appropriate. Water is Contaminated. Information Device ${trigger.source.device.id} Raw Data ${input.body.data}
riverLevelEmail
Automatic Messaging System Data Warning - myWater device ${trigger.source.device.id} detected a problem in the stream. Warning - Water Level is too High, River may be flooding. Information Device ${trigger.source.device.id} Raw Data ${input.body.data}
Pengaturan Variabel
Ketika data diterima oleh Wia, data harus diproses, jika data berada di antara nilai minimum dan maksimum, nilai aman, batas sensor pH dan ketinggian air telah diatur, tetapi pengguna harus secara manual mengatur batas fotoresistansi, uji harus dilakukan untuk menentukan nilai ini, langkah di bawah ini akan memandu Anda bagaimana melakukannya.
Ada variabel lain yang harus diatur oleh pengguna, proDebug, jika diaktifkan, Arduino memerlukan koneksi melalui USB ke komputer dan Serial Monitor harus terbuka, Arduino mencetak ke Serial Monitor dalam mode ini, ideal untuk pemecahan masalah. proDebug default ke false untuk operasi di lapangan.
Pustaka
Sigfox - copyright (c) 2016 Arduino LLC GNU Lesser General Public Licence pustaka ini di domain publik
ArduinoLowPower (c) 2016 Arduino LLC GNU Lesser General Public Licence pustaka ini di domain publik
Akhir
Langkah terakhir adalah menghubungkan Arduino Anda ke PC/Mac dan mengunggah sketsa, pastikan kotak baterai terhubung ke Arduino dan rangkaian baik. Langkah berikutnya akan memandu Anda dalam membuat penutup untuk proyek ini.
Saya memutuskan untuk membuat penutup saya dari botol air, saya pikir itu cara yang hebat dan ekologis untuk menjangkau proyek ini. Perangkat terlihat seperti gambar di bawah ini.
Jika Anda menyukai ide penutup, Anda dapat menggulir gambar di bawah ini, yang menggambarkan bagaimana penutup dibuat, silakan buat sendiri.
Hal terakhir yang harus dilakukan adalah menempatkan perangkat di sungai. Untuk melakukan ini, pergi ke sungai yang ingin Anda terapkan MyRiver selama Tinggi Air, ini penting untuk memastikan perangkat tidak memperingatkan bahwa sungai banjir ketika sebenarnya hanya air pasang.
Tempelkan beberapa pita di atas botol air untuk mencegah air meresap ke dalam botol dan merusak semuanya.
Kami pergi ke sungai lokal yang kotor untuk menguji proyek ini, semua alarm berfungsi dengan benar.
Saat menempatkan probe di air, pastikan air berada di bawah sensor ketinggian air tetapi menutupi fotoresistansi sepenuhnya. Amankan proyek ke tepi dengan pita atau palu dan baut, dan seharusnya terlihat seperti ini (atau lebih baik).
Latar Belakang
Bersenang-senang di rumah Anda, melihat keluar jendela ke sungai yang indah dan menyenangkan yang mengalir di depan Anda. Namun alih-alih sungai segar yang indah, Anda melihat yang hijau lengket, Anda mungkin ingin pindah rumah dalam hal itu.
Dan jika sungai memutuskan untuk meluap ke rumah Anda di tengah malam saat Anda tidur, Anda tentu akan memutuskan untuk pindah.
Saya memikirkan masalah ini dan bagaimana menyelesaikannya semua dalam satu perangkat, dan saya datang dengan MyRiver.
Jika Anda di kota dan tinggal di samping sungai, akan memperingatkan Anda tepat waktu jika sungai memutuskan untuk merusak hari Anda dengan cara apa pun atau jika tetangga Anda membuang minyak ke sungai. Atau jika Anda di pertanian, MyRiver akan memperingatkan Anda bahwa sungai kotor sebelum Anda memberi air pada hewan Anda, dan akan memberi Anda waktu untuk membawa hewan ke dalam sebelum sungai banjir.
Tapi hanya membaca pH sungai tidak cukup, karena zat yang tidak larut seperti merkuri atau logam lain tidak memengaruhi pH air. Jadi kami datang dengan metode baru untuk mendeteksi zat tersebut, unik untuk proyek ini, fotoresistansi membaca jumlah cahaya dari LED yang menembus air. Dengan cara ini setiap kotoran air dapat terdeteksi.