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,
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!
Terimakasih bang dukunganya 🙂
sukses terus juga bang 🙂
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
mamdani, max min, COA, semoga terjawab
Makasih bg
Untuk nilai pwmnya apakah akan berubah terus?
kak, sekalian dengan rangkaian arduinonya don kak.
pengen dipelajarin
rangkaian arduino nya seperti mengontrol driver motor saja
permisi bang nilai (dingin*50) darimana ya?
dari rumus nya, lihat bagian fuzifikasi
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
logika fuzzy ini apa bisa diimplementasikan pada alat penyemprotan disinfektan?
bisa
mantap gan artikel tutorial fuzzynya dari awal sampai akhir mudah di pahami, sangat membantu.
Terimakasih