//PENGGUNAAN LIBRARY
#include <WiFi.h>
#include <UniversalTelegramBot.h>
#include <WiFiClientSecure.h>
// Informasi WiFi dan Bot Telegram
const char* ssid = "Wokwi-GUEST"; //informasi nama wifi
const char* password = ""; //informasi password wifi
// Pengaturan API Bot Telegram dan Chat ID
const char* botToken = "7255967868:AAHR6kpKlNUv0oHmd4aeThbpv4NgF0yEXpY"; //informasi bot token Telegram
const char* chatID = "-4787254926"; //informasi ChatID telegram
//Inisialiasi keamanan dan pengambilan varible bottoken,client
WiFiClientSecure client;
UniversalTelegramBot bot(botToken, client);
// deklarasi dari Pin Komponen
const int pirPin = 4; //deklarasi sensor pir yang menancap pada pin D4
const int buzzerPin = 15; //deklarasi buzzer yang menancap pada pin D15
const int buttonPin = 13; //deklarasi button yang menancap pada pin D13
const int ledPin = 2; //deklarasi LED yang menancap pada pin D2 yang menggunakan resistor 220 ohm untuk menstabilkan tegangan pada LED dan agar sesuai dengan voltase yang dibutuhkan oleh led yaitu sekitar 2 volt
bool isDoorLocked = false; // Status pintu (terkunci atau terbuka)
bool buttonState = HIGH; // Status tombol saat ini
bool lastButtonState = HIGH; // Status tombol sebelumnya
void setup() {
Serial.begin(115200); // Inisialisasi Serial Monitor
// Konfigurasi pin
pinMode(pirPin, INPUT); // konfigurasi bahwa variable pirPin adalah Input
pinMode(buzzerPin, OUTPUT); //konfigurasi bahwa variable buzzerpin adalah output
pinMode(ledPin, OUTPUT); //konfigurasi bahwa variable ledpin adalah output
pinMode(buttonPin, INPUT_PULLUP); // konfigurasi bahwa button pin adalah input pull-up internal yang berarti menjaga sinyal tetap TINGGI secara default
// Konfigurasi sertifikat SSL untuk Telegram (sudah tersedia di library)
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
// Koneksi WiFi
Serial.println("Menghubungkan ke WiFi..."); //melakukan output saat menghubungkan ke wifi
WiFi.begin(ssid, password); //pemanggilan variable ssid dan password untuk terhubung ke wifi
while (WiFi.status() != WL_CONNECTED) { //melakukan perulangan jika wifi tidak berhasil terhubung
delay(500); //melakukan delay selama 500 milisecond
Serial.print("."); //menampilkan output "." dan berulang hingga wifi terhubung
}
Serial.println("\nWiFi terhubung!"); //melakukan output "wifi terhubung" jika wifi telah terkoneksi dan mengakhiri perulangan
Serial.print("IP Address: "); //melakukan output kalimat "IP addres"
Serial.println(WiFi.localIP()); // output alamat IP yang didapatkan dari wifi
}
void loop() {
// Deteksi tombol untuk mengubah status pintu
buttonState = digitalRead(buttonPin); //variable untuk membaca status button pin yang telah dideklarikan sebelumnya (Line 21)
if (buttonState == LOW && lastButtonState == HIGH) { // Deteksi tombol saat ditekan
isDoorLocked = !isDoorLocked; // Ganti status pintu
if (isDoorLocked) { //kondisi dimana status pintu adalah terkunci
Serial.println("Pintu terkunci: Menyalakan LED dan mengirim pesan Telegram."); //menampilkan output "Pintu terkunci: Menyalakan LED dan mengirim pesan Telegram."
digitalWrite(ledPin, HIGH); // fungsi yang dijalankan saat kondisi pintu terkunci lalu menyalakan LED
bool success = bot.sendMessage(chatID, "Pintu terkunci", ""); //variable yang menyimpan kondisi jika fungsi sebelumnya berjalan maka memanggil chat id telegram dan mengirim pesan "Pintu terkunci"
if (success) { //kondisi jika variable sebelumnya (success)
Serial.println("Pesan berhasil dikirim ke Telegram!"); //kondisi jika variable sebelumnya (success) maka akan menampilkan pesan "pesan berhasil dikirim ke Telegram!"
} else { //kondisi jika nilai variable success tidak terdapat pada kondisi diatas maka menjalankan fungsi dibawah ini
Serial.println("Gagal mengirim pesan ke Telegram."); //kondisi jika nilai variable success tidak terdapat pada kondisi sebelumnya maka akan menampilkan pesan "Gagal mengirim pesan ke Telegram"
}
} else { // kondisi nilai varibale isDoorLocked tidak sesuai dengan yang telah disebutkan diatas
Serial.println("Pintu terbuka: Mematikan LED dan mengirim pesan Telegram."); //maka menampilkan pesan "Pintu terbuka: Mematikan LED dan mengirim pesan Telegram."
digitalWrite(ledPin, LOW); // fungsi yang dijalankan setelah fungsi diatas dan mematikan LED
bool success = bot.sendMessage(chatID, "Pintu terbuka", ""); //fungsi jika variable success tidak bernilai sama dengan yang disebutkan pada fungsi kondisi pertama dan mengirimkan pesan ke telegram
if (success) { // fungsi untuk membaca kondisi varibale succes
Serial.println("Pesan berhasil dikirim ke Telegram!"); // jika fungsi sebelumnya dijalankan tanpa error maka menampilkan "Pesan berhasil dikirim ke Telegram!"
} else {
Serial.println("Gagal mengirim pesan ke Telegram."); //jika fungsi sebelumnya dijalankan dengan error maka menampilkan "Gagal mengirim pesan ke Telegram."
}
}
delay(50); // melakukan delay selama 50 milisecond
}
lastButtonState = buttonState; // variabel lastButtonState bernilai sama dengan variable buttonState yang berfungsi untuk memperbarui status tombol terakhir
// Hanya deteksi gerakan saat pintu terkunci (LED menyala)
if (isDoorLocked && digitalRead(pirPin) == HIGH) { //kondisi jika variable isDoorLocked maka akan menyalakan sensor PIR
Serial.println("Deteksi gerakan: Mengaktifkan buzzer dan mengirim pesan Telegram."); //menampilkan pesan "Deteksi gerakan: Mengaktifkan buzzer dan mengirim pesan Telegram.""
digitalWrite(buzzerPin, HIGH); // funsgi untuk mengaktifkan buzzer jika terdapat gerakan terdeteksi
bool success = bot.sendMessage(chatID, "Ada pergerakan terdeteksi!", ""); //fungsi untuk mengirimkan pesan pada telegram dan menyimpan pada variable success
if (success) { //kondisi jikaa variable succes berhasil dijalankan
Serial.println("Pesan berhasil dikirim ke Telegram!"); //maka akan menampilkan "Pesan berhasil dikirim ke Telegram!""
} else { //jika jika varibale success tidak bernalai sama atau tidak berjalan
Serial.println("Gagal mengirim pesan ke Telegram."); //maka akan menampilkan "Gagal mengirim pesan ke Telegram."
}
delay(1000); // melakukan delay selama 1000 milisecond atau 1 detik
digitalWrite(buzzerPin, LOW); // fungsi untuk mematikan Buzzer jika delay telah diselesai
Serial.println("Buzzer dimatikan."); //menampilkan "Buzzer dimatikan"
}
delay(10); // melakukan delay selama 10 milisecond untuk menghindari perulangan terlalu cepat pada tombol
}