// Smart Parking berbasis Internet of Things (IoT)
// Nama : Nabila Aulia Rahmah
// NPM : 2010631170153
#define BLYNK_TEMPLATE_ID "TMPL6XFqglNmR"
#define BLYNK_TEMPLATE_NAME "SmartParkingNabila"
#define BLYNK_AUTH_TOKEN "cSjJTQLXEhT1hJkQ2vu1YT7Miylz9zaz"
#define BLYNK_PRINT Serial
#include "CTBot.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>
#include <BlynkSimpleEsp32.h>
#include <ESP32Servo.h>
// Tentukan masing-masing pin untuk berbagai komponen
#define ECHO_B_PIN 15
#define TRIG_B_PIN 2
#define ECHO_A_PIN 32
#define TRIG_A_PIN 33
#define SERVO_PIN 27
#define Red 14
#define Yellow 12
#define Green 13
#define buzzer 26
#define DISTANCE_THRESHOLD 80 // Batas jarak untuk kontrol servo
// Membuat instance kelas Servo untuk mengontrol motor servo
Servo servo;
// Deklarasi variabel untuk pengukuran sensor ultrasonik A
float duration_us, distance_cm;
// Konfigurasikan pengaturan bot Telegram
String token = "6751684693:AAEYDdVQut5YQD5Q90-tfrEOqs7xkCTUkbU";
const int bot_id = 1112809980;
// Konfigurasi blynk
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
CTBot mybot; // Instance kelas CTBot untuk interaksi bot Telegram
BlynkTimer timer; // Membuat instance pengatur waktu untuk tugas terkait Blynk
// Deklarasikan variabel untuk pengukuran sensor ultrasonik B dan Blynk
float distance = 0;
int pinValue2;
// Untuk mengukur jarak menggunakan sensor ultrasonik B
void cal_distance(){
digitalWrite(TRIG_B_PIN, LOW);
delay(10);
digitalWrite(TRIG_B_PIN, HIGH);
delay(10);
digitalWrite(TRIG_B_PIN, LOW);
int duration = pulseIn(ECHO_B_PIN, HIGH);
// Menghitung jarak dalam sentimeter
distance = duration * 0.034 / 2 + 1;
Serial.print("Jarak: ");
Serial.print(distance);
Serial.println(" cm");
}
// Untuk mengontrol indikator LED berdasarkan jarak dari sensor ultrasonik B
void output_distance(){
// Menentukan warna LED berdasarkan jarak yang diukur
if(distance > 40) {
Serial.println("Aman");
digitalWrite(Green, HIGH); // LED Hijau menunjukkan jarak aman
}
else if(distance > 20 && distance < 40) {
Serial.println("Peringatan");
digitalWrite(Yellow, HIGH); // LED kuning menunjukkan jarak kewaspadaan
}
else if(distance < 20) {
Serial.println("Stop");
digitalWrite(Red, HIGH); // LED merah menunjukkan jarak berhenti
}
}
// Untuk menangani perintah dan interaksi bot Telegram
void command(){
TBMessage msg;
// Jika jarak yang diukur kurang dari 20 cm
if(distance < 20) {
tone(buzzer, 300);
mybot.sendMessage(bot_id, "Jarak kurang dari 20cm, mohon berhenti!");
// Periksa pesan baru dari bot
if(mybot.getNewMessage(msg)) {
Serial.println("Keterangan: " + msg.text);
String command = msg.text;
// Memproses perintah khusus yang diterima dari bot
if(command == "On") {
mybot.sendMessage(bot_id, "Alarm diaktifkan");
}
if(command == "Off") {
noTone(buzzer);
mybot.sendMessage(bot_id, "Alarm dinonaktifkan");
}
}
}
else {
noTone(buzzer);
}
}
// Fungsi Blynk untuk memperbarui widget dan indikator LED
void kirim_blynk(){
// Memperbarui widget Blynk dengan nilai jarak dan status LED
Blynk.virtualWrite(V0, distance);
if(distance > 40) {
Blynk.virtualWrite(V1, 1);
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V3, 0);
}
else if(distance >= 20 && distance <= 40) {
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, 1);
Blynk.virtualWrite(V3, 0);
}
else if(distance < 20) {
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V3, 1);
}
// Perbarui aplikasi Blynk dengan nilai 'pinValue2'
Blynk.virtualWrite(V4, pinValue2);
}
// Untuk memperbarui widget dan mengontrol posisi servo
void servo_blynk(){
// Memperbarui Blynk dengan nilai jarak untuk kontrol servo
Blynk.virtualWrite(V5, distance_cm);
// Kontrol posisi servo berdasarkan nilai jarak
if(distance_cm > 80) {
}
else if(distance_cm < 80) {
}
}
BLYNK_WRITE(V6)
{
int pinValue = param.asInt();
if (pinValue == 1) {
servo.write(0);
servo_blynk();
Blynk.run();
int pinValue = 0; // Set status V0 ke 0 untuk keluar, kecuali tombol masih ditekan (seperti di bawah)
Blynk.syncVirtual(V6); // Periksa fungsi BLYNK_WRITE(V6) pada status tombol untuk menentukan apakah berulang atau selesai.
}
else{
servo.write(90);
}
}
BLYNK_WRITE(V4)
{
int pinValue2 = param.asInt();
if (pinValue2 == 1) {
tone(buzzer, 300);
kirim_blynk();
Blynk.run();
int pinValue2 = 0; // Set status V0 ke 0 untuk keluar, kecuali tombol masih ditekan (seperti di bawah)
Blynk.syncVirtual(V4); // Periksa fungsi BLYNK_WRITE(V4) pada status tombol untuk menentukan apakah berulang atau selesai.
}
else{
noTone(buzzer);
}
}
void setup() {
Serial.begin(115200); // Inisialisasi komunikasi serial
Blynk.begin(auth, ssid, pass); // Inisialisasi Blynk dengan otentikasi dan info WiFi
pinMode(TRIG_B_PIN, OUTPUT); // Atur trig pin B sensor ultrasonik sebagai output
pinMode(ECHO_B_PIN, INPUT);// Atur echo pin B sensor ultrasonik sebagai input
pinMode(Red, OUTPUT); // Tetapkan pin LED sebagai output
pinMode(Yellow, OUTPUT);
pinMode(Green, OUTPUT);
pinMode(buzzer, OUTPUT); // Tetapkan buzzer pin sebagai keluaran
timer.setInterval(2000L, kirim_blynk);
timer.setInterval(2000L, servo_blynk);
Serial.println("Start Telegram Bot");
mybot.wifiConnect(ssid, pass); // Hubungkan ke WiFi untuk bot Telegram
mybot.setTelegramToken(token); // Set Telegram bot token
if(mybot.testConnection()) {
Serial.println("Koneksi Berhasil");
}
else {
Serial.println("Harap Coba Lagi!");
}
pinMode(TRIG_A_PIN, OUTPUT);
pinMode(ECHO_A_PIN, INPUT);
servo.attach(SERVO_PIN);
servo.write(0); // Inisialisasi posisi servo
}
void loop() {
digitalWrite(Red, LOW);
digitalWrite(Yellow, LOW);
digitalWrite(Green, LOW);
cal_distance(); // Mengukur jarak menggunakan sensor ultrasonik B
output_distance(); // Mengontrol LED berdasarkan jarak
command(); // Menangani perintah dan interaksi bot Telegram
Blynk.run();
timer.run();
delay(1000);
// Mengukur jarak menggunakan sensor ultrasonik A
digitalWrite(TRIG_A_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_A_PIN, LOW);
duration_us = pulseIn(ECHO_A_PIN, HIGH);
// Menghitung jarak
distance_cm = 0.017 * duration_us;
// Kontrol servo berdasarkan nilai jarak dari sensor ultrasonik A
if (distance_cm < DISTANCE_THRESHOLD)
servo.write(0); // putar motor servo hingga 90 derajat
else
servo.write(90); // putar motor servo ke 0 derajat
// mencetak nilainya ke Serial Monitor
Serial.print("Jarak: ");
Serial.print(distance_cm);
Serial.println(" cm");
delay(500);
}