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.

Kunjungi  Arduino, Cara Mengakses Sensor Air dengan indikator LED

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.

Kunjungi  Tutorial Arduino Membaca RPM Motor dengan Encoder

Keyword

  • Arduino Fuzzy Sugeno
  • Fuzzy logic sugeno arduino
  • logika fuzzy sugeno
  • fuzzy metode sugeno dengan arduino

4 komentar pada “Tutorial Arduino Fuzzy Logic Controller Sugeno

  • Oktober 6, 2021 pada 9:45 am
    Permalink

    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.

    Balas
    • Oktober 12, 2021 pada 1:16 pm
      Permalink

      desain fuzzynya gimana ?

      Balas
  • Oktober 27, 2021 pada 11:56 pm
    Permalink

    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 ?

    Balas
    • Oktober 29, 2021 pada 2:21 am
      Permalink

      kalo desainya sama ya sama, desain fuzzynya beda ya jelas beda

      Balas

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.