#include <Wire.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
#include <ESP32Servo.h>
#include <LiquidCrystal_I2C.h>
// WiFi & Telegram Bot
const char* ssid = "Wokwi-GUEST";
const char* password = "";
#define BOTtoken "7827273614:AAFbOjQJAowxN9b9JuPMSLWTYUwVxthF9gA"
#define CHAT_ID "5368241114"
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
// Pin Setup
const int ledPin = 2;
const int irPin = 4;
const int buzzerPin = 5;
const int servoPin = 18;
// Komponen
Servo myServo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
bool objectDetected = false;
void setup() {
Serial.begin(115200);
// Inisialisasi pin
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(irPin, INPUT);
digitalWrite(buzzerPin, LOW);
// Inisialisasi komponen
myServo.attach(servoPin);
myServo.write(0); // posisi awal
Wire.begin(21, 22); // I2C LCD pin default
lcd.init();
lcd.backlight();
lcd.clear();
// WiFi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
Serial.println(WiFi.localIP());
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
bot.sendMessage(CHAT_ID, "Bot sudah aktif!", "");
}
void loop() {
int value = digitalRead(irPin);
if (value == LOW && !objectDetected) {
objectDetected = true;
Serial.println("Objek Terdeteksi!");
bot.sendMessage(CHAT_ID, "Ada yang lewat... seperti kenangan lama :')", "");
// Aktifkan komponen
digitalWrite(ledPin, HIGH);
digitalWrite(buzzerPin, HIGH);
myServo.write(90);
// Scroll tulisan satu kali dari kanan ke kiri
String teks = "Kenangan terindah";
int panjang = teks.length();
for (int i = 16; i >= -panjang; i--) {
lcd.clear();
if (i >= 0) {
lcd.setCursor(i, 0);
lcd.print(teks);
} else {
lcd.setCursor(0, 0);
lcd.print(teks.substring(-i));
}
delay(200);
}
// Matikan komponen setelah scroll selesai
digitalWrite(ledPin, LOW);
digitalWrite(buzzerPin, LOW);
myServo.write(0);
}
// Reset status jika tidak ada objek
if (value == HIGH && objectDetected) {
objectDetected = false;
Serial.println("Objek keluar...");
delay(300); // debouncing
}
delay(100);
}