#define BLYNK_TEMPLATE_ID "TMPL69CUbTQKm"
#define BLYNK_TEMPLATE_NAME "Projek Sumatif parkir"
#define BLYNK_AUTH_TOKEN "MM7V40IgtIbl8rPFEtZMSpOzMM649aWv"
#define BLYNK_PRINT Serial
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h> // Pastikan ini diinstal
// Inisialisasi koneksi Blynk
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST"; // Jika tidak simulasi pakai SSID asli
char pass[] = ""; // Jika tidak simulasi pakai password asli
BlynkTimer timer;
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Deklarasi pin dan variabel
int buzzerPin = 33; // Pin untuk buzzer
#define TRIG_PIN 13 // Pin TRIG sensor ultrasonik
#define ECHO_PIN 12 // Pin ECHO sensor ultrasonik
#define LEDMERAH 14
#define LEDHIJAU 26
#define LEDKUNING 27
#define SERVO_PIN 18 // Pin untuk servo
long durasi, jarak;
Servo myServo; // Gunakan tipe Servo
void setup() {
// Mulai port serial
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
// Inisialisasi LCD
lcd.init();
lcd.setBacklight(255);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" *SENSOR PARKIR *");
lcd.setCursor(0, 1);
lcd.print("* Berbasis IOT*");
delay(5000);
lcd.clear();
// Inisialisasi pin
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LEDMERAH, OUTPUT);
pinMode(LEDHIJAU, OUTPUT);
pinMode(LEDKUNING, OUTPUT);
pinMode(buzzerPin, OUTPUT); // Set pin buzzer sebagai output
// Inisialisasi servo
myServo.attach(SERVO_PIN);
myServo.write(0); // Posisi awal servo (0 derajat)
// Pastikan buzzer dalam keadaan mati saat awal
noTone(buzzerPin); // Untuk buzzer pasif gunakan fungsi tone
}
void loop() {
Blynk.run();
timer.run();
// Mengirimkan sinyal ke sensor ultrasonik
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Menghitung jarak berdasarkan waktu pantulan sinyal ultrasonik
durasi = pulseIn(ECHO_PIN, HIGH);
jarak = (durasi / 2.0) / 29.1;
Serial.print("jarak benda : ");
Serial.print(jarak);
Serial.println(" Cm");
Blynk.virtualWrite(V0, jarak);
// Implement debouncing mechanism
static int lastState = -1; // To track last state
int currentState;
if (jarak > 300) {
currentState = 0; // Safe
} else if (jarak > 100) {
currentState = 1; // Caution
} else {
currentState = 2; // Too Close
}
if (currentState != lastState) {
switch (currentState) {
case 0: // Safe
digitalWrite(LEDHIJAU, HIGH);
digitalWrite(LEDMERAH, LOW);
digitalWrite(LEDKUNING, LOW);
Blynk.virtualWrite(V1, "JARAK AMAN");
lcd.setCursor(0, 0);
lcd.print(" *** JARAK ***");
lcd.setCursor(0, 1);
lcd.print(" *** AMAN *** ");
noTone(buzzerPin);
myServo.write(0);
break;
case 1: // Caution
digitalWrite(LEDHIJAU, LOW);
digitalWrite(LEDMERAH, LOW);
digitalWrite(LEDKUNING, HIGH);
Blynk.virtualWrite(V2, "AWAS HATI HATI");
lcd.setCursor(0, 0);
lcd.print(" *** AWAS *** ");
lcd.setCursor(0, 1);
lcd.print(" * HATI HATI * ");
noTone(buzzerPin);
myServo.write(90);
break;
case 2: // Too Close
digitalWrite(LEDHIJAU, LOW);
digitalWrite(LEDMERAH, HIGH);
digitalWrite(LEDKUNING, LOW);
Blynk.virtualWrite(V3, "AWAS TERLALU DEKAT");
lcd.setCursor(0, 0);
lcd.print(" *** AWAS *** ");
lcd.setCursor(0, 1);
lcd.print("*TERLALU DEKAT* ");
tone(buzzerPin, 1000);
myServo.write(180);
break;
}
lastState = currentState; // Update last state
}
delay(100); // Delay singkat
}