#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Definisi pin sensor ultrasonik dan komponen peringatan
const int trigPin = 9;
const int echoPin = 10;
const int buzzerPin = 11; // atau LED dengan resistor
// Variabel untuk penyimpanan
long duration;
int distance;
const int tankHeight = 150; // Tinggi tangki dalam cm (misalkan 100 cm)
const int warningLevel = 20; // Tinggi air minimal sebelum peringatan (misalkan 20 cm)
#define SCREEN_WIDTH 128 // Lebar layar OLED
#define SCREEN_HEIGHT 64 // Tinggi layar OLED
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C // Alamat I2C OLED (umumnya 0x3C atau 0x3D)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzerPin, OUTPUT);
Serial.begin(9600);
// Inisialisasi OLED display
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
display.setTextSize(1); // Ukuran teks normal
display.setTextColor(SSD1306_WHITE); // Warna teks putih
display.setCursor(0,0); // Posisi cursor di pojok kiri atas
display.display();
}
void loop() {
// Mengirimkan sinyal ultrasonik
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Membaca waktu perjalanan sinyal
duration = pulseIn(echoPin, HIGH);
// Menghitung jarak dari sensor ke permukaan air
distance = duration * 0.034 / 2;
// Menghitung tinggi air dalam tangki
int waterHeight = tankHeight - distance;
// Menampilkan hasil di Serial Monitor
Serial.print("Tinggi air: ");
Serial.print(waterHeight);
Serial.println(" cm");
// Menampilkan hasil di OLED display
display.clearDisplay();
display.setCursor(0, 0);
display.print("Tinggi air:");
display.setCursor(0, 10);
display.print(waterHeight);
display.print(" cm");
// Menghitung volume air
// Misalkan kita memiliki tangki berbentuk persegi panjang dengan dimensi tertentu
// Contoh: Panjang = 50 cm, Lebar = 30 cm
int tankLength = 50; // Panjang tangki dalam cm
int tankWidth = 30; // Lebar tangki dalam cm
int volume = waterHeight * tankLength * tankWidth; // Volume dalam cm^3
display.setCursor(0, 20);
display.print("Volume air:");
display.setCursor(0, 30);
display.print(volume);
display.print(" cm^3");
display.display();
// Peringatan jika tinggi air di bawah level peringatan
if (waterHeight < warningLevel) {
digitalWrite(buzzerPin, HIGH); // Mengaktifkan buzzer atau LED
display.setCursor(0, 40);
display.setTextSize(2); // Ukuran teks besar untuk peringatan
display.print("WARNING!");
display.setTextSize(1); // Kembali ke ukuran teks normal
display.display();
} else {
digitalWrite(buzzerPin, LOW); // Mematikan buzzer atau LED
}
delay(1000); // Tunggu 1 detik sebelum pembacaan berikutnya
}