float anggotaBisingLow, anggotaBisingHigh;
float anggotaPaparanShort, anggotaPaparanLong;
float rule1, rule2, rule3, rule4;
float 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);
}
float Min(float a, float b) {
return (a < b) ? a : b;
}
// Fungsi untuk menghitung hasil dari setiap aturan fuzzy
void rule() {
fuzifikasi();
// Rule 1: Jika kebisingan tinggi dan paparan lama, maka durasi sirine lama (30 menit)
float x1 = Min(anggotaBisingHigh, anggotaPaparanLong);
rule1 = 30; // Durasi sirine lama
// Rule 2: Jika kebisingan tinggi dan paparan singkat, maka durasi sirine lama (30 menit)
float x2 = Min(anggotaBisingHigh, anggotaPaparanShort);
rule2 = 30;
// Rule 3: Jika kebisingan rendah dan paparan lama, maka durasi sirine singkat (10 menit)
float x3 = Min(anggotaBisingLow, anggotaPaparanLong);
rule3 = 10; // Durasi sirine singkat
// Rule 4: Jika kebisingan rendah dan paparan singkat, maka durasi sirine singkat (10 menit)
float x4 = Min(anggotaBisingLow, anggotaPaparanShort);
rule4 = 10;
// Defuzzifikasi menggunakan metode Centroid
// Menghitung momen dan luas untuk setiap segmen berdasarkan gambar
// Segmen D1 (Persegi panjang dari 0 hingga 10)
float D1_luas = 1.0 * 10.0;
float D1_momen = D1_luas * (10.0 / 2.0);
// Segmen D2 (Trapesium dari 10 hingga 20 dengan tinggi 0.67 ke 0.33)
float D2_luas = 0.5 * (0.67 + 0.33) * 10.0;
float D2_momen = D2_luas * (10.0 + (10.0 / 2.0));
// Segmen D3 (Persegi panjang dari 20 hingga 30 dengan tinggi 0.33)
float D3_luas = 0.33 * 10.0;
float D3_momen = D3_luas * (20.0 + (10.0 / 2.0));
// Hitung total luas dan total momen
float totalLuas = D1_luas + D2_luas + D3_luas;
float totalMomen = D1_momen + D2_momen + D3_momen;
// Defuzzifikasi (Centroid)
def = (totalLuas != 0) ? (totalMomen / totalLuas) : 0;
}
void runFuzzy() {
rule();
}
void setup() {
Serial.begin(9600);
Serial.println("Sistem Logika Fuzzy untuk Sirine Berbunyi");
// Studi Kasus
bising = 95; // Tingkat Kebisingan (dB)
paparan = 55; // Waktu Paparan (menit)
Serial.print("Tingkat 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 Durasi Sirine: ");
Serial.print(def);
Serial.println(" menit");
}
void loop() {
// Tidak ada proses pada loop
}