#define BLYNK_TEMPLATE_ID "TMPL6FlxSXsyN"
#define BLYNK_TEMPLATE_NAME "Perangkap Tikus Berbasis IoT"
#define BLYNK_AUTH_TOKEN "9vY6xby48s-JBzZleNGs7yE-jItZUZoE"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#define pintriger1 5
#define pinecho1 18
#define pintriger2 14
#define pinecho2 26
#define pintriger3 25
#define pinecho3 33
#define pintriger4 32
#define pinecho4 4
#define Relay1 27
#define pushButtonPin 19
#define VPIN_pin_tombol1 V1
#define VPIN_counting V3
long durasi1, durasi2, durasi3, durasi4;
float distance1, distance2, distance3, distance4;
bool isSystemOn = true;
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variabel untuk menyimpan status sebelumnya
bool objectDetectedPrevious = false;
bool buttonPressedPrevious = false; // Menyimpan status tombol sebelumnya
const char* ssid = "Wokwi-GUEST";
const char* password = "";
BlynkTimer timer;
void setup() {
Serial.begin(9600);
pinMode(pintriger1, OUTPUT);
pinMode(pinecho1, INPUT);
pinMode(pintriger2, OUTPUT);
pinMode(pinecho2, INPUT);
pinMode(pintriger3, OUTPUT);
pinMode(pinecho3, INPUT);
pinMode(pintriger4, OUTPUT);
pinMode(pinecho4, INPUT);
pinMode(Relay1, OUTPUT);
pinMode(pushButtonPin, INPUT_PULLUP);
lcd.init();
lcd.backlight();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);
timer.setInterval(1000L, sendSystemStatusToBlynk);
}
void loop() {
Blynk.run();
timer.run();
// Periksa tombol pushbutton untuk mengubah status sistem
bool buttonPressed = (digitalRead(pushButtonPin) == LOW);
if (buttonPressed && !buttonPressedPrevious) {
isSystemOn = !isSystemOn;
updateLCD(isSystemOn); // Perbarui LCD sesuai dengan status sistem
delay(200); // Debounce
}
buttonPressedPrevious = buttonPressed;
if (isSystemOn) {
measureDistances();
checkObjectDetection();
} else {
digitalWrite(Relay1, LOW); // Mematikan relay jika sistem OFF
}
}
void measureDistances() {
distance1 = measureSingleSensor(pintriger1, pinecho1);
distance2 = measureSingleSensor(pintriger2, pinecho2);
distance3 = measureSingleSensor(pintriger3, pinecho3);
distance4 = measureSingleSensor(pintriger4, pinecho4);
}
float measureSingleSensor(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
return duration * 0.034 / 2;
}
void checkObjectDetection() {
// Check if any object is detected
bool objectDetected = (distance1 < 50 || distance2 < 50 || distance3 < 50 || distance4 < 50);
if (objectDetected) {
digitalWrite(Relay1, LOW); // Turn off relay
updateLCD(false); // Update LCD dengan status "Objek Terdeteksi!"
} else {
digitalWrite(Relay1, HIGH); // Turn on relay
updateLCD(true); // Update LCD dengan status "System ON"
}
}
void updateLCD(bool systemActive) {
// Hanya perbarui LCD jika status berubah
if (systemActive != objectDetectedPrevious) {
lcd.clear();
if (systemActive) {
lcd.setCursor(0, 0);
lcd.print("System ON");
lcd.setCursor(0, 1);
lcd.print("Tidak Ada Objek");
Serial.println("Sistem aktif karena tidak ada objek.");
} else {
lcd.setCursor(0, 0);
lcd.print("Objek Terdeteksi!");
lcd.setCursor(0, 1);
lcd.print("System OFF");
Serial.println("Sistem dimatikan karena objek terdeteksi.");
}
objectDetectedPrevious = systemActive; // Simpan status saat ini
}
}
void sendSystemStatusToBlynk() {
Blynk.virtualWrite(VPIN_pin_tombol1, isSystemOn ? 1 : 0);
}