By | 08/06/2020

Hello sahabat anak kendali.
Pada kesempatan kali ini saya akan melanjutkan Artikel tentang Arduino, Tutorial Fuzzy Logic Controller dengan Arduino (Defuzzifikasi). 
sebelumnya kita sudah membahas Tutorial Fuzzy dengan Arduino, bagian Fuzifikasi dan Rule, dan di artikel rule termasuk juga inferensi fuzzy.
dan kali ini kita akan melanjutkan Tutorial Fuzzy dengan Arduino tahap akhir yaitu Defuzzifikasi.
jika kalian belum membaca Artikel Tutorial Fuzzy Sebelumnya, silahkan di baca dulu Arduino, Tutorial Fuzzy Logic Controller dengan Arduino (Rule)

Arduino, Tutorial Fuzzy Logic Controller dengan Arduino (Defuzzifikasi)

Adapaun metode defuzzifikasi yang paling umum adalah Center of Area (COA) dan Mean of Maximum (MOM)
baca juga : Contoh Tutorial Aplikasi Fuzzy logic untuk Kontrol Air Heater Arduino
adapun persemaan dengan metode COA jika diskrit maka sebagai berikut :

Untuk metode COA kontinyu persamaan nya sebagai berikut :

Dan untuk metode MOM persamaan nya sebagai berikut :

Adapun pada artikel ini saya menggunakan defuzzifikasi dengan metode COA diskrit.
Pada bagian Tutorial Fuzzy bagian rule kita sudah mendapatkan nilai untuk masing masing rule nya. jika lupa silahkan di buka lagi halaman  Arduino, Tutorial Fuzzy Logic Controller dengan Arduino (Rule)   sehingga berdasarkan rumus COA diskrit diatas rumus menghitung Defuzifikasi bisa kita tulis sebagai berikut :   Output Defuzifikasi = ((rule1*dingin) + (rule2a*hangat) + (rule2b*hangat) + (rule3*panas)) / (dingin+hangat+hangat+panas)  

Code Defuzzyfikasi Arduino

program lengkapnya Tutorial Fuzzy Logic dengan Arduino sebagai berikut :    

float suhu, pwm, out;
float dingin,hangat,panas;
float Lambat,Sedang,Cepat;
float rule1, rule2a, rule2b, rule3;
unsigned char suhuDingin(){
  if (suhu <= 30){dingin =1;}
  else if (suhu >=30 && suhu <=45){dingin=(45-suhu)/15;}
  else if (suhu >= 45){dingin =0;}
  return dingin;
}
unsigned char suhuHangat(){
  if (suhu <= 30){hangat =0;}
  else if (suhu >=30 && suhu <=45){hangat=(suhu-30)/15;}
  else if (suhu >=45 && suhu <=60){hangat=(60-suhu)/15;}
  else if (suhu >= 60){hangat =0;}
  return hangat;
}
unsigned char suhuPanas (){
  if (suhu <=45 ){panas =0;}
  else if (suhu >=45 && suhu <=60){panas=(suhu-45)/15;}
  else if (suhu >= 60){panas =1;}
  return panas;
}
unsigned char pwmLambat(){
  if (pwm <= 100){Lambat =1;}
  else if (pwm >=100 && pwm <=150){Lambat=(150-pwm)/50;}
  else if (pwm >= 150){Lambat =0;}
  return Lambat;
}
unsigned char pwmSedang(){
  if (pwm <= 100){Sedang =0;}
  else if (pwm >=100 && pwm <=150){Sedang=(pwm-100)/50;}
  else if (pwm >=150 && pwm <=200){Sedang=(200-pwm)/50;}
  else if (pwm >= 200){Sedang =0;}
  return Sedang;
}
unsigned char pwmCepat (){
  if (pwm <= 100){Lambat =1;}
  else if (pwm >=150 && pwm <=200){Cepat=(pwm-150)/50;}
  else if (pwm >= 200){Cepat =0;}
  return Cepat;
}
//Fuzzifikasi
void fuzzifikasi(){
  suhuDingin();
  suhuHangat();
  suhuPanas();
  pwmLambat();
  pwmSedang();
  pwmCepat();
}
// Rule
void fuzzy_rule (){
  fuzzifikasi();
// jika suhu dingin maka motor lambat
rule1 = 150 - (dingin*50);
// jika suhu hangat maka motor sedang
rule2a = 100 + (hangat*50);
rule2b = 200 - (hangat*50);
// jika suhu panas maka motor cepat
rule3 = 150 + (panas*50);
//defuzifikasi
out = ((rule1*dingin) + (rule2a*hangat) + (rule2b*hangat) + (rule3*panas)) / (dingin+hangat+hangat+panas);
}
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
suhu = 32; // contoh kita memasukan nilai suhu 54 derajat
fuzzy_rule(); // memanggil fungsi fuzzifikasi untuk menghitung keanggotaan masing2 variable
Serial.print("dingin : ");
Serial.print(dingin);
Serial.print("t");
Serial.print("hangat : ");
Serial.print(hangat);
Serial.print("t");
Serial.print("panas : ");
Serial.println(panas);
Serial.print("Rule1 : ");
Serial.println(rule1);
Serial.print("Rule2a : ");
Serial.println(rule2a);
Serial.print("Rule2b : ");
Serial.println(rule2b);
Serial.print("Rule3 : ");
Serial.println(rule3);
Serial.print("Hasil DeFuzzy: ");
Serial.println(out);
}
void loop() {
  // put your main code here, to run repeatedly:
}

