#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
}