#define BLYNK_TEMPLATE_ID "SILA_REPLACE_ID_ANDA"
#define BLYNK_TEMPLATE_NAME "SILA_REPLACE_NAME_ANDA"
#define BLYNK_AUTH_TOKEN "SILA_REPLACE_TOKEN_ANDA"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <ESP32Servo.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
Servo s1;
const int trigPin = 5;
const int echoPin = 18;
const int soilPin = 34;
long duration;
int distanceCm;
int soilValue = 0;
bool isWet = false;
bool tongSudahBuka = false;
BlynkTimer timer;
// Fungsi pemasa: Menghantar data ke Blynk setiap 2 saat
void sendSensorData() {
// 1. Hantar data jarak ke V2
Blynk.virtualWrite(V2, distanceCm);
// 2. Hantar status semasa ke V1 secara real-time
if (distanceCm < 20) {
if (isWet) {
Blynk.virtualWrite(V1, "SISA BASAH");
} else {
Blynk.virtualWrite(V1, "SISA KERING");
}
} else {
Blynk.virtualWrite(V1, "Tong Ditutup (Sedia)");
}
}
void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
s1.attach(19);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Set pemasa 2 saat
timer.setInterval(2000L, sendSensorData);
Serial.println("--- Sistem Smart Eco Bin IoT Bermula ---");
}
void loop() {
Blynk.run();
timer.run();
// Baca Jarak (Ultrasonic)
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distanceCm = duration * 0.034 / 2;
// Baca Kelembapan (Potentiometer)
soilValue = analogRead(soilPin);
if (soilValue > 2000) {
isWet = true;
} else {
isWet = false;
}
// Logik Kawalan Servo & Notifikasi Emel
if (distanceCm < 20) {
if (tongSudahBuka == false) {
if (isWet == true) {
Serial.println("Mesej: Ini sisa basah!");
s1.write(100);
Blynk.logEvent("sampah_masuk", "Amaran: Sisa BASAH telah dimasukkan ke dalam tong!");
}
else {
Serial.println("Mesej: Ini sisa kering!");
s1.write(0);
Blynk.logEvent("sampah_masuk", "Notifikasi: Sisa KERING telah dimasukkan ke dalam tong.");
}
tongSudahBuka = true;
delay(2000);
}
}
else {
s1.write(50);
tongSudahBuka = false;
}
delay(50);
}