Jumat, 26 April 2013

Contoh Logika Fuzzy



APLIKASI FUZZY LOGIC UNTUK PENGENDALI PENERANGAN RUANGAN BERBASIS 
                                                  MIKROKONTROLER ATMEGA8535


Ø Program dan Penjelasannya

Perangkat lunak yang digunakan untuk membuat program mikrokontroler yaitu CodeVision AVR C Compiler dengan menggunakan bahasa C. Selanjutnya program ini disimpan dalam memori data dan memori program.

Inisialisasi sistem ATmega8353. Pada CodeWizardAVR dilakukan pengaturan Port A sebagai input ADC, Port B sebagai output lampu, Port C sebagai output LCD, sedangkan Port D sebagai input zero crossing detector, switch 0 dan switch 1. Timers yang digunakan adalah Timer2 dengan mode normal top = FFh dan clock value 4 MHz. Dalam pemrograman digunakan variabel-variabel sebagai berikut:



void r3(void)
{
GPR3=SDR3=TRR3=0;
mu_gpr3=mu_sdr3=mu_trr3=0;
// GELAP
mu=(127-ldr[x])*10;
if (ldr[x]>127) {mu=0;};
mu=mu/127;
if (mu>0) {
GPR3=1;
mu_gpr3=mu;
};

// SEDANG
if (ldr[x]<128) {
mu=(ldr[x]*10)/127;
if (mu>0) {
SDR3=1;
mu_sdr3=mu;
}
}

// TERANG
else {
mu=((255-ldr[x])*10)/128;
if (mu>0) {
SDR3=1;
mu_sdr3=mu;
}
mu=((ldr[x]-127)*10)/128;
if (mu>0) {
TRR3=1;
mu_trr=mu;
};
};
}
Sedangkan untuk membaca besarnya sinyal dari LDR 0, LDR 2, dan LDR 4 dalam program dituliskan sebagai berikut:
ldr[x+1]=read_adc(x+1);
r5();
Sinyal-sinyal tersebut selanjutnya difuzzifikasi Berikut adalah penerjemahan derajad keanggotaan input r5 (Gambar 3.13) kedalam bahasa pemrograman Atmega8535.
void r5(void)
{
unsigned char y;
y=x+1;
GPR5= AGR5= RRR5= ATR5= TRR5= 0;
mu_gpr5= mu_agr5= mu_rrr5= mu_atr5= mu_trr5= 0;

// GELAP
if (ldr[y]<=64) {
mu=((64-ldr[y])*10)/64;
if (mu>0) {
GP=1; mu_gp=mu;
}

// AGAK GELAP
mu=(ldr[y]*10)/64;
if (mu>0) {
AG=1; mu_ag=mu;
}
}
if (ldr[y]>64 && ldr[y]<=128) {
mu=((128-ldr[y])*10)/64;
if (mu>0) {
AG=1; mu_ag=mu;
}

// REMANG-REMANG
mu=((ldr[y]-64)*10)/64;
if (mu>0) {
RR=1; mu_rr=mu;
}
}
if (ldr[y]>128 && ldr[y]<=192) {
mu=((192-ldr[y])*10)/64;
if (mu>0) {
RR=1; mu_rr=mu;
}

// AGAK TERANG
mu=((ldr[y]-128)*10)/64;
if (mu>0) {
AT=1; mu_at=mu;
}
}
if (ldr[y]>192) {
mu=((255-ldr[y])*10)/64;
if (mu>0)  {
AT=1; mu_at=mu;
}

//TERANG
mu=((ldr[y]-192)*10)/64;
if (mu>0) {
TR=1; mu_tr=mu;
     }
  }
}   

