BAB V KESIMPULAN
5.2 Saran
Penelitian ini masih jauh dari kata sempurna. Oleh karena itu, saran untuk pengembangan penelitian selanjutnya antara lain:
1. Sebaiknya pada sistem fuzzy menggunakan metode mamdani agar nilai yang ingin dikendalikan lebih baik lagi.
46
DAFTAR PUSTAKA
[1] Iswanto,2008, “Design dan Implementasi Sistem Embedded Mikrokontroller ATMega8535 dengan Bahasa Basic”, Yogyakarta, Gava Media.
[2] Indriani, A., Johan, Witanto, Y., Hendra, “Pemanfaatan Sensor Suhu LM 35 Berbasis Microcontroller ATmega 8535 pada Sistem Pengontrolan Temperatur Air Laut Skala Kecil”, Jurnal Rekayasa Mesin, Vol. 5, No.2, Tahun 2014: 183-192. [3] ----,2000, Datasheet LM35, National Semiconduktor.
[4] Yatmiko. T, 2008, Air Conditioning Model With Fuzzy Logic Controler, Tugas Akhir, Jurusan Teknik Elektro, FST, Universitas Sanata Dharma, Yogyakarta. [5] ----,2010, Datasheet 2N4401, On Semiconductor.
[6] Gadaffi. M, 2016, Analisis Perbandingan Metode Tsukamoto dan Mamdani dalam
Optimasi Produksi Barang, Skripsi, Jurusan Matematika, FST, Universitas Islam
47
48 Lampiran 1. Rangkaian perancangan alat
49
Lampiran 2. Hasil Perhitungan Logika fuzzy secara matematis 1. Error[0] dan Delta Error[0]
1. Himpunan Fuzzy a. Error - Sangat Dingin = 100 b. Delta error - Sangat DinginCoe = 100-(0x20)= 100 - DinginCoe = (0x20)= 0 2. Implikasi
a. IF error Sangat Dingin AND delta error Sangat Dingin THEN kecepatan PWM Dianggap Mati.
- µerror Sangat Dingin[0] ∩ µ delta error Sangat Dingin[0] - min(100;100)
- 100
b. IF error Sangat Dingin AND delta error Dingin THEN kecepatan PWM Dianggap Mati.
- µerror Sangat Dingin[0] ∩ µ delta error Dingin[0] - min(100;0)
- 0
3. Komposisi antar aturan
Output PWM
Gambar daerah hasil komposisi 4. Penegasan
𝑍 =(100𝑥64) + (0𝑥64)
100 + 0 = 64
Output PWM yang diihasilakan sebesar 64. 2. Error[20] dan Delta Error[7]
1. Himpunan fuzzy a. Error - Sangat dingin = 300 − (20𝑥25 2 ) = 50 - Dingin = (20𝑥25 2 ) − 200 = 50
50 b. Delta error
- DinginCoe = 200 − (7𝑥20) = 60 - HangatCoe = (7𝑥20) − 100 = 40 2. Implikasi
a. IF error Sangat Dingin AND delta error Dingin THEN kecepatan PWM Dianggap Mati.
- µerror Sangat Dingin[20] ∩ µ delta error Dingin[7] - min(50;60)
- 50
b. IF error Sangat Dingin AND delta error Hangat THEN kecepatan PWM Pelan.
- µerror Sangat Dingin[20] ∩ µ delta error Hangat[7] - min(50;40)
- 40
c. IF error Dingin AND delta error Dingin THEN kecepatan PWM Dianggap Mati.
- µerror Dingin[20] ∩ µ delta error Dingin[7] - min(50;60)
- 50
d. IF error Dingin AND delta error Hangat THEN kecepatan PWM Dianggap Mati.
- µerror Dingin[20] ∩ µ delta error Hangat[7] - min(50;40)
- 40
3. Komposisi antar aturan
Output PWM 4. Penegasan
𝑍 =(50𝑥64) + (40𝑥64) + (50𝑥64) + (40𝑥64)
50 + 40 + 50 + 40 = 64
Output pwm yang dihasilkan sebesar 64.
3. Error[23] dan Delta Error[8] 1. Himpunan fuzzy
51 a. Error - Sangat dingin = 300 − (23𝑥25 2 ) = 12,5 - Dingin = (23𝑥25 2 ) − 200=87,55 b. Delta error - DinginCoe = 200 − (8𝑥20) = 40 - HangatCoe (8𝑥20) − 60 2. Implikasi
a. IF error Sangat Dingin AND delta error Dingin THEN kecepatan PWM Dianggap Mati.
- µerror Sangat Dingin[20] ∩ µ delta error Dingin[7] - min(12,5;40)
- 12,5
b. IF error Sangat Dingin AND delta error Hangat THEN kecepatan PWM Pelan.
- µerror Sangat Dingin[20] ∩ µ delta error Hangat[7] - min(12,5;60)
- 12,5
c. IF error Dingin AND delta error Dingin THEN kecepatan PWM Dianggap Mati.
- µerror Dingin[20] ∩ µ delta error Dingin[7] - min(87,5;40)
- 40
d. IF error Dingin AND delta error Hangat THEN kecepatan PWM Dianggap Mati.
- µerror Dingin[20] ∩ µ delta error Hangat[7] - min(87,5;60)
- 60
3. Komposisi antar aturan
4. Penegasan
𝑍𝑂 =(12,5𝑥64) + (40𝑥64) + (12,5𝑥60) + (60 + 64)
25,16 + 25,16 = 64
52 Lampiran 3. Listing Program
#include <mega8535.h> #include <delay.h> #include <stdio.h> #include <stdlib.h> #include <math.h>
// Alphanumeric LCD Module functions #include <alcd.h>
#asm
.equ __lcd_port=0x15; PORTC #endasm
;
unsigned char sdgn,dgn,hgt,pns,adc,jml_nilteng,jml_nil,suhu,sensor_luar,coa,set_point; unsigned char sdgnCoe,dgnCoe,hgtCoe,pnsCoe;
int ptr0,ptr1,ptr2,ptr3,ptr4,ptr5,ptr6,ptr7,ptr8,ptr9,ptr10,ptr11,ptr12,ptr13,ptr14,ptr15; int nilteng0,nilteng1,nilteng2,nilteng3,nilteng4,nilteng5,nilteng6,nilteng7,nilteng8,nilteng9,nilteng10,nilteng11,n ilteng12,nilteng13,nilteng14,nilteng15; int tmp,Coe,deff,i,t; float ptr[15]; float nilteng[15]; int nilai_atas,nilai_bawah; /*unsigned char bufzoError[4]; unsigned char bufpbError[4];
unsigned char adc,sensor_luar,sensor_ruang,suhu; char pwm,h_eps,h_epb,max1,max2;
char sensor,error,d_error,last_error,min_in_1,max_in_1,min_in_2,max_in_2,min_out,max_out; char selisih_in_1,selisih_in_2,selisih_pwm;
char eps,epb,d_eps,d_epb,bx,by,bz,pred1,pred2,pred3,pred4,oot,ood,z1,z2,z3,z4,ztot;*/ unsigned char set_point=20;
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void) {{
// Place your code here set_point +=1; delay_ms(200); }
53
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void) {
// Place your code here if (set_point>20){ set_point -=1;
} }
// External Interrupt 2 service routine
interrupt [EXT_INT2] void ext_int2_isr(void) {
// Place your code here
}
#define ADC_VREF_TYPE 0xE0
// Read the 8 most significant bits // of the AD conversion result
unsigned char read_adc(unsigned char adc_input) {
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage delay_us(10);
// Start the AD conversion ADCSRA|=0x40;
// Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10; return ADCH; }
// Declare your global variables here char puf[33];
54
{
// Declare your local variables here
// Input/Output Ports initialization // Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=Out // State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=0
PORTD=0x00; DDRD=0x31;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0 output: Disconnected TCCR0=0x00;
TCNT0=0x00; OCR0=0x00;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 46,875 kHz
55
// Mode: Fast PWM top=0x00FF // OC1A output: Non-Inv. // OC1B output: Non-Inv. // Noise Canceler: Off
// Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0xA1; TCCR1B=0x0C; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x7F; OCR1BH=0x00; OCR1BL=0x3F; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer2 Stopped // Mode: Normal top=0xFF // OC2 output: Disconnected ASSR=0x00;
TCCR2=0x00; TCNT2=0x00; OCR2=0x00;
// External Interrupt(s) initialization // INT0: On
// INT0 Mode: Falling Edge // INT1: On
// INT1 Mode: Falling Edge // INT2: On
// INT2 Mode: Falling Edge GICR|=0xE0;
MCUCR=0x0A; MCUCSR=0x00;
56
GIFR=0xE0;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00;
// USART initialization // USART disabled UCSRB=0x00;
// Analog Comparator initialization // Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 750,000 kHz // ADC Voltage Reference: Int., cap. on AREF // ADC High Speed Mode: Off
// ADC Auto Trigger Source: ADC Stopped // Only the 8 most significant bits of // the AD conversion result are used ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x84; SFIOR&=0xEF; // SPI initialization // SPI disabled SPCR=0x00; // TWI initialization // TWI disabled TWCR=0x00; // Alphanumeric LCD initialization // Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTC Bit 0
// RD - PORTC Bit 1 // EN - PORTC Bit 2
57 // D4 - PORTC Bit 4 // D5 - PORTC Bit 5 // D6 - PORTC Bit 6 // D7 - PORTC Bit 7 // Characters/line: 16 lcd_init(16);
// Global enable interrupts #asm("sei") while (1) { adc=read_adc(0); suhu=read_adc(1); sensor_luar=suhu; if (set_point<=tmp){ PORTD.0=1;} else if (set_point>tmp){ PORTD.0=0;} tmp=adc; Coe=adc-15; //fuzzyfikasi error
if(tmp<=16) //tmp=temperatur terukur { sdgn=100; //sdgn=sangat dingin dgn=0; //dgn=gingin hgt=0; //hgt=hangat pns=0; //pns=panas }
else if(tmp>16 && tmp<=24) { sdgn=300-((float)(tmp*25)/2); dgn=((float)(tmp*25)/2)-200; hgt=0; pns=0; }
else if(tmp>24 && tmp<=32) {
sdgn=0;
58
hgt=((float)(tmp*25)/2)-300; pns=0;
}
else if(tmp>32 && tmp<=40) { sdgn=0; dgn=0; hgt=500-((float)(tmp*25)/2); pns=((float)(tmp*25)/2)-400; } else { sdgn=0; dgn=0; hgt=0; pns=100;
}// Place your code here //fuzzyfikasi Coerror
if(Coe<=5) //sigm=jumlah orang { sdgnCoe=100-(Coe*20); //sdk=sedikit dgnCoe=(Coe*20); //sdg=sedang hgtCoe=0; //byk=banyak pnsCoe=0; //fll=full }
else if(Coe>5 && Coe<=10) { sdgnCoe=0; dgnCoe=200-(Coe*20); hgtCoe=(Coe*20)-100; pnsCoe=0; }
else if(Coe>10 && Coe<=15) { sdgnCoe=0; dgnCoe=0; hgtCoe=300-(Coe*20); pnsCoe=(Coe*20)-200; } else
59 { sdgnCoe=0; dgnCoe=0; hgtCoe=0; pnsCoe=100; } // base ruller if(sdgnCoe<sdgn) {ptr0=sdgnCoe;nilteng0=64;} else {ptr0=sdgn;nilteng0=64;} if(sdgnCoe<dgn) {ptr1=sdgnCoe;nilteng1=64;} else {ptr1=dgn;nilteng1=64;} if(sdgnCoe<hgt) {ptr2=sdgnCoe;nilteng2=128;} else {ptr2=hgt;nilteng2=128;} if(sdgnCoe<pns) {ptr3=sdgnCoe;nilteng3=192;} else {ptr3=pns;nilteng3=192;} if(dgnCoe<sdgn) {ptr4=dgnCoe;nilteng4=64;} else {ptr4=sdgn;nilteng4=64;} if(dgnCoe<dgn) {ptr5=dgnCoe;nilteng5=64;} else {ptr5=dgn;nilteng5=64;} if(dgnCoe<hgt) {ptr6=dgnCoe;nilteng6=128;} else
60 {ptr6=hgt;nilteng6=128;} if(dgnCoe<pns) {ptr7=dgnCoe;nilteng7=255;} else {ptr7=pns;nilteng7=255;} if(hgtCoe<sdgn) {ptr8=hgtCoe;nilteng8=64;} else {ptr8=sdgn;nilteng8=64;} if(hgtCoe<dgn) {ptr9=hgtCoe;nilteng9=64;} else {ptr9=dgn;nilteng9=64;} if(hgtCoe<hgt) {ptr10=hgtCoe;nilteng10=192;} else {ptr10=hgt;nilteng10=192;} if(hgtCoe<pns) {ptr11=hgtCoe;nilteng11=255;} else {ptr11=pns;nilteng11=255;} if(pnsCoe<sdgn) {ptr12=pnsCoe;nilteng12=64;} else {ptr12=sdgn;nilteng12=64;} if(pnsCoe<dgn) {ptr13=pnsCoe;nilteng13=128;} else {ptr13=dgn;nilteng13=128;} if(pnsCoe<hgt) {ptr14=pnsCoe;nilteng14=192;} else
61 {ptr14=hgt;nilteng14=192;} if(pnsCoe<pns) {ptr15=pnsCoe;nilteng15=255;} else {ptr15=pns;nilteng15=255;} nilai_bawah=ptr0+ptr1+ptr2+ptr3+ptr4+ptr5+ptr6+ptr7+ptr8+ptr9+ptr10+ptr11+ptr12+ptr13+ptr14+ptr15; nilai_atas=(ptr0*nilteng0)+(ptr1*nilteng1)+(ptr2*nilteng2)+(ptr3*nilteng3)+(ptr4*nilteng4)+(ptr5*nilteng5) +(ptr6*nilteng6)+(ptr7*nilteng7)+(ptr8*nilteng8) +(ptr9*nilteng9)+(ptr10*nilteng10)+(ptr11*nilteng11)+(ptr12*nilteng12)+(ptr13*nilteng13)+(ptr14*nilteng1 4)+(ptr15*nilteng15); coa=(nilai_atas/nilai_bawah); OCR1A=coa; lcd_gotoxy(0,0); sprintf(puf,"SD:%d",adc); lcd_puts(puf); lcd_gotoxy(015,0); sprintf(puf,":%d",Coe); lcd_puts(puf); lcd_gotoxy(8,0); sprintf(puf,"SL:%d",suhu); lcd_puts(puf); lcd_gotoxy(0,1); sprintf(puf,"SP:%d",set_point); lcd_puts(puf); lcd_gotoxy(10,1); sprintf(puf,"P:%d",OCR1A); lcd_puts(puf); } }