// Implementasi Fuzzy Sugeno pada Arduino dengan Wokwi
// Input: Potensiometer untuk Konsentrasi Gas dan Waktu, HC-SR04 untuk Jarak
// Output: Aktivasi Buzzer berdasarkan hasil nilai Z
#define TRIG_PIN 9
#define ECHO_PIN 8
#define POT_GAS A0
#define POT_WAKTU A1
#define BUZZER 3
long duration;
float distance;
int gasValue;
int waktuValue;
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER, OUTPUT);
}
float bacaJarak() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
return distance;
}
float fuzzifikasiGas(int gas) {
if (gas <= 200) return 0; // Rendah
else if (gas <= 1000) return 0.25; // Sedang
else return 0.75; // Tinggi
}
float fuzzifikasiJarak(float jarak) {
if (jarak <= 5) return 0; // Dekat
else if (jarak <= 20) return 0.67; // Sedang
else return 0.33; // Jauh
}
float fuzzifikasiWaktu(int waktu) {
if (waktu <= 30) return 0; // Singkat
else if (waktu <= 120) return 0.78; // Sedang
else return 0.22; // Lama
}
float hitungZ(float alpha, float Z) {
return alpha * Z;
}
void loop() {
gasValue = analogRead(POT_GAS);
waktuValue = analogRead(POT_WAKTU);
float jarak = bacaJarak();
float gasFuzzy = fuzzifikasiGas(gasValue);
float jarakFuzzy = fuzzifikasiJarak(jarak);
float waktuFuzzy = fuzzifikasiWaktu(waktuValue);
float Z[18] = {280, 200, 60, 1080, 1000, 60, 5080, 5000, 60, 5080, 200, 600, 1350, 1000, 600, 5350, 5000, 600};
float alpha[18];
alpha[0] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R1
alpha[1] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R2
alpha[2] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R3
alpha[3] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R4
alpha[4] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R5
alpha[5] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R6
alpha[6] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R7
alpha[7] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R8
alpha[8] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R9
alpha[9] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R10
alpha[10] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R11
alpha[11] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R12
alpha[12] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R13
alpha[13] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R14
alpha[14] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R15
alpha[15] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R16
alpha[16] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R17
alpha[17] = min(min(gasFuzzy, jarakFuzzy), waktuFuzzy); // R18
float numerator = 0, denominator = 0;
for (int i = 0; i < 18; i++) {
numerator += hitungZ(alpha[i], Z[i]);
denominator += alpha[i];
}
float Z_final = (denominator != 0) ? numerator / denominator : 0;
Serial.print("Nilai Z: ");
Serial.println(Z_final);
if (Z_final >= 1000) {
tone(BUZZER, 1000);
} else if (Z_final >= 500) {
tone(BUZZER, 500);
} else {
noTone(BUZZER);
}
delay(1000);
}