// Id, Name, dan Token untuk terhubung ke BLYNK
#define BLYNK_TEMPLATE_ID "TMPL6Cse-fsbf"
#define BLYNK_TEMPLATE_NAME "SENSOR PENDETEKSI BANJIR"
#define BLYNK_AUTH_TOKEN "SNl0vwpPuFawcHAWcGcGDZyX4It7-xkl"
#define BLYNK_PRINT Serial

// Import library
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
// Definisikan pin untuk sensor ultrasonik dan buzzer
#define trigPin 12
#define echoPin 14
#define buzzerPin 4

// Definisikan jarak threshold untuk setiap tingkat peringatan
#define dangerDistance 20
#define alert3Distance 50
#define alert2Distance 80
#define alert1Distance 100

// Inisialisasi LCD dengan alamat I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(buzzerPin, OUTPUT);

  // Inisialisasi LCD
  lcd.init();
  lcd.backlight();
  lcd.clear();

  // Tampilkan pesan selamat datang pada LCD
  lcd.setCursor(0, 0);
  lcd.print("Sistem Pendeteksi");
  lcd.setCursor(0, 1);
  lcd.print("Banjir");
  delay(2000);
}

void loop() {
  // Baca jarak dari sensor ultrasonik
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = duration * 0.034 / 2;

  // Tampilkan jarak pada serial monitor
  Serial.print("Jarak: ");
  Serial.println(distance);

  // Tampilkan jarak pada LCD
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Jarak:");
  lcd.setCursor(7, 0);
  lcd.print(distance);
  lcd.setCursor(12, 0);
  lcd.print("cm");

  // Beri peringatan sesuai dengan jarak yang terdeteksi
  if (distance <= dangerDistance) {
    lcd.setCursor(0, 1);
    lcd.print("Bahaya");
    tone(buzzerPin, 1000);
  } else if (distance <= alert3Distance) {
    lcd.setCursor(0, 1);
    lcd.print("Siaga 3");
    noTone(buzzerPin);
  } else if (distance <= alert2Distance) {
    lcd.setCursor(0, 1);
    lcd.print("Siaga 2");
    noTone(buzzerPin);
  } else if (distance <= alert1Distance) {
    lcd.setCursor(0, 1);
    lcd.print("Siaga 1");
    noTone(buzzerPin);
  } else {
    lcd.setCursor(0, 1);
    lcd.print("Aman");
    noTone(buzzerPin);
  }

  delay(1000);
}