Tutorial Fuzzy Logic Controller dengan Arduino (Defuzzifikasi)

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)

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 :

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,

chaerul

View Comments

  • 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!

  • bang permisi masu nanya,jadi nanti kalau suhunya terupdate pwmnya juga ikut update ya?

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

  • 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

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

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

      • 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

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…

1 week 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