#define BLYNK_TEMPLATE_ID "TMPL6Tly_Z8sj"
#define BLYNK_TEMPLATE_NAME "Smart Trash"
#define BLYNK_AUTH_TOKEN "KLbrLfd_vcMeUanZXGrg8I7rngSpquoH"
#include <ESP32Servo.h>
#include <DHT.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
// Pin Blynk
#define BLYNK_VPIN_JARAK V0 // Virtual Pin untuk Jarak
#define BLYNK_VPIN_KELEMBAPAN V1 // Virtual Pin untuk Kelembapan
#define BLYNK_VPIN_NOTIF V2 // Virtual Pin untuk Notifikasi
#define BLYNK_VPIN_LED V3 // Virtual Pin untuk LED indikator
// Pin untuk Sensor dan Servo
#define TRIG_PIN 13
#define ECHO_PIN 12
#define DHT_PIN 15
#define SERVO_PIN 2
#define DHTTYPE DHT22 // Tipe sensor DHT
#define THRESHOLD_DISTANCE 10 // Ambang batas jarak untuk mendeteksi sampah penuh
// Koneksi WiFi dan Blynk
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST"; // Menggunakan WiFi Wokwi-GUEST
char pass[] = ""; // Wokwi-GUEST tidak menggunakan password
Servo servo;
DHT dht(DHT_PIN, DHTTYPE);
BlynkTimer timer;
void setup() {
Serial.begin(9600);
// Inisialisasi Blynk
Blynk.begin(auth, ssid, pass);
Serial.println("Terhubung ke Blynk!");
// Setup pin
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Setup servo
servo.attach(SERVO_PIN);
servo.write(0); // Servo dalam posisi tertutup di awal
// Inisialisasi sensor DHT22
dht.begin();
// Set timer untuk pengecekan setiap detik
timer.setInterval(1000L, checkTrashStatus);
}
void loop() {
Blynk.run(); // Jalankan Blynk
timer.run(); // Jalankan timer untuk pengecekan berkala
}
// Fungsi untuk membaca jarak dari sensor ultrasonik
float readUltrasonicDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2; // Hitung jarak dalam cm
return distance;
}
// Fungsi untuk membuka tutup tempat sampah
void openTrashCan() {
servo.write(90); // Buka tutup (servo bergerak ke 90 derajat)
delay(3000); // Tunggu 3 detik sebelum menutup lagi
closeTrashCan(); // Tutup setelah 3 detik
}
// Fungsi untuk menutup tutup tempat sampah
void closeTrashCan() {
servo.write(0); // Tutup tempat sampah (servo kembali ke 0 derajat)
}
// Fungsi untuk mengecek status sampah (basah atau kering)
void checkTrashStatus() {
float distance = readUltrasonicDistance();
float humidity = dht.readHumidity();
if (isnan(humidity)) {
Serial.println("Gagal membaca kelembapan!");
return;
}
Serial.print("Jarak: ");
Serial.print(distance);
Serial.println(" cm");
Serial.print("Kelembapan: ");
Serial.print(humidity);
Serial.println(" %");
// Kirim data ke Blynk
Blynk.virtualWrite(BLYNK_VPIN_JARAK, distance);
Blynk.virtualWrite(BLYNK_VPIN_KELEMBAPAN, humidity);
if (distance <= THRESHOLD_DISTANCE) {
if (humidity > 60.0) {
Blynk.notify("Sampah basah terdeteksi, tempat sampah basah penuh!");
Blynk.virtualWrite(BLYNK_VPIN_NOTIF, "Sampah Basah Penuh");
Blynk.virtualWrite(BLYNK_VPIN_LED, 255); // LED menyala jika penuh
openTrashCan();
} else {
Blynk.notify("Sampah kering terdeteksi, tempat sampah kering penuh!");
Blynk.virtualWrite(BLYNK_VPIN_NOTIF, "Sampah Kering Penuh");
Blynk.virtualWrite(BLYNK_VPIN_LED, 255); // LED menyala jika penuh
openTrashCan();
}
} else {
Blynk.virtualWrite(BLYNK_VPIN_NOTIF, "Tempat Sampah Kosong");
Blynk.virtualWrite(BLYNK_VPIN_LED, 0); // Matikan LED jika kosong
}
}