Tutorial Arduino Fuzzy Logic Controller Sugeno

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

chaerul

View Comments

  • Min mau nanya, algoritma fuzzy logic sugeno yang udah saya bikin dapat referensi disini, kok tidak masuk kedalam hasil sensor? saya menggunakan 3 sensor yaitu pH, TDS, dan Turbidity.

  • Om saya mau tanya, program diatas kalau mau di implementasikan ke embedded system berarti tinggal menambahkan sensor dan mengganti variabel inputnya ? Proses fuzzy keseluruhannya sama ?

  • tolong penjelasannya tentang fucepat, fulambat, dsb. itu untuk apa ya min ? apakah itu rumus yang sudah ditetapkan atau bagaimana

Recent Posts

Panduan Lengkap: Cara Menyiapkan Klaster Kubernetes pada Ubuntu 22.04 LTS

Pendahuluan Dalam dunia pengembangan perangkat lunak yang terus berkembang, Kubernetes telah muncul sebagai alat kunci dalam orkestrasi…

2 weeks ago

AplikasiAkademik.com: Solusi Terbaik untuk Manajemen Sekolah yang Efisien

Mengelola sebuah sekolah atau lembaga pendidikan adalah tugas yang kompleks dan penuh tantangan. Dengan berbagai…

7 months ago

Cara Mudah Menginstal OpenVPN Server di Ubuntu 20.04 di Huaweicloud Panduan Langkah demi Langkah

Selamat datang di artikel kami tentang cara menginstal OpenVPN server di Ubuntu 20.04 di HuaweiCloud!…

12 months ago

Install Docker Portainer dan Nginx Proxy Manager Ubuntu Server

Dalam dunia pengembangan aplikasi, salah satu hal yang menjadi penting adalah mengelola dan memonitor kontainer…

1 year ago

Tutorial led blinking lengkap, Wiring & Code

Tutorial led blinking. LED (Light Emitting Diode) merupakan salah satu komponen elektronik yang paling umum…

1 year ago

Tutorial LCD Display Lengkap dengan wiring & code untuk pemula

Tutorial LCD Display, ini merupakan salah satu komponen yang sering digunakan dalam project elektronika sebagai…

1 year ago