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
Tidak ada komentar:
Posting Komentar