// === Struct untuk rentang fuzzy ===
struct FuzzyRange {
float aman_min;
float aman_max;
float waspada_min;
float waspada_mid;
float waspada_max;
float bahaya_min;
float bahaya_max;
};
// === Fungsi Keanggotaan Fuzzy ===
float fuzzy_aman(float x, float min, float max) {
if (x <= min) return 1.0;
if (x >= max) return 0.0;
return (max - x) / (max - min);
}
float fuzzy_waspada(float x, float min, float mid, float max) {
if (x <= min || x >= max) return 0.0;
if (x <= mid) return (x - min) / (mid - min);
return (max - x) / (max - mid);
}
float fuzzy_bahaya(float x, float min, float max) {
if (x <= min) return 0.0;
if (x >= max) return 1.0;
return (x - min) / (max - min);
}
// === Fungsi Fuzzy Evaluasi Status ===
void fuzzyStatus(String nama, float ppm, FuzzyRange range) {
float u_aman = fuzzy_aman(ppm, range.aman_min, range.aman_max);
float u_waspada = fuzzy_waspada(ppm, range.waspada_min, range.waspada_mid, range.waspada_max);
float u_bahaya = fuzzy_bahaya(ppm, range.bahaya_min, range.bahaya_max);
String status;
if (u_aman >= u_waspada && u_aman >= u_bahaya) status = "AMAN";
else if (u_waspada >= u_bahaya) status = "WASPADA";
else status = "BAHAYA";
Serial.printf("%s | PPM: %.1f | Status: %s\n", nama.c_str(), ppm, status.c_str());
Serial.printf(" [μ_Aman] = %.2f\n", u_aman);
Serial.printf(" [μ_Waspada] = %.2f\n", u_waspada);
Serial.printf(" [μ_Bahaya] = %.2f\n\n", u_bahaya);
}
// === Setup dan Loop ===
void setup() {
Serial.begin(115200);
delay(50);
randomSeed(micros());
}
void loop() {
// Simulasi data sensor MQ-2
float ppm_MQ2 = random(0, 12001) / 100.0; // Range: 0–120.00 ppm
// Rentang fuzzy khusus untuk MQ-2
FuzzyRange MQ2_range = {
0, 40, // AMAN
30, 60, 90, // WASPADA (min, mid, max)
80, 120 // BAHAYA
};
fuzzyStatus("MQ-2", ppm_MQ2, MQ2_range);
delay(2000);
}