float anggotaBisingLow, anggotaBisingHigh;
float anggotaPaparanShort, anggotaPaparanLong;
float rule1, rule2, rule3, rule4;
int def;
float bising = 0, paparan = 0;
// Fungsi membership untuk tingkat kebisingan rendah
void kebisingan_low() {
if (bising <= 85) {
anggotaBisingLow = 1;
} else if (bising > 85 && bising < 100) {
anggotaBisingLow = (100 - bising) / 15.0;
} else {
anggotaBisingLow = 0;
}
}
// Fungsi membership untuk tingkat kebisingan tinggi
void kebisingan_high() {
if (bising >= 100) {
anggotaBisingHigh = 1;
} else if (bising > 85 && bising < 100) {
anggotaBisingHigh = (bising - 85) / 15.0;
} else {
anggotaBisingHigh = 0;
}
}
// Fungsi membership untuk waktu paparan singkat
void paparan_short() {
if (paparan <= 30) {
anggotaPaparanShort = 1;
} else if (paparan > 30 && paparan < 60) {
anggotaPaparanShort = (60 - paparan) / 30.0;
} else {
anggotaPaparanShort = 0;
}
}
// Fungsi membership untuk waktu paparan lama
void paparan_long() {
if (paparan >= 60) {
anggotaPaparanLong = 1;
} else if (paparan > 30 && paparan < 60) {
anggotaPaparanLong = (paparan - 30) / 30.0;
} else {
anggotaPaparanLong = 0;
}
}
// Fungsi fuzzifikasi
void fuzifikasi() {
kebisingan_low();
kebisingan_high();
paparan_short();
paparan_long();
// Tampilkan hasil fuzzifikasi
Serial.println("Hasil Fuzzifikasi:");
Serial.print("Tingkat Kebisingan Rendah: ");
Serial.println(anggotaBisingLow);
Serial.print("Tingkat Kebisingan Tinggi: ");
Serial.println(anggotaBisingHigh);
Serial.print("Waktu Paparan Singkat: ");
Serial.println(anggotaPaparanShort);
Serial.print("Waktu Paparan Lama: ");
Serial.println(anggotaPaparanLong);
}
// Fungsi Min menggunakan if-else
float Min(float a, float b) {
if (a < b) {
return a;
} else {
return b;
}
}
// Evaluasi aturan fuzzy
void rule() {
fuzifikasi();
// Rule 1: Jika kebisingan tinggi dan paparan lama, maka durasi sirine lama
float x1 = Min(anggotaBisingHigh, anggotaPaparanLong);
rule1 = 30 - (20 * x1); // Durasi sirine lama
// Rule 2: Jika kebisingan tinggi dan paparan singkat, maka durasi sirine lama
float x2 = Min(anggotaBisingHigh, anggotaPaparanShort);
rule2 = 30 - (20 * x2);
// Rule 3: Jika kebisingan rendah dan paparan lama, maka durasi sirine singkat
float x3 = Min(anggotaBisingLow, anggotaPaparanLong);
rule3 = 10 + (20 * x3); // Durasi sirine singkat
// Rule 4: Jika kebisingan rendah dan paparan singkat, maka durasi sirine singkat
float x4 = Min(anggotaBisingLow, anggotaPaparanShort);
rule4 = 10 + (20 * x4);
// Defuzzifikasi
def = ((x1 * rule1) + (x2 * rule2) + (x3 * rule3) + (x4 * rule4)) / (x1 + x2 + x3 + x4);
}
// Fungsi utama untuk menjalankan fuzzy logic
void runFuzzy() {
rule();
}
void setup() {
Serial.begin(9600);
Serial.println("Sistem Logika Fuzzy Dijalankan");
bising = 95; // Level Kebisingan (dB)
paparan = 55; // Waktu Paparan (menit)
Serial.print("Level Kebisingan: ");
Serial.print(bising);
Serial.println(" dB");
Serial.print("Waktu Paparan: ");
Serial.print(paparan);
Serial.println(" menit");
// Jalankan fuzzy logic
runFuzzy();
// Tampilkan hasil defuzzifikasi
Serial.print("Output Defuzzifikasi Mamdani (Durasi Sirine): ");
Serial.print(def);
Serial.println(" menit");
}
void loop() {
}