#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <RTClib.h>
#include <ESP32Servo.h>
RTC_DS1307 rtc;
int jam, menit,detik,hari,tanggal,bulan,tahun;
char temp[33];
Servo servoMotor;
#include <LiquidCrystal_I2C.h> // Library untuk mengendalikan layar LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int pin_ledBiru = 5;
#define pin_ledHijau 18
#define pin_ledKuning 19
#define pin_ledMerah 23
#define pin_buzz 13
#define servo_pin 16
// pin untuk tirgger dan echo dari sensor ultrasonik
#define trig 15
#define echo 2
const char* ssid = "Wokwi-GUEST";
const char* password = "";
#define BOTtoken "xxxxx"
#define CHAT_ID "xxxxx"
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
void setup() { // setup untuk eksekusi sekali saat perangkat dinyalakan
Serial.begin(115200); // memulai komunikasi serial
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// bot.sendMessage(CHAT_ID, "Hello World!11");
// mencetak pesan selamat datang ke Serial Monitor
// Inisialisasi LCD
lcd.init();
lcd.backlight(); // menghidupkan backlight
//Setup Awal Ketika Running
lcd.setCursor(2,0);
lcd.print("MONITORING");
lcd.setCursor(2,1);
lcd.print("DEBIT AIR");
// SETUP LED
pinMode(pin_ledBiru, OUTPUT);
pinMode(pin_ledHijau, OUTPUT);
pinMode(pin_ledKuning, OUTPUT);
pinMode(pin_ledMerah, OUTPUT);
// Pengaturan mode pin LED sebagai OUTPUT, dan mengontrolnya sebagai output digital
// SETUP BUZZER
ledcSetup(0, 2000, 8);
ledcAttachPin(pin_buzz, 0);
pinMode(pin_buzz, OUTPUT);
// Inisialisasi pengaturan PWM untuk buzzer dan menghubungkannya ke pin
// SETUP ULTRASONIC
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
// Pengaturan mode pin trig sebagai OUTPUT dan pin echo sebagai INPUT
// pinMode(servo);
servoMotor.attach(servo_pin);
servoMotor.write(servo_pin);
servoMotor.write(0);
rtc.begin();
delay(2000); lcd.clear();
}
void loop() {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
int durasi = pulseIn(echo, HIGH);
int jarak = durasi * 0.034 / 2;
indikator(jarak);
tampilkanPesanLCD(jarak);
Serial.println(jarak);
// mencetak jarak ke Serial Monitor untuk pemantauan
delay(1000); // Tambahkan delay untuk stabilisasi bacaan
DateTime now = rtc.now();
jam = now.hour(); menit = now.minute(); detik = now.second(); tanggal = now.day();
bulan = now.month(); tahun = now.year(); hari = now.dayOfTheWeek();
sprintf(temp, "JAM %02d:%02d:%02d WIB", jam,menit,detik);
lcd.setCursor(0,0);
}
void indikator(float jarak) {
// fungsi yang mengontrol LED, buzzer berdasarkan jarak yang diukur
if (jarak < 300) {
digitalWrite(pin_ledBiru, HIGH);
} else {
digitalWrite(pin_ledBiru, LOW);
}
if (jarak < 200) {
digitalWrite(pin_ledHijau, HIGH);
} else {
digitalWrite(pin_ledHijau, LOW);
}
if (jarak < 150) {
digitalWrite(pin_ledKuning, HIGH);
} else {
digitalWrite(pin_ledKuning, LOW);
}
if (jarak < 50) {
digitalWrite(pin_ledMerah, HIGH);
tone(pin_buzz, 1000, 4);
} else {
digitalWrite(pin_ledMerah, LOW);
noTone(pin_buzz);
}
}
void tampilkanPesanLCD(int jarak) {
lcd.clear(); // membersihkan layar LCD
lcd.setCursor(0, 0); // mengatur posisi kursor layar LCD di baris 0, kolom 0
lcd.print("Jarak: ");
lcd.print(jarak);
lcd.print(" cm"); // mencetak nilai jarak diikuti oleh " cm" di layar LCD
// mencetak pesan lcd
if (jarak <= 50) {
lcd.setCursor(0, 1);
lcd.print(" Status Bahaya ");
delay(1000);
lcd.clear();
lcd.print(temp);
tone(pin_buzz, 1000, 20);
servoMotor.write(90);
bot.sendMessage(CHAT_ID, "Status: Bahaya ");
bot.sendMessage(CHAT_ID, temp);
}
else if (jarak <= 100 && jarak > 50) {
lcd.setCursor(0, 1);
lcd.print("Status Siaga ");
tone(pin_buzz, 1000, 10);
servoMotor.write(45);
bot.sendMessage(CHAT_ID,"Status: Siaga ");
bot.sendMessage(CHAT_ID, temp);
} else if (jarak < 200 && jarak >= 100) {
lcd.setCursor(0, 1);
lcd.print("Status Waspada");
} else {
lcd.setCursor(0, 1);
lcd.print("Status Normal");
}
delay(1000); // Tampilkan pesan selama 1 detik
}