Sistem Pengelolaan Sampah Berbasis IoT
Pendahuluan
Kali ini kita akan membuat Minimum Viable Product (MVP) untuk sistem pengelolaan sampah berbasis IoT. Prototype ini sebelumnya merupakan calon produk pada Startup yang saya kembangkan dengan nama Resikin, namun saat ini sedang tidak berjalan karena banyak faktor.
Pada artikel ini kita akan mengupas proses pembuatannya sehingga diharapkan kepada pembaca yang tertarik untuk mengembangkan secara mandiri atau menambah fitur menarik lainnya, yang mungkin dapat bermanfaat di kemudian hari. Tutorial ini cukup intensif karena di dalamnya membahas tiga topik yang berbeda namun berhubungan satu sama lain sehingga dapat menjadi MVP, yaitu pengembangan hardware, web apps dan mobile apps (android).
Preview sistem pengelolaan sampah berbasis IoT pada tutorial kali ini dapat anda lihat pada link youtube di bawah ini:
Jika anda tertarik dengan gambaran umum mengenai project ini seperti yang tergambarkan pada video di atas, maka anda dapat melanjutkan tutorial ini. Oleh karena itu, tanpa panjang lebar, mari kita memulai tutorial ini dengan seksama.
Skema sederhana untuk system yang akan kita kembangkan dapat di lihat seperti pada gambar di bawah ini.
NodeMCU sebagai microcontroller menerima data pengukuran tingkat kepenuhan tempat sampah dengan menggunakan sensor ultrasonic, lalu untuk mengetahui kondisi lingkungan, kita akan memakai DHT11 untuk mengukur temperature dan kelembaban.
Dengan konektifitas Wifi ke internet, data di kirim menuju Firebase Realtime database yang selanjutnya data ditampilkan melalui halaman aplikasi web (membutuhkan aktifasi Google Map Javascript API) dan aplikasi Android (membutuhkan aktifasi Google Map Android API).
Pre-requisite
Sebelum memulai tutorial sistem pengelolaan sampah berbasis IoT ini, pastikan Anda terlebih dahulu untuk setup Firebase dan Google Cloud Platform Map API. Namun, jika anda belum familiar melakukan setup keduanya, anda dapat mengikuti tutorial video Firebase pada link ini dan untuk GCP Maps API pada link ini.
Artikel tutorial ini di bagi menjadi tiga bagian utama, yaitu: pembuatan hardware, webapps (static) dan android Apps.
Setup Hardware
Hal pertama yang kita lakukan adalah pemilihan hardware dan merangkainya menjadi sistem yang kita butuhkan untuk membuat Sistem Pengelolaan Sampah Berbasis IoT.
Skema rangkaian
Langkah awal adalah dengan membuat sketsa rangkaian yang akan digunakan dengan menggunakan Fritzing. Selanjutnya adalah menyediakan komponen - komponen yang dibutuhkan pada project ini, yaitu:
- NodeMCU
- Sensor temperature DHT11
- Ultrasonic Sensor SR04
- Voltage regulator LM7805
- 2x Lithium battery 18650
- Battery holder
- Cable jumper secukupnya
- On-off switch
- Casing (dapat menggunakan 3D printer) tokopedia (affiliate link)
Selanjutnya adalah mencetak PCB sederhana untuk mempermudah pemasangan di dalam casing. Untuk mendesain PCB, saya tidak menggunakan Fritzing, melainkan EasyEDA, yaitu online platform salah satu perusahaan pencetak PCB terbesar dari China. Pada platform ini anda dapat langsung melihat perkiraan biaya yang dibutuhkan untuk mencetak PCB tersebut.
Namun, pada project sistem pengelolaan sampah berbasis IoT ini saya tidak menggunakan service EasyEDA, karena hanya membuat 5pcs PCB. Yang saya butuhkan adalah Gerber file dan pdf, lalu di kirim kepada percetakan PCB lokal. Selain itu desain PCB yang kita buat pun tidak terlalu kompleks.
Mohon diperhatikan bahwa pada desain PCB yang telah saya cetak, berbeda dengan desain yang telah saya buat menggunakan Fritzing. Hal ini disebabkan karena saya memutuskan untuk menambah pengukuran temperature dan kelembaban ketika PCB sudah terlanjur di cetak.
Sehingga, trik yang saya lakukan adalah dengan menambahkan kabel jumper dan dikoneksikan secara langsung kepada pin nodemcu seperti pada gambar di bawah ini.
Setelah memastikan semuanya terkoneksi dengan baik, maka selanjutnya adalah dengan upload Arduino sketch pada NodeMCU yang akan digunakan.
Arduino Sketch
// auftechnique.com //#include <Firebase.h>#include <FirebaseArduino.h>#include <FirebaseCloudMessaging.h>#include <FirebaseError.h>#include <FirebaseHttpClient.h>#include <FirebaseObject.h>#include "DHT.h"#include <Ultrasonic.h>#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <time.h>#define FIREBASE_HOST "alamatFirebaseAnda.firebaseio.com" //Firebase Project URL goes here without "http:" , "\" and "/"#define FIREBASE_AUTH "kodeRahasiaFirebaseAnda" //Firebase Database Secret// Pin#define DHTPIN 14// Use DHT11 sensor#define DHTTYPE DHT11 // Initialize DHT sensorDHT dht(DHTPIN, DHTTYPE); // defines pins numbers ultrasonicUltrasonic ultrasonic(5, 4); //(trigger, echo) D1, D2// defines variablesint distance;int distance_percent;float hum = 100;float temp = 0;int trashbin_size = 73; // in cm, harus di ukur, tiap tempat sampah akan berbeda ukuranint trashbinSize;int timezone = 7;int dst = 0;//Lokasi pemasangan sensorfloat latitude = -6.208446;float longitude = 106.821161;String ClientName = "Testing";int h = 6; // urutan folder di firebase (untuk menandakan ID tempat sampah)String SN = "Sensor001";String Addr = "MRT Setiabudi";//Wifi setting!!!!!!!!!!!!!!!!!!!!! ini harus di ubah berdasarkan lokasi tempat sampahconst char* ssid = "namaSSIDAnda"; const char* password = "passwordRouterAnda"; void setup(){ Serial.begin(115200); delay(1000); // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED){ delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); // Print the IP address Serial.println("IP address: "); Serial.println(WiFi.localIP()); //Setup timestamp configTime(timezone * 3600, dst * 0, "pool.ntp.org", "time.nist.gov"); Serial.println("\nWaiting for time"); while (!time(nullptr)) { Serial.print("."); delay(500); } Serial.println(""); //Connect to firebase Firebase.begin(FIREBASE_HOST,FIREBASE_AUTH); // Inisialisasi variable pada Firebase databse. // Harus di ubah tiap device akan beda Firebase.setString("locations/"+ String(h) + "/SerialNumber",SN); Firebase.setString("locations/"+ String(h) + "/ClientName",ClientName); Firebase.setString("locations/"+ String(h) + "/Address",Addr); Firebase.setFloat("locations/"+ String(h) + "/Latitude",latitude); Firebase.setFloat("locations/"+ String(h) + "/Longitude", longitude); Firebase.setInt("locations/"+ String(h) + "/TrashbinSize", trashbin_size); Firebase.setFloat("locations/"+ String(h) + "/Temperature", temp); Firebase.setFloat("locations/"+ String(h) + "/Humidity", hum); }void firebasereconnect(){ Serial.println("Trying to reconnect"); Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);}void loop(){ //time setup time_t now = time(nullptr); Serial.println(ctime(&now)); delay(100); //firebase setup if (Firebase.failed()){ Serial.print("setting number failed:"); Serial.println(Firebase.error()); firebasereconnect(); return; } //read measurement distance = ultrasonic.read(); delay(1000); // Calculating the distance percentage trashbin_size = Firebase.getInt("locations/"+ String(h) + "/TrashbinSize"); distance_percent = 100 - distance*100/trashbin_size; Serial.print("Distance: "); Serial.print(distance); Serial.println("cm"); Serial.print("Fill level: "); Serial.print(distance_percent); Serial.println("%"); // Reading temperature and humidity hum = dht.readHumidity(); // Read temperature as Celsius temp = dht.readTemperature(); delay(1000); // Display data Serial.print("Temperature :"); Serial.print(temp); Serial.println("C"); Serial.print("Humidity :"); Serial.print(hum); Serial.println("%"); delay(10); // Repeat every 1 seconds delay(1000); Firebase.setString("locations/"+ String(h) + "/Time",ctime(&now)); //Konversi file menjadi bentuk JSON (struktur firebase database) StaticJsonBuffer<200> jsonBuffer; JsonObject& root = jsonBuffer.createObject(); root["Fill Level Raw"] = distance_percent; root["Distance Raw"] = distance; root["Temperature"] = temp; root["Humidity"] = hum; root["Time"] = ctime(&now); Firebase.push("locations/" + String(h),root); Firebase.setFloat("locations/"+ String(h) + "/Temperature",temp); Firebase.setFloat("locations/"+ String(h) + "/Humidity",hum); // Push data to serial and Firebase if (distance >= 0 && distance <= 100){ Firebase.setInt("locations/"+ String(h) + "/FillLevel",distance_percent); } if (distance_percent >= 0 && distance_percent <= 100){ Firebase.setInt("locations/"+ String(h) + "/TrashDistance",distance); } delay(5000);}
Struktur Database
Data yang di terima oleh Firebase dari NodeMCU akan memiliki struktur seperti pada gambar dibawah ini.
Perlu diperhatikan bahwa pada Arduino sketch bagian akhir ada 2 tipe metode data yang di kirim kepada Firebase yaitu "set" dan "push". Pada metode "set", database yang ada pada firebase akan berubah menjadi data terbaru. Sedangkan pada metode "push", data akan bertambah pada database, ditunjukan dengan random code yang tergenerasi secara otomatis oleh firebase sebagai parent folder nya.
Sebetulnya struktur database yang saya buat tidak effisient, karena ada duplikasi data yang di kirim. Alasan saya membuat seperti itu adalah ketika kita melakukan query untuk android apps dan webapps menjadi lebih mudah. Namun, jika Anda memiliki metode yang lebih efisien, itu akan lebih baik.
Web apps
Aplikasi web sistem pengelolaan sampah berbasis IoT sangat di perlukan untuk melihat secara visual data yang di ukur oleh sensor dan penempatan, terutama oleh petugas yang memonitor dari kantor.
Pada bagian ini kita tidak akan membahas detail code pembuatan web static, karena cukup panjang dan Anda dapat kloning github repository project ini pada bagian akhir. Namun, kita akan membahas struktur dari masing-masing script yang penting, beserta fungsinya. Selain itu, akan ditunjukkan line yang harus di ubah untuk project ini (private API key).
Yang pertama adalah mengubah key berdasarkan Maps JavaScript API key Anda dari google cloud platform console pada file index.html.
Script utama untuk web static ini ada 4, seperti pada gambar di bawah ini:
mapFunction.js untuk menampilkan peta pada webapps dan marker. retriveFirebaseData.js adalah script untuk quering data dari Firebase. tableFunction.js untuk menampilkan list table pada tampilan web. Yang perlu anda perhatikan adalah firebaseInit.js, karena di dalam file ini Anda perlu memasukkan secret key dan database url berdasarkan akun Firebase anda sperti pada script di bawah ini:
// auftechnique.com //// Inisialisasi Firebasevar config = { apiKey: "APIKeyFirebaseAndaUntukProjectIni", authDomain: "nama-project-anda.firebaseio.com", databaseURL: "https://nama-project-anda.firebaseio.com/", projectId: "nama-project-anda", storageBucket: "", messagingSenderId: "senderIDAnda"};firebase.initializeApp(config);
Jika semuanya berjalan tanpa masalah, Anda dapat membuka index.html pada folder tersebut, sehingga akan muncul tampilan seperti pada gambar di bawah ini.
Karena yang kita kembangkan adalah web static, maka anda harus me-refresh (F5) pada web browser jika ada data baru yang masuk ke database dan Anda ingin melihatnya pada web view.
Mungkin untuk pengembangan lanjutan, Anda dapat menggunakan local server NodeJS, sehingga data yang masuk bisa terupdate secara dinamik.
Android Apps
Mobile apps tidak dapat dipisahkan dari kebanyakan orang pada jaman sekarang, sehingga aplikasi mobile termasuk hal yang krusial untuk sistem pengelolaan sampah berbasis IoT. Terutama untuk petugas pengambil sampah yang dapat melihat lokasi dan kondisi tingkat kepenuhan sampah sebelum di angkut agar pengangkutan menjadi lebih efisien.
Pembuatan mobile apps ini menggunakan Android studio, dan cukup kompleks dan sangat panjang penjelasannya. Namun, jika Anda meminta untuk dijabarkan satu per satu, saya dapat pertimbangkan untuk membuatnya melalui artikel terpisah atau bila perlu bersamaan dengan video tutorial. Anda dapat meninggalkan komentar untuk permintaan tersebut pada artikel ini jika di rasa perlu.
Jika anda ingin mencoba apps yang sudah jadi, Anda dapat men-downloadnya melalui Google Playstore. Perlu di perhatikan bahwa versi yang ada di playstore berbeda dengan yang ada pada source code (bagian akhir) karena saya menambahkan beberapa fitur dan belum di update pada Playstore. Namun, secara umum flow user journey menggunakan apps tersebut adalah sama.
Oleh karena itu, sama seperti pada pembuatan webapps. Kita akan spot script yang penting (berhubungan dengan API Key).
Navigasikan kepada file google_amps_api.xml pada parent folder "values". Setelah itu masukkan API Key Anda pada bagian yang dilingkari warna merah.
Jika semuanya berjalan tanpa masalah, maka tampilan utama mobile apps ini akan terlihat seperti pada gambar di bawah. Marker pada peta berbeda warna, menunjukkan tingkat kepenuhan sampah secara visual. Jika merah berarti penuh, orange hampir penuh, kuning medium, hijau masih longgar.
Source code
Source code untuk project dapat Anda download pada link di bawah:
Link source code IoT waste management
Kesimpulan
Untuk membuat MVP Sistem Pengelolaan Sampah Berbasis IoT sangatlah kompleks, terlebih jika dikerjakan secara sendirian mulai dari mengembangkan hardware, webapps dan android apps. Jika Anda ingin membuat produk yang benar-benar siap untuk launching ke pasar, sebaiknya bangun team yang memiliki keahlian yang berbeda-beda, sehingga pengerjaannya menjadi lebih cepat dan mungkin banyak fitur-fitur menarik lainnya.
Semoga tutorial ini membawa manfaat untuk Anda dan dapat mentrigger ide-ide briliant lainnya yang dapat Anda kembangkan.
Terima Kasih
Wassalamu alaikum wr.wb
AliExpress.com Product - Elecrow Automatic Smart Plant Watering Kit for Arduino Garden DIY Program Plant Watering Device Capacitive Soil Moisture Sensor
Comments
Post a Comment