Tutorial Arduino Fuzzy Logic Controller Sugeno — {link}
Teman saya satu komunitas dari semarang membuat project terkait fuzzy logic dengan arduino dan metode sugeno, untuk itu saya akan bagikan sedikit penjelasan atau tutorialnya bagaimana cara memprogram code arduino untuk fuzzy logic sugeno.
kasusnya sangat menarik yaitu menentukan keputusan seseorang sehat, setangah sakit atau sakit berdasarkan suhu tubuh dan denyut nadi. jika dikembangkan bisa lebih keren lagi jika ditambah beberapa parameter seperti sp02 atau sensor oxygen dalam darah. selain itu saya pernah membaca ada metode pengecekan gula darah non invasive dengan sensor cahaya.
Jadi jika diterapkan untuk sistem diagnosa awal sangat bermanfaat dalam bidang kesehatan, saya belum bisa mengembangkan sendiri karena memang belum ada supporter atau penyokong dananya. jika kalian punya dana maka penelitian ini bisa dijalankan.
Baiklah kita kembali lagi pada pembahasan mengenai fuzzy logic sugeno untuk mengambil keputusan sehat atau sakitnya seseorang berdasarkan parameter suhu dan denyut nadi.
Berikut saya tampilkan detail projek fuzzy yang menggunakan sugeno.
Dari data yang ada pada gambar gambar di atas kita sudah mendapatkan input data himpunan fuzzy untuk suhu tubuh, denyut nadi kemudian rule nya dan hasil percobaan saat diberikan input nadi = 110, suhu = 19, dan nadi = 60, suhu = 30.
Langsung saja kita akan buat program fuzzynya dengan bahasa C terlebih dahulu supaya bisa mudah langsung mengetahui hasilnya di terminal console.
Karena penjelasan mengenai fuzzy sudah banyak saya bahas, maka disini saya tidak akan menjelaskanya lagi tentang proses perhitungan manual fuzzy logic sugeno, jika anda butuh bantuan saya silahkan hubungi saya langsung melalui email, instagram atau wa.
Program Fuzzy Logic Sugeno dengan Bahasa C
#include <stdio.h>
#include <math.h>
float nadi, suhu;
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()
{
// if suhu dingin and nadi lambat then kurang sehat
minr[1] = Min(fudingin(), fulambat());
Rule[1] = ks;
// if suhu dingin and nadi sedang then kurang sehat
minr[2] = Min(fudingin(), fusedang());
Rule[2] = ks;
// if suhu dingin and nadi cepat then sakit
minr[3] = Min(fudingin(), fucepat());
Rule[3] = sakit;
// if suhu normal and nadi lambat then kurang sehat
minr[4] = Min(funormal(), fulambat());
Rule[4] = ks;
// if suhu normal and nadi sedang then sehat
minr[5] = Min(funormal(), fusedang());
Rule[5] = sehat;
// if suhu normal and nadi cepat then kurang sehat
minr[6] = Min(funormal(), fucepat());
Rule[6] = ks;
// if suhu panas and nadi lambat then kurangg sehat
minr[7] = Min(fupanas(), fulambat());
Rule[7] = ks;
// if suhu panas and nadi sedang then kurang sehat
minr[8] = Min(fupanas(), fusedang());
Rule[8] = ks;
// if suhu panas and nadi cepat then kurang sehat
minr[9] = Min(fupanas(), fucepat());
Rule[9] = ks;
}
float A, B;
float defuzzyfikasi()
{
rule();
A = 0;
B = 0;
for (int i = 1; i <= 9; i++)
{
// printf("Rule ke %d = %f\n", i, Rule[i]);
// printf("Min ke %d = %f\n", i, minr[i]);
A += Rule[i] * minr[i];
B += minr[i];
}
// printf("Hasil A : %f\n", A);
// printf("Hasil B : %f\n", B);
return A / B;
}
int main()
{
printf("Masukan Suhu Badan : ");
scanf("%f", &suhu);
printf("Masukan Denyut : ");
scanf("%f", &nadi);
printf("Keanggotaan udingin : %f\n", fudingin());
printf("Keanggotaan unormal : %f\n", funormal());
printf("Keanggotaan upanas : %f\n", fupanas());
printf("Keanggotaan ulambat : %f\n", fulambat());
printf("Keanggotaan usedang : %f\n", fusedang());
printf("Keanggotaan ucepat : %f\n", fucepat());
printf("Hasil Deff : %f\n", defuzzyfikasi());
return 0;
}
untuk hasilnya silahkan langsung uji coba melalui c compiler online.
Selanjutnya jika sudah selesai membuat nya dengan bahasa C dan hasilnya sudah sesuai dengan simulasi di matlab bisa langsung terapkan fuzzy logic sugeno ke program arduino ide.
Program Arduino Fuzzy Logic Sugeno
#define USE_ARDUINO_INTERRUPTS trueR
#include <PulseSensorPlayground.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
const int PULSE_INPUT = A0; // pin sensor
const int PULSE_FADE = 5;
const int THRESHOLD = 550; // Adjust this number to avoid noise when idle
PulseSensorPlayground pulseSensor;
float nadi, suhu;
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()
{
// if suhu dingin and nadi lambat then kurang sehat
minr[1] = Min(fudingin(), fulambat());
Rule[1] = ks;
// if suhu dingin and nadi sedang then kurang sehat
minr[2] = Min(fudingin(), fusedang());
Rule[2] = ks;
// if suhu dingin and nadi cepat then sakit
minr[3] = Min(fudingin(), fucepat());
Rule[3] = sakit;
// if suhu normal and nadi lambat then kurang sehat
minr[4] = Min(funormal(), fulambat());
Rule[4] = ks;
// if suhu normal and nadi sedang then sehat
minr[5] = Min(funormal(), fusedang());
Rule[5] = sehat;
// if suhu normal and nadi cepat then kurang sehat
minr[6] = Min(funormal(), fucepat());
Rule[6] = ks;
// if suhu panas and nadi lambat then kurangg sehat
minr[7] = Min(fupanas(), fulambat());
Rule[7] = ks;
// if suhu panas and nadi sedang then kurang sehat
minr[8] = Min(fupanas(), fusedang());
Rule[8] = ks;
// if suhu panas and nadi cepat then kurang sehat
minr[9] = Min(fupanas(), fucepat());
Rule[9] = ks;
}
float defuzzyfikasi()
{
rule();
A = 0;
B = 0;
for (int i = 1; i <= 9; i++)
{
// printf("Rule ke %d = %f\n", i, Rule[i]);
// printf("Min ke %d = %f\n", i, minr[i]);
A += Rule[i] * minr[i];
B += minr[i];
}
// printf("Hasil A : %f\n", A);
// printf("Hasil B : %f\n", B);
return A / B;
}
void setup() {
Serial.begin(9600);
// if (!mlx.begin()) {
// Serial.println("Error connecting to MLX sensor. Check wiring.");
// while (1);
// };
Serial.print("Emissivity = "); Serial.println(mlx.readEmissivity());
Serial.println("================================================");
pulseSensor.analogInput(PULSE_INPUT);
pulseSensor.fadeOnPulse(PULSE_FADE);
pulseSensor.setThreshold(THRESHOLD);
// Now that everything is ready, start reading the PulseSensor signal.
// if (!pulseSensor.begin()) {
// /*
// PulseSensor initialization failed,
// likely because our particular Arduino platform interrupts
// aren't supported yet.
//
// If your Sketch hangs here, try PulseSensor_BPM_Alternative.ino,
// which doesn't use interrupts.
// */
// Serial.println("Sensor Nadi Tidak Bekerja, Cek Ulang Wiring!");
// }
}
void loop()
{
//
suhu = mlx.readObjectTempC();
suhu = 19;
nadi = 87;
Serial.print("Suhu : ");
Serial.print(suhu);
Serial.print("\tNadi : ");
Serial.println(nadi);
int myBPM = pulseSensor.getBeatsPerMinute(); // Calls function on our pulseSensor object that returns BPM as an "int".
// "myBPM" hold this BPM value now.
if (pulseSensor.sawStartOfBeat()) { // Constantly test to see if "a beat happened".
Serial.println(myBPM);
// nadi = myBPM;
}
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);
}
Baiklah itu saja yang bisa saya bagikan pada artikel kali ini semoga bermanfaat buat kalian artikel tentang arduino fuzzy sugeno ini, dan jangan lupa jika bermanfaat bagikan artikelnya ke media sosial kalian.
Keyword
- Arduino Fuzzy Sugeno
- Fuzzy logic sugeno arduino
- logika fuzzy sugeno
- fuzzy metode sugeno dengan arduino
- — #ArduinoFuzzyLogic #arduinofuzzylogicsugeno #fuzzysugeno