#include <Wire.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
// Wi-Fi & Telegram
const char* ssid = "Wokwi-GUEST";
const char* password = "";
#define BOTtoken "7148350230:AAH8pSCsd02LG0VoC079B5SYlSS-lmkrrm8"
#define CHAT_ID "518947846"
// Komponen
const int pinPIR = 4;
const int pinLED = 2;
const int pinBuzzer = 25;
const int pinServo = 5;
int pirState = LOW;
Servo servo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
// Fungsi Notifikasi & Aksi Gerakan
void handleMotionDetected() {
Serial.println("Gerakan Terdeteksi");
bot.sendMessage(CHAT_ID, "Gerakan Terdeteksi", "");
// Buzzer bip 2x
for (int i = 0; i < 2; i++) {
tone(pinBuzzer, 2000, 300);
delay(400);
}
digitalWrite(pinLED, HIGH);
servo.write(180);
lcd.clear();
lcd.setCursor(0, 0); lcd.print("ADA GERAKAN");
lcd.setCursor(0, 1); lcd.print("PINTU TERBUKA");
pirState = HIGH;
}
void handleNoMotion() {
Serial.println("Tidak Ada Gerakan");
bot.sendMessage(CHAT_ID, "Aman", "");
digitalWrite(pinLED, LOW);
servo.write(0);
lcd.clear();
lcd.setCursor(0, 0); lcd.print("AMAN");
lcd.setCursor(0, 1); lcd.print("PINTU TERTUTUP");
pirState = LOW;
}
void setup() {
Serial.begin(115200);
pinMode(pinPIR, INPUT);
pinMode(pinLED, OUTPUT);
pinMode(pinBuzzer, OUTPUT);
servo.attach(pinServo);
servo.write(0);
lcd.init();
lcd.backlight();
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("\nWiFi connected");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
bot.sendMessage(CHAT_ID, "Bot started up", "");
}
void loop() {
int motion = digitalRead(pinPIR);
if (motion == HIGH && pirState == LOW) {
handleMotionDetected();
} else if (motion == LOW && pirState == HIGH) {
handleNoMotion();
}
}