Sistem Pengelolaan Sampah Berbasis IoT

95 / 100

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:

Preview sistem pengelolaan sampah berbasis IoT

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.

[sistem pengelolaan sampah] Arsitektur sistem secara sederhana

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:

  1. NodeMCU
  2. Sensor temperature DHT11
  3. Ultrasonic Sensor SR04
  4. Voltage regulator LM7805
  5. 2x Lithium battery 18650
  6. Battery holder
  7. Cable jumper secukupnya
  8. On-off switch
  9. Casing (dapat menggunakan 3D printer) tokopedia (affiliate link)
[sistem pengelolaan sampah] Skema rangkaian

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.

[sistem pengelolaan sampah] Blueprint PCB

Sehingga, trik yang saya lakukan adalah dengan menambahkan kabel jumper dan dikoneksikan secara langsung kepada pin nodemcu seperti pada gambar di bawah ini.

sistem pengelolaan sampah berbasis IoT MVP
[sistem pengelolaan sampah] Hardware di dalam casing.

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 sensor
DHT dht(DHTPIN, DHTTYPE); 

// defines pins numbers ultrasonic
Ultrasonic ultrasonic(5, 4);   //(trigger, echo) D1, D2

// defines variables
int distance;
int distance_percent;
float hum = 100;
float temp = 0;

int trashbin_size = 73; // in cm, harus di ukur, tiap tempat sampah akan berbeda ukuran
int trashbinSize;
int timezone = 7;
int dst = 0;
//Lokasi pemasangan sensor
float 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 sampah
const 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.

[sistem pengelolaan sampah] Struktur database

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).

[sistem pengelolaan sampah] File index.html

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:

[sistem pengelolaan sampah] Struktur file

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 Firebase
var 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.

[sistem pengelolaan sampah] Snapshot webapps static

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.

[sistem pengelolaan sampah] Google Android maps API

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.

[sistem pengelolaan sampah] Android apps snapshot

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

Muhammad Zacky Asy'ari
Saya seorang Engineer dan Tech Entrepreneur. Memiliki ketertarikan dalam bidang Internet of Things, data acquisition, data analytics dan visualization, machine learning, software testing, serta web design dan development.
Silahkan telusuri blog ini dengan senang hati :).

Terbaru

Copyright since @ 2020
linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram