Artikel : Kipas Adaptif Menggunakan ATmega16 dengan Sensor Suhu LM35 dan Sensor PIR pada Proteus
Judul : Kipas Adaptif Menggunakan ATmega16 dengan Sensor Suhu LM35 dan Sensor PIR pada Proteus
Kipas Adaptif Menggunakan ATmega16 dengan Sensor Suhu LM35 dan Sensor PIR pada Proteus
Artikel Tugas Kuliah, Assalamu'alaikum Wr. Wb. pada kesempatan ini saya ingin membagikan tutorial membuat rangkaian kipas otomatis menggunakan ATmega16 dengan sensor suhu LM35 dan sensor PIR HC-SR501 yang diprogram dengan bahasa C pada CV AVR dan desain rangkaiannya menggunakan ISIS Proteus.
Rangkaian ini terdapat 4 buah kipas yang terhubung dengan sumber AC, 4 buah relai berfungsi untuk mengaktifkan dan mematikan setiap kipas secara otomatis, 4 buah sensor suhu LM35 di setiap kipas untuk mengukur suhu sekitarnya. Kipas otomatis ini akan bekerja jika kedapatannya obyek (manusia) yang melewati daerah jangkauan sensor PIR dan suhu ruang sekitarnya di atas 27oC. Selain itu terdapat LCD karakter 16x2 yang digunakan untuk memantau suhu yang terdeteksi pada tiap sensor suhunya.
Oke langsung saja ke tahap-tahap pembuatannya sebagai berikut.
Oke langsung saja ke tahap-tahap pembuatannya sebagai berikut.
- Buka Program CodeVision AVR-nya, kemudian klik menu "File" → pilih "New".
- Pada jendela pop up "Create New File" pilih "Project" kemudian klik OK.
- Kemudian akan muncul jendela CodeWizardAVR pilih tipe chip AVR yang atas.
- Sesudah itu tampil jendela seperti berikut. Pilih Tab Chip kemudian pilih jenis ATmega-nya (di tutorial rangkaian ini menggunakan ATmega16) dan atur clock-nya (di sini 8 MHz).
- Klik Tab Ports → Pilih Subtab Port B kemudian konfigurasikan seperti ini.
- Masih pada Tab Ports → Pilih Subtab Port D kemudian atur seperti berikut.
- Setelah itu klik Tab Alphanumeric LCD untuk mengaktifkan LCD karakter, kemudian konfigurasikan pada PORT C seperti pada gambar.
- Selanjutnya kembali pada Subtab Port C atur pada PORTC.3-nya seperti ini.
- Klik Tab ADC untuk mengaktifkan ADC pada Port A, kemudian centang "ADC Enabled".
- Setelah semuanya selesai di-setting klik menu "Program" → kemudian pilih "Generate, Save and Exit" seperti pada tampilan berikut. Kemudian akan diminta menyimpan file berformat *.cwp, *.c dan *.prj. Simpan dengan nama yang sama pada satu folder yang mudah diingat.
- Lalu lengkapi programnya seperti di bawah ini.
- /*****************************************************
- This program was produced by the
- CodeWizardAVR V2.05.3 Standard
- Automatic Program Generator
- © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
- http://www.hpinfotech.com
- Project : Kipas Adaptif
- Version : 1.2
- Date : 17/03/2019
- Author : Vidi Fitriansyah Hidarlan
- Company : Personal
- Comments:
- Kelompok 3 Protek :
- Aida Wahyumi (H1A016040)
- Vidi Fitriansyah Hidarlan (H1A016042)
- Raditya Probo Sasmoko (H1A016045)
- Chip type : ATmega16
- Program type : Application
- AVR Core Clock frequency: 8,000000 MHz
- Memory model : Small
- External RAM size : 0
- Data Stack size : 256
- *****************************************************/
- #include <mega16.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <delay.h>
- // Alphanumeric LCD functions
- #include <alcd.h>
- int indeks=1;//untuk menampilkan judul saat awal program dijalankan
- float SUHU1,SUHU2,SUHU3,SUHU4,suhu_celcius1,suhu_celcius2,suhu_celcius3,suhu_celcius4;
- char data1[16];
- char data2[16];
- char data3[16];
- char data4[16];
- #define ADC_VREF_TYPE 0x00
- // Read the AD conversion result
- unsigned int 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 ADCW;
- }
- // Declare your global variables here
- void sensor_suhu1()
- {
- long datamaks1=SUHU1;
- int data_suhu1;
- for (data_suhu1=0;data_suhu1<=100;data_suhu1++)//sampling 100x
- {
- SUHU1 = read_adc(0);
- if(SUHU1>datamaks1)//mengambil nilai maksimal dari hasil sampling 100x
- {
- datamaks1 = SUHU1;
- }
- delay_us(100);
- }
- suhu_celcius1 = datamaks1*510/1023;//rumus konversi read_adc() ke celcius dengan tegangan referensi 5V
- if (suhu_celcius1>44)
- {
- suhu_celcius1 = suhu_celcius1-1;//koreksi karakteristik sensor LM35 (dari datasheet)
- }
- datamaks1=0;
- }
- void sensor_suhu2()
- {
- long datamaks2=SUHU2;
- int data_suhu2;
- for (data_suhu2=0;data_suhu2<=100;data_suhu2++)
- {
- SUHU2 = read_adc(1);
- if(SUHU2>datamaks2)
- {
- datamaks2 = SUHU2;
- }
- delay_us(100);
- }
- suhu_celcius2 = datamaks2*510/1023;
- if (suhu_celcius2>44)
- {
- suhu_celcius2 = suhu_celcius2-1;
- }
- datamaks2=0;
- }
- void sensor_suhu3()
- {
- long datamaks3=SUHU3;
- int data_suhu3;
- for (data_suhu3=0;data_suhu3<=100;data_suhu3++)
- {
- SUHU3 = read_adc(2);
- if(SUHU3>datamaks3)
- {
- datamaks3 = SUHU3;
- }
- delay_us(100);
- }
- suhu_celcius3 = datamaks3*510/1023;
- if (suhu_celcius3>44)
- {
- suhu_celcius3 = suhu_celcius3-1;
- }
- datamaks3=0;
- }
- void sensor_suhu4()
- {
- long datamaks4=SUHU4;
- int data_suhu4;
- for (data_suhu4=0;data_suhu4<=100;data_suhu4++)
- {
- SUHU4 = read_adc(3);
- if(SUHU4>datamaks4)
- {
- datamaks4 = SUHU4;
- }
- delay_us(100);
- }
- suhu_celcius4 = datamaks4*510/1023;
- if (suhu_celcius4>44)
- {
- suhu_celcius4 = suhu_celcius4-1;
- }
- datamaks4=0;
- }
- void tombol()
- {
- if (indeks==1)
- {
- lcd_gotoxy(0,0);
- lcd_putsf("Kipas Adaptif");
- lcd_gotoxy(0,1);
- lcd_putsf("(Otomatis)");
- delay_ms(300);
- indeks=2;
- }
- else if (PINC.3==0 && indeks==2)
- {
- indeks=3;
- delay_ms(100);
- }
- else if (PINC.3==0 && indeks==3)
- {
- indeks=2;
- delay_ms(100);
- }
- /*else
- {
- indeks=1;
- }*/
- }
- void kipas1()
- {
- if (suhu_celcius1>27 && PIND.0==1 && (indeks==2||indeks==3))
- {
- PORTB.0=1;
- //delay_ms(1000);
- }
- else
- {
- PORTB.0=0;
- }
- }
- void kipas2()
- {
- if (suhu_celcius2>27 && PIND.1==1 && (indeks==2||indeks==3))
- {
- PORTB.1=1;
- //delay_ms(1000);
- }
- else
- {
- PORTB.1=0;
- }
- }
- void kipas3()
- {
- if (suhu_celcius3>27 && PIND.2==1 && (indeks==2||indeks==3))
- {
- PORTB.2=1;
- //delay_ms(1000);
- }
- else
- {
- PORTB.2=0;
- }
- }
- void kipas4()
- {
- if (suhu_celcius4>27 && PIND.3==1 && (indeks==2||indeks==3))
- {
- PORTB.3=1;
- //delay_ms(1000);
- }
- else
- {
- PORTB.3=0;
- }
- }
- void lcd_display()
- {
- if (indeks==2)
- {
- lcd_clear();
- lcd_gotoxy(0,0);
- lcd_putsf("Suhu 1 : ");
- ftoa(suhu_celcius1,1,data1);
- lcd_gotoxy(8,0);
- lcd_puts(data1);
- lcd_gotoxy(12,0);
- lcd_putchar(0xdf);//menampilkan karakter derajat
- lcd_putsf("C");
- lcd_gotoxy(0,1);
- lcd_putsf("Suhu 2 : ");
- ftoa(suhu_celcius2,1,data2);
- lcd_gotoxy(8,1);
- lcd_puts(data2);
- lcd_gotoxy(12,1);
- lcd_putchar(0xdf);//menampilkan karakter derajat
- lcd_putsf("C");
- delay_ms(100);
- }
- else if (indeks==3)
- {
- lcd_clear();
- lcd_gotoxy(0,0);
- lcd_putsf("Suhu 3 : ");
- ftoa(suhu_celcius3,1,data3);
- lcd_gotoxy(8,0);
- lcd_puts(data3);
- lcd_gotoxy(12,0);
- lcd_putchar(0xdf);//menampilkan karakter derajat
- lcd_putsf("C");
- lcd_gotoxy(0,1);
- lcd_putsf("Suhu 4 : ");
- ftoa(suhu_celcius4,1,data4);
- lcd_gotoxy(8,1);
- lcd_puts(data4);
- lcd_gotoxy(12,1);
- lcd_putchar(0xdf);//menampilkan karakter derajat
- lcd_putsf("C");
- delay_ms(100);
- }
- /*else
- {
- indeks=1;
- }*/
- }
- void main(void)
- {
- // 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=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
- // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
- PORTB=0x00;
- DDRB=0xFF;
- // 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=0x08;
- DDRC=0x00;
- // Port D initialization
- // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
- // State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P
- PORTD=0xFF;
- DDRD=0x00;
- // 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: Timer1 Stopped
- // Mode: Normal top=0xFFFF
- // OC1A output: Discon.
- // OC1B output: Discon.
- // 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=0x00;
- TCCR1B=0x00;
- TCNT1H=0x00;
- TCNT1L=0x00;
- ICR1H=0x00;
- ICR1L=0x00;
- OCR1AH=0x00;
- OCR1AL=0x00;
- OCR1BH=0x00;
- OCR1BL=0x00;
- // 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: Off
- // INT1: Off
- // INT2: Off
- MCUCR=0x00;
- MCUCSR=0x00;
- // Timer(s)/Counter(s) Interrupt(s) initialization
- TIMSK=0x01;
- // 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: 1000,000 kHz
- // ADC Voltage Reference: AREF pin
- // ADC Auto Trigger Source: ADC Stopped
- ADMUX=ADC_VREF_TYPE & 0xff;
- ADCSRA=0x83;
- // SPI initialization
- // SPI disabled
- SPCR=0x00;
- // TWI initialization
- // TWI disabled
- TWCR=0x00;
- // Alphanumeric LCD initialization
- // Connections are specified in the
- // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
- // RS - PORTC Bit 0
- // RD - PORTC Bit 1
- // EN - PORTC Bit 2
- // 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)
- {
- // Place your code here
- tombol();
- sensor_suhu1();
- sensor_suhu2();
- sensor_suhu3();
- sensor_suhu4();
- kipas1();
- kipas2();
- kipas3();
- kipas4();
- lcd_display();
- }
- }
- Sehingga tampilannya seperti pada gambar berikut. Lalu kompilasi untuk mengecek apakah ada kesalahan atau error dan build semua program yang sudah dibuat sebelumnya.
- Selanjutnya buat desain skematik rangkaiannya seperti gambar di bawah ini atau bisa juga di-download desain rangkaian Proteus-nya pada link ini.
- Untuk menambahkan library file Sensor PIR HC-SR501-nya dapat diunduh di sini. Setelah diunduh kemudian diekstrak. Selanjutnya salin kedua file di dalam folder tersebut ke folder "LIBRARY" dari lokasi file instalasi Proteus (biasanya di disk C:). Sebelumnya tutup terlebih dahulu aplikasi ISIS Proteusnya agar file library Sensor PIR dapat dimuat.
- Letakkan atau Paste filenya di "C:\Program Files (x86)\Labcenter Electronics\Proteus 7 Professional\LIBRARY" untuk Windows 64 bit atau "C:\Program Files\Labcenter Electronics\Proteus 7 Professional\LIBRARY" untuk Windows 32 bit.
- Buka kembali ISIS Proteusnya, kemudian klik ikon "Pick from libraries".
- Pada jendela "Pick Devices" ketik kata kunci "pir" → pilih kategori "Arduino" → pilih Device PIR Sensor-nya (jenis PIR Sensor 1,2,3 dan 4 sama saja hanya berbeda tampilan warnanya).
- Sesudah itu double click pada ATmega16 (U1) untuk memasukan program file *.Hex atau *.Coff, caranya seperti pada gambar berikut ini.
- Untuk memilih file *.coff atau *.hex dilakukan dengan klik ikon browse pada "Program File". Kemudian pada pop up window klik file yang sudah di-build lalu klik "Open".
- Setelah itu double click ada Sensor PIR kemudian klik browse untuk memasukkan Program File library dari Sensor PIR HC-SR501 yang berada pada satu folder tadi kemudian klik OK. Lakukan hal yang sama pada 3 Sensor PIR lainnya.
- Pilih file *.hex PIRSensorTEP dari folder yang sudah diekstrak sebelumnya.
- Sesudah selesai membuat seluruh desain rangkaiannya maka klik tombol Play untuk menjalankan simulasi rangkaiannya.
- Berikut fungsi dari tombol push button dan input logika dari tiap sensor PIR.
- Selesai, untuk hasil simulasinya dapat dilihat pada video di bawah ini.
Demikianlah Artikel Kipas Adaptif Menggunakan ATmega16 dengan Sensor Suhu LM35 dan Sensor PIR pada Proteus
Sekian Kipas Adaptif Menggunakan ATmega16 dengan Sensor Suhu LM35 dan Sensor PIR pada Proteus, mudah-mudahan bisa memberi manfaat untuk anda semua.
Anda sedang membaca artikel Kipas Adaptif Menggunakan ATmega16 dengan Sensor Suhu LM35 dan Sensor PIR pada Proteus dan artikel ini url permalinknya adalah https://pawang-bisnis.blogspot.com/2019/10/kipas-adaptif-menggunakan-atmega16.html Semoga artikel ini bisa bermanfaat.
Tag : Tugas Kuliah,