hasil nya dapat dilihat pada gambar di bawah ini :

Arduino, Tutorial Fuzzy Logic Controller dengan Arduino (Defuzzifikasi)

Maksud dari gambar di atas adalah jika kita memberikan masukan berupa suhu 32 derajat maka suhu dianggap dingin dengan keanggotaan 0.87 dan dianggap hangat dengan keanggotaan 0.13. Sedangkan untuk panas keanggotaan nya 0.00 yang artinya suhu sama sekali tidak panas. maka PWM yang di keluarkan senilai 116. Hasil ini semua berdasarkan himpunan fuzzy yang kita buat, (Lihat Tutorial Fuzzy Bagian Fuzzifikasi ).

Jadi silahkan bisa disesuaikan sendiri himpunan fuzzy nya dengan bebas, tidak ada aturan yang pasti, yang terpenting kita punya alasanya, dan saya membuat tutorial ini hanya sebagai contoh, Membuat Pengendali Kipas Angin dengan Logika Fuzzy.

Bila ada kekeliruan atau kesalahan silahkan beri saya masukan, karena saya juga masih belajar dan akan terus belajar. ataupun jika ada pertanyaan silahkan tulis semua di komentar. dan jika bermanfaat silahkan di share artikel nya.

Keyword

  • Rumus Defuzzyfikasi,
  • Defuzzyfikasi centeroid,
  • Fuzzy Center Of Gravity,
  • Tutorial Fuzzy Arduino,
  • Arduino Fuzzy Logic,
  • Arduino Fuzzy,
  • Fuzzy Arduino,
  • Fuzzy Logic Controller,

18 Replies to “Tutorial Fuzzy Logic Controller dengan Arduino (Defuzzifikasi)”

  1. Muhammad Deny Pradana

    Hi Anam. Ini Bang Deny kakak tingkatmu kuliah dulu.
    Wah aku kagum sama peningkatanmu Nam. Beberapa dari proyekmu bahkan udh layak utk dijadikan TA, tinggal ditambahin dikit2 lg. Tetap maju ya Nam dan jd orang yg rendah hati. Yakin aku kamu bisa jd orang besar nantinya.

    Oya dulu kamu sempat minta ajarin PLC tp gak sempat ya. Maap ya Nam, dr jaman kuliah sampai aku udh kerja gak sempat ngajarin kamu tp kyknya kamu udh ngerti bgt skrg dan lebih jago dari aku. So it doesnt really matter right now ?

    Terus maju ya. Semoga sukses!

    Reply
  2. Chaerul Anam

    Kalo ini fuzzy logic open loop untuk yang closed loop silahkan liat artikel terbaru tentang fuzzy for control air heater.

    Reply
  3. otong

    ini dari awal sampe akhir untuk proses Inferensi nya pake metode apa bang ? mamdani, sugeno atau tsukamoto ?
    didalam metode yang dipilih proses inferensi nya pake Max-min atau probor atau sum bang ?
    dan untuk penarikan kesimpulan defuzzifikasi nya pake CenterOfArea, bisektor, LOM, dll ?

    terimakasih bg

    Reply
    1. admin Post author

      mamdani, max min, COA, semoga terjawab

      Reply
  4. siti

    kak, sekalian dengan rangkaian arduinonya don kak.
    pengen dipelajarin

    Reply
    1. herul Post author

      rangkaian arduino nya seperti mengontrol driver motor saja

      Reply
    1. herul Post author

      dari rumus nya, lihat bagian fuzifikasi

      Reply
  5. Nugroho

    proses fuzzifikasi , pemberian rule dan defuzzifikasi apa tidak membutuhkan library tambahan?

    Reply
    1. herul Post author

      tidak gan, library itu isinya ya program, kalo kita bisa bikin program sendiri ya ga perlu library

      Reply
      1. Nugroho

        oke gan terimakasi,
        float suhu, pwm, out;
        untuk code diatas , prsoalannya saya kan menggunakan sensorwarna , nah dia punya 3 parameter, saya mau ambil redValue,greenValue dan blueValue nya
        apa lebih baik proses fuzzifikasi, pemberian rule dan defuzzifikasi saya letakkan di void loop persis setelah code pengambilan data dr sensor di bawah ini

        redPW = getRedPW();
        // Map to value from 0-255
        redValue = map(redPW, redMin,redMax,255,0);
        // Delay to stabilize sensor
        delay(200);

        atau lebih baik tetap di letakkan di atas void setup

        terimakasi gan sebelumnya

        Reply
  6. dwig

    logika fuzzy ini apa bisa diimplementasikan pada alat penyemprotan disinfektan?

    Reply
  7. wildan

    mantap gan artikel tutorial fuzzynya dari awal sampai akhir mudah di pahami, sangat membantu.
    Terimakasih

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *