// Deklarasi Blynk
#define BLYNK_TEMPLATE_ID "TMPL6ct2DmUfv"
#define BLYNK_TEMPLATE_NAME "Smart trash bin for UAS"
#define BLYNK_AUTH_TOKEN "pZboC5768GHyiO4zCFGa3IF9qMLS20OQ"
#define BLYNK_PRINT Serial
// Import library
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <ESP32Servo.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
// Koneksi dengan Wokwi
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Deklarasi nomor pin untuk sensor ultrasonic
#define TRIG_PIN_JARAK 12
#define ECHO_PIN_JARAK 14
#define TRIG_PIN_KAPASITAS 33
#define ECHO_PIN_KAPASITAS 27
// Deklarasi tempat sampah
#define TRASHBIN_HEIGHT 18.5
#define CROSS_SECTION_AREA 185
#define DISTANCE_THRESHOLD 10
// Deklarasi variabel
LiquidCrystal_I2C lcd(0x27, 16,2);
BlynkTimer timer;
Servo servo;
float duration_us, distance_cm;
float dur_cap, dis_cap;
float trash_height, volume_filled, total_volume, capacity_used, capacity_remaining;
int servo_mode, manualtrashbin;
int i;
// Membaca blynk untuk mode servo
BLYNK_WRITE(V4) {
servo_mode = param.asInt();
}
// Membaca blynk untuk baca tutup manual
BLYNK_WRITE(V5) {
manualtrashbin = param.asInt();
}
// Teks Pembuka
void start() {
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Hai! Aku adalah tempat sampah pintar.");
lcd.setCursor(1,1);
lcd.print("Ayo buang sampah di sini !");
for (int i = 0; i<22; i++) {
lcd.scrollDisplayLeft();
delay(200);
}
delay(1500);
}
// Teks jika tempat sampah penuh
void full() {
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Mohon maaf,saat ini tempat sampah");
lcd.setCursor(1,1);
lcd.print("tidak bisa dipakai karena hampir penuh");
for (i = 0; i< 24; i++) {
lcd.scrollDisplayLeft();
delay(200);
}
delay(1500);
lcd.clear();
}
void setup() {
// Deklarasi pin untuk LCD
Wire.begin(32,26);
Serial.begin(9600);
// Inisiasi LCD
lcd.init();
lcd.backlight();
// Mode pin untuk sensor ultrasonic
pinMode(TRIG_PIN_JARAK, OUTPUT);
pinMode(ECHO_PIN_JARAK, INPUT);
pinMode(TRIG_PIN_KAPASITAS, OUTPUT);
pinMode(ECHO_PIN_KAPASITAS, INPUT);
// Deklarasi pin untuk servo
servo.attach(13);
// Nilai default untuk servo
servo.write(0);
// Memanggil method start()
start();
// Memulai blynk
Blynk.begin(auth, ssid, pass);
}
void loop() {
// Menjalankan blynk
Blynk.run();
timer.run();
// Menyalakan lampu LED untuk sensor ultrasonic jarak
digitalWrite(TRIG_PIN_JARAK, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN_JARAK, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN_JARAK, LOW);
// Menghitung jarak dalam cm
duration_us = pulseIn(ECHO_PIN_JARAK, HIGH);
distance_cm = 0.017 * duration_us;
delay(1000);
// Menyalakan lampu LED untuk sensor ultrasonic kapasitas
digitalWrite(TRIG_PIN_KAPASITAS, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN_KAPASITAS, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN_KAPASITAS, LOW);
// Menghitung jarak dalam cm
dur_cap = pulseIn(ECHO_PIN_KAPASITAS, HIGH);
dis_cap = 0.017 * dur_cap;
// Jika jarak kurang dari 2 cm, maka jaraknya menjadi 2 cm
if (dis_cap < 2.0) {
dis_cap = 2.0;
}
// Menghitung kapasitas yang digunakan
capacity_used = ((TRASHBIN_HEIGHT - dis_cap) / (TRASHBIN_HEIGHT - 2.0)) * 100;
// Jika kapasitas yang digunakan lebih dari 100, maka akan menggunakan 100
if (capacity_used > 100) {
capacity_used = 100;
}
// Menghitung kapasitas sisa
capacity_remaining = 100 - capacity_used;
// Pengkondisian jika servo_mode = 0 atau manual
if (servo_mode == 0) {
// Pengkondisian jika manualtrashbin = 1 atau buka
if (manualtrashbin == 1) {
// Pengkondisian jika sisa kapasitas <= 10
if (capacity_remaining <= 10.00) {
servo.write(0);
Blynk.logEvent("trashbin_warning", "Tempat sampah hampir penuh. Segera buang sampah didalamnya ! ");
full();
}
// Pengkondisian jika sisa kapasitas > 10
else {
servo.write(90);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Status: Buka");
delay(5000);
lcd.setCursor(0,0);
lcd.print("Terimakasih telah buang ");
lcd.setCursor(0,1);
lcd.print(" sampah ditempatnya :D");
for (int i = 0; i< 23; i++) {
lcd.scrollDisplayLeft();
delay(250);
}
delay(1600);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Kapasitas sisa: ");
lcd.setCursor(0,1);
lcd.print(capacity_remaining);
lcd.setCursor(5,1);
lcd.print(" %");
delay(1000);
lcd.clear();
}
}
// Pengkondisian jika manualtrashbin = 0 atau tutup
else {
servo.write(0);
lcd.setCursor(0,0);
lcd.print("Status: Tutup");
delay(5000);
lcd.clear();
start();
}
}
// Pengkondisian jika servo_mode = 1 atau auto
else {
// Pengkondisian jika jarak > 10
if (distance_cm > DISTANCE_THRESHOLD) {
// Pengkondisian jika sisa kapasitas <= 10
if (capacity_remaining <= 10.00) {
full();
servo.write(0);
Blynk.logEvent("trashbin_warning", "Tempat sampah hampir penuh. Segera buang sampah didalamnya ! ");
}
// Pengkondisian jika jarak > 10
else {
servo.write(90);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Status: Buka");
delay(3000);
lcd.clear();
servo.write(0);
lcd.setCursor(0,0);
lcd.print("Terimakasih telah buang ");
lcd.setCursor(0,1);
lcd.print(" sampah ditempatnya :D");
for (int i = 0; i< 23; i++) {
lcd.scrollDisplayLeft();
delay(250);
}
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Kapasitas sisa: ");
lcd.setCursor(0,1);
lcd.print(capacity_remaining);
lcd.setCursor(5,1);
lcd.print(" %");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Status: Tutup");
delay(1000);
lcd.clear();
start();
}
}
// Pengkondisian jika jarak < 10
else {
servo.write(0);
}
}
// Memasukkan nilai ke Blynk
Blynk.virtualWrite(V3, capacity_remaining);
Blynk.virtualWrite(V2, distance_cm);
delay(1000);
}