//Referensi: https://www.anakkendali.com/2021/09/11/tutorial-arduino-fuzzy-logic-controller-sugeno/
float nadi = 145;
float suhu = 39;
float A, B;
float udingin[] = {0, 0, 25};
float unormal[] = {20, 27, 36};
float upanas[] = {35, 50, 50};
float ulambat[] = {0, 0, 60};
float usedang[] = {50, 70, 101};
float ucepat[] = {100, 120, 120};
float sakit = 0;
float ks = 0.5;
float sehat = 1;
float minr[10];
float Rule[10];
float fudingin() {
if (suhu < udingin[1]) {
return 1;
} else if (suhu >= udingin[1] && suhu <= udingin[2]) {
return (udingin[2] - suhu) / (udingin[2] - udingin[1]);
} else if (suhu > udingin[2]) {
return 0;
}
}
float funormal() {
if (suhu < unormal[0]) {
return 0;
} else if (suhu >= unormal[0] && suhu <= unormal[1]) {
return (suhu - unormal[0]) / (unormal[1] - unormal[0]);
} else if (suhu >= unormal[1] && suhu < unormal[2]) {
return (unormal[2] - suhu) / (unormal[2] - unormal[1]);
} else if (suhu > unormal[2]) {
return 0;
}
}
float fupanas() {
if (suhu < upanas[0]) {
return 0;
} else if (suhu >= upanas[0] && suhu <= upanas[1]) {
return (suhu - upanas[0]) / (upanas[1] - upanas[0]);
} else if (suhu > upanas[1]) {
return 1;
}
}
float fulambat() {
if (nadi < ulambat[1]) {
return 1;
} else if (nadi >= ulambat[1] && nadi <= ulambat[2]) {
return (ulambat[2] - nadi) / (ulambat[2] - ulambat[1]);
} else if (nadi > ulambat[2]) {
return 0;
}
}
float fusedang() {
if (nadi < usedang[0]) {
return 0;
} else if (nadi >= usedang[0] && nadi <= usedang[1]) {
return (nadi - usedang[0]) / (usedang[1] - usedang[0]);
} else if (nadi >= usedang[1] && nadi <= usedang[2]) {
return (usedang[2] - nadi) / (usedang[2] - usedang[1]);
} else if (nadi > usedang[2]) {
return 0;
}
}
float fucepat() {
if (nadi <= ucepat[0]) {
return 0;
} else if (nadi > ucepat[0] && nadi < ucepat[1]) {
return (nadi - ucepat[0]) / (ucepat[1] - ucepat[0]);
} else if (nadi >= ucepat[1]) {
return 1;
}
}
float Min(float a, float b) {
if (a < b) {
return a;
} else if (b < a) {
return b;
} else {
return a;
}
}
void rule() {
minr[1] = Min(fudingin(), fulambat());
Rule[1] = ks;
minr[2] = Min(fudingin(), fusedang());
Rule[2] = ks;
minr[3] = Min(fudingin(), fucepat());
Rule[3] = sakit;
minr[4] = Min(funormal(), fulambat());
Rule[4] = ks;
minr[5] = Min(funormal(), fusedang());
Rule[5] = sehat;
minr[6] = Min(funormal(), fucepat());
Rule[6] = ks;
minr[7] = Min(fupanas(), fulambat());
Rule[7] = ks;
minr[8] = Min(fupanas(), fusedang());
Rule[8] = ks;
minr[9] = Min(fupanas(), fucepat());
Rule[9] = ks;
}
float defuzzyfikasi() {
rule();
A = 0;
B = 0;
for (int i = 1; i <= 9; i++) {
A += Rule[i] * minr[i];
B += minr[i];
}
return A / B;
}
void setup() {
Serial.begin(9600);
}
void loop() {
// Directly use values in variables for temperature (suhu) and pulse (nadi)
// Replace the predefined values above with actual data if needed
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.print("\tNadi: ");
Serial.println(nadi);
float keputusan = defuzzyfikasi();
String msg;
Serial.print("Hasil Keputusan Defuzzyfikasi: ");
Serial.println(keputusan);
if (keputusan == 0) {
msg = "Anda Sakit Korona";
} else if (keputusan == 0.5) {
msg = "Anda Hampir Terkena Korona";
} else if (keputusan == 1) {
msg = "Anda Sehat !!!";
}
Serial.println(msg);
delay(1000); // Delay to simulate the sensor read interval
}