#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
// Pin untuk ultrasonic sensor dan LED
#define TRIG_PIN 18
#define ECHO_PIN 5
#define LED_WHITE 22
#define LED_BLUE 21
#define LED_RED 23
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Telegram BOT credentials
#define BOTtoken "7591889335:AAEnmisfXl1O8WWoUFHFWbKpahitY_9btY8"
#define CHAT_ID "7060442428"
// Inisialisasi Telegram bot dan WiFi client
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
// Variabel untuk jarak dan waktu
float duration_us, distance_cm;
unsigned long lastNotification = 0;
int notificationInterval = 5000; // Interval untuk mengirim notifikasi (ms)
// Status lampu sebelumnya
bool lampuPutihNyala = false;
bool lampuBiruNyala = false;
bool lampuMerahNyala = false;
void setup() {
// Inisialisasi pin
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_WHITE, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
pinMode(LED_RED, OUTPUT);
// Serial untuk debugging
Serial.begin(115200);
// Koneksi WiFi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
// Sertifikat root untuk koneksi aman (opsional)
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi.");
Serial.println(WiFi.localIP());
// Sinkronisasi waktu
configTime(0, 0, "pool.ntp.org");
time_t now = time(nullptr);
while (now < 24 * 3600) {
delay(100);
now = time(nullptr);
}
Serial.println("Time synchronized.");
}
void loop() {
// Trigger sensor ultrasonik
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration_us = pulseIn(ECHO_PIN, HIGH);
distance_cm = 0.017 * duration_us;
// Cek jarak dan kontrol lampu
kontrolLampu(distance_cm);
// Print jarak ke serial monitor
Serial.print("Distance: ");
Serial.print(distance_cm);
Serial.println(" cm");
delay(500); // Delay untuk pembacaan sensor
}
void kontrolLampu(float distance) {
unsigned long currentMillis = millis();
// Reset semua lampu
digitalWrite(LED_WHITE, LOW);
digitalWrite(LED_BLUE, LOW);
digitalWrite(LED_RED, LOW);
if (distance < 20) {
digitalWrite(LED_WHITE, HIGH);
if (!lampuPutihNyala && currentMillis - lastNotification > notificationInterval) {
bot.sendMessage(CHAT_ID, "Lampu Putih Menyala (Jarak < 20 cm)", "");
lampuPutihNyala = true;
lampuBiruNyala = lampuMerahNyala = false;
lastNotification = currentMillis;
}
} else if (distance < 50) {
digitalWrite(LED_BLUE, HIGH);
if (!lampuBiruNyala && currentMillis - lastNotification > notificationInterval) {
bot.sendMessage(CHAT_ID, "Lampu Biru Menyala (20 cm <= Jarak < 50 cm)", "");
lampuBiruNyala = true;
lampuPutihNyala = lampuMerahNyala = false;
lastNotification = currentMillis;
}
} else if (distance <= 100) {
digitalWrite(LED_RED, HIGH);
if (!lampuMerahNyala && currentMillis - lastNotification > notificationInterval) {
bot.sendMessage(CHAT_ID, "Lampu Merah Menyala (50 cm <= Jarak <= 100 cm)", "");
bot.sendMessage(CHAT_ID, "⚠️ BBM ALERT!!!", "");
lampuMerahNyala = true;
lampuPutihNyala = lampuBiruNyala = false;
lastNotification = currentMillis;
}
} else {
lampuPutihNyala = lampuBiruNyala = lampuMerahNyala = false;
}
}