#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Definisi pin
#define TRIGGER_PIN 5     // Pin trigger sensor ultrasonik
#define ECHO_PIN 18       // Pin echo sensor ultrasonik
#define BUZZER_PIN 4      // Pin buzzer
#define BUTTON_PIN 13     // Pin tombol
#define DISTANCE_THRESHOLD 30  // Batas ketinggian air (cm)

// Definisi OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// Variabel global
float duration_us, distance_cm;
bool alarmActive = false;  // Status alarm
bool buttonPressed = false; // Status tombol ditekan
String NamaMadrasah = "MANLIBO";

void setup() {
  Serial.begin(9600);

  // Inisialisasi pin
  pinMode(TRIGGER_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);  // Aktifkan internal pull-up untuk tombol

  // Inisialisasi OLED
  if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 initialization failed"));
    while (1);
  }

  // Tampilkan pesan awal
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
  oled.setCursor(0, 2);
  oled.println("MADRASAH");
  oled.setCursor(0, 20);
  oled.println("HEBAT");
  oled.display();
  delay(2000);
}

void loop() {
  // Baca tombol dengan debounce
  if (digitalRead(BUTTON_PIN) == LOW) {
    delay(50); // Hindari bouncing tombol
    if (digitalRead(BUTTON_PIN) == LOW) {
      buttonPressed = true;  // Set tombol ditekan
    }
  }

  // Kirim pulsa trigger
  digitalWrite(TRIGGER_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);

  // Baca durasi pantulan sinyal ultrasonik
  duration_us = pulseIn(ECHO_PIN, HIGH);
  distance_cm = duration_us * 0.017; // Konversi waktu ke jarak (cm)

  // Cetak ke Serial Monitor
  Serial.print("Jarak: ");
  Serial.print(distance_cm);
  Serial.println(" cm");

  // Logika alarm:
  if (distance_cm < DISTANCE_THRESHOLD && !buttonPressed) {
    tone(BUZZER_PIN, 1000);  // Bunyikan buzzer
    alarmActive = true;
  } else {
    noTone(BUZZER_PIN);  // Matikan buzzer
    alarmActive = false;
  }

  // Jika tombol ditekan, matikan alarm
  if (buttonPressed) {
    noTone(BUZZER_PIN);
    alarmActive = false;
  }

  // RESET buttonPressed jika sensor kembali normal
  if (distance_cm > DISTANCE_THRESHOLD) {
    buttonPressed = false;  // Reset tombol agar alarm bisa menyala lagi
  }

  // Tampilkan ke OLED
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
  oled.setCursor(0, 0);
  oled.print(NamaMadrasah);
  oled.setCursor(0, 20);
  oled.print(distance_cm);
  oled.print(" cm");

  oled.setCursor(0, 45);
  oled.print(alarmActive ? "ALARM ON" : "ALARM OFF");

  oled.display();
  delay(500); // Tunggu 500ms sebelum pengukuran berikutnya
}