Setelah input difuzzifikasi kemudian dilakukan evaluasi aturan (inferensi) menggunakan basis aturan yang telah dirancang. Output yang diperoleh dari inferensi selanjutnya didefuzzifikasi untuk mendapatkan output dalam bentuk nilai tegas. Penerj emahan derajad keanggotaan output, basis aturan, dan defuzzifikasi kedalam bahasa pemrogramn Atmega8535 adalah sebagai berikut:
// Global variables
char buf[33];
// Variabel fungsi keanggotaan input
unsigned int mu, mu_gpr3, mu_sdr3, mu_trr3, mu_gpr5, mu_agr5,
mu_rrr5, mu_atr5, mu_trr5,
GPR3, SDR3, TRR3, GPR5, AGR5, RRR5, ATR5, TRR5,
ldr[6], xx;
long int ot[6];
unsigned char room, rom, flg, x, out_fuz[6];
// Variabel fungsi keanggotaan output
unsigned int mu_pdot, mu_atot, mu_rdot, mu_srot, mu_trot;
Program dimulai dengan inisialisasi variabel awal pada menu utama:
void main(void)
{
unsigned char j;
xx=flg=0;
room=0;
x=0;
ot[0]=ot[1]=ot[2]=0;

Selanjutnya LCD akan menampilkan informasi nama alat dan identitas pembuat, dalam pemrograman dituliskan sebagai berikut:
#asm("cli") // Global disable interrupts
lcd_init(16); // LCD module initialization
lcd_gotoxy(0,0); lcd_putsf(" KENDALI LAMPU");
lcd_gotoxy(0,1); lcd_putsf("dgn LOGIKA FUZZY"); delay_ms(1500);
lcd_clear();
#asm("sei") // Global enable interrupts
while (1)
{
lcd_gotoxy(0,0); lcd_putsf(" D E D Y ");
lcd_gotoxy(0,1); lcd_putsf("== U N D I K S H A ==");
Proses pengendalian dimulai apabila switch 1 ditekan
j=0;
while (PIND.7==1) {}
while (PIND.7==0) {}
while (j==0) {
if (PIND.7==0) {j=1;};

Untuk membaca besarnya sinyal dari LDR 0, LDR 2, dan LDR 4 dalam
program dituliskan sebagai berikut
ldr[x]=read_adc(x);
r3();
Sinyal-sinyal tersebut selanjutnya difuzzifikasi. Berikut adalah penerjemahan derajad keanggotaan input r3 (Gambar 3.8) kedalam bahasa pemrograman Atmega8535.
void r3(void)
{
GPR3=SDR3=TRR3=0;
mu_gpr3=mu_sdr3=mu_trr3=0;

// GELAP
mu=(127-ldr[x])*10;
if (ldr[x]>127) {mu=0;};
mu=mu/127;
if (mu>0) {
GPR3=1;
mu_gpr3=mu;
};

// SEDANG
if (ldr[x]<128) {
mu=(ldr[x]*10)/127;
if (mu>0) {
SDR3=1;
mu_sdr3=mu;
}
}

// TERANG
else {
mu=((255-ldr[x])*10)/128;
if (mu>0) {
SDR3=1;
mu_sdr3=mu;
}
mu=((ldr[x]-127)*10)/128;
if (mu>0) {
TRR3=1;
mu_trr=mu;
};
};
}
Sedangkan untuk membaca besarnya sinyal dari LDR 0, LDR 2, dan LDR 4 dalam program dituliskan sebagai berikut:
ldr[x+1]=read_adc(x+1);
r5();
Sinyal-sinyal tersebut selanjutnya difuzzifikasi Berikut adalah penerjemahan derajad keanggotaan input r5 (Gambar 3.13) kedalam bahasa pemrograman Atmega8535.
void r5(void)
{
unsigned char y;
y=x+1;
GPR5= AGR5= RRR5= ATR5= TRR5= 0;
mu_gpr5= mu_agr5= mu_rrr5= mu_atr5= mu_trr5= 0;

// GELAP
if (ldr[y]<=64) {
mu=((64-ldr[y])*10)/64;
if (mu>0) {
GP=1; mu_gp=mu;
}

// AGAK GELAP
mu=(ldr[y]*10)/64;
if (mu>0) {
AG=1; mu_ag=mu;
}
}
if (ldr[y]>64 && ldr[y]<=128) {
mu=((128-ldr[y])*10)/64;
if (mu>0) {
AG=1; mu_ag=mu;
}

// REMANG-REMANG
mu=((ldr[y]-64)*10)/64;
if (mu>0) {
RR=1; mu_rr=mu;
}
}
if (ldr[y]>128 && ldr[y]<=192) {
mu=((192-ldr[y])*10)/64;
if (mu>0) {
RR=1; mu_rr=mu;
}

// AGAK TERANG
mu=((ldr[y]-128)*10)/64;
if (mu>0) {
AT=1; mu_at=mu;
}
}
if (ldr[y]>192) {
mu=((255-ldr[y])*10)/64;
if (mu>0) {
AT=1; mu_at=mu;
}

//TERANG
mu=((ldr[y]-192)*10)/64;
if (mu>0) {
TR=1; mu_tr=mu;
}
}
}



REFERENSI

elearning.upnjatim.ac.id/courses/KECERDASANBUATAN/work/50b7295411669aplikasi-fuzzy-logic-untuk-pengendali-penerangan-ruangan-berbasis-mikrokontroler-atmega8535_(1).doc ( Diakses Tanggal 28 Maret 2013 pukul 22.15 WIB).