#define trigPin 9
#define echoPin 8
#define sensorKekeruhan A0 // Pin untuk sensor kekeruhan (analog)
#define ledGreen 3
#define ledYellow 4
#define ledRed 5
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(sensorKekeruhan, INPUT);
pinMode(ledGreen, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledRed, OUTPUT);
Serial.begin(9600);
}
void loop() {
// Mengukur ketinggian air dengan sensor HC-SR04
long duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.034 / 2; // Konversi ke cm
// Membaca kekeruhan air dari sensor analog (misalnya potensiometer)
int kekeruhan = analogRead(sensorKekeruhan);
float kekeruhan_normalized = map(kekeruhan, 0, 1023, 0, 100); // Normalisasi 0-100
// Menampilkan data di Serial Monitor
Serial.print("Ketinggian Air: ");
Serial.print(distance);
Serial.println(" cm");
Serial.print("Kekeruhan Air: ");
Serial.println(kekeruhan_normalized);
// Menghitung derajat keanggotaan fuzzy untuk ketinggian
float rendah = ketinggianRendah(distance);
float sedang = ketinggianSedang(distance);
float tinggi = ketinggianTinggi(distance);
// Menghitung derajat keanggotaan fuzzy untuk kekeruhan
float jernih = kekeruhanJernih(kekeruhan_normalized);
float sedangKekeruhan = kekeruhanSedang(kekeruhan_normalized);
float keruh = kekeruhanKeruh(kekeruhan_normalized);
// Rule base (aturan fuzzy)
float rendahOut = max(min(rendah, jernih), min(rendah, sedangKekeruhan));
float sedangOut = max(min(sedang, jernih), min(sedang, sedangKekeruhan));
float tinggiOut = max(min(tinggi, sedangKekeruhan), min(tinggi, keruh));
// Defuzzifikasi (rata-rata tertimbang)
float z = ((rendahOut * 100) + (sedangOut * 400) + (tinggiOut * 800)) /
(rendahOut + sedangOut + tinggiOut);
// Menentukan status air berdasarkan hasil defuzzifikasi
if (z <= 200) {
Serial.println("Status Air: Rendah");
digitalWrite(ledRed, HIGH); // Lampu merah menyala
digitalWrite(ledYellow, LOW); // Lampu kuning mati
digitalWrite(ledGreen, LOW); // Lampu hijau mati
} else if (z > 200 && z <= 600) {
Serial.println("Status Air: Sedang");
digitalWrite(ledRed, LOW); // Lampu merah mati
digitalWrite(ledYellow, HIGH); // Lampu kuning menyala
digitalWrite(ledGreen, LOW); // Lampu hijau mati
} else {
Serial.println("Status Air: Tinggi");
digitalWrite(ledRed, LOW); // Lampu merah mati
digitalWrite(ledYellow, LOW); // Lampu kuning mati
digitalWrite(ledGreen, HIGH); // Lampu hijau menyala
}
delay(2000); // Delay untuk stabilisasi
}
// Fungsi keanggotaan untuk ketinggian air
float ketinggianRendah(float x) {
if (x <= 30) return 1.0;
else if (x > 30 && x <= 60) return (60 - x) / 30.0;
else return 0.0;
}
float ketinggianSedang(float x) {
if (x <= 30) return 0.0;
else if (x > 30 && x <= 60) return (x - 30) / 30.0;
else if (x > 60 && x <= 90) return (90 - x) / 30.0;
else return 0.0;
}
float ketinggianTinggi(float x) {
if (x <= 90) return 0.0;
else return (x - 90) / 20.0;
}
// Fungsi keanggotaan untuk kekeruhan air
float kekeruhanJernih(float x) {
if (x <= 25) return 1.0;
else if (x > 25 && x <= 50) return (50 - x) / 25.0;
else return 0.0;
}
float kekeruhanSedang(float x) {
if (x <= 25) return 0.0;
else if (x > 25 && x <= 50) return (x - 25) / 25.0;
else if (x > 50 && x <= 75) return (75 - x) / 25.0;
else return 0.0;
}
float kekeruhanKeruh(float x) {
if (x <= 75) return 0.0;
else return (x - 75) / 25.0;
}