Blue Spinning Frozen Snowflake Vidi Fitriansyah Hidarlan's Blog: Kipas Adaptif Menggunakan ATmega16 dengan Sensor Suhu LM35 dan Sensor PIR pada Proteus
WELCOME TO MY BLOG :: Share Tips & Trik Tutorial Gadget dan Tugas Kuliah :: "Indahnya Berbagi"

Rabu, 09 Oktober 2019

Kipas Adaptif Menggunakan ATmega16 dengan Sensor Suhu LM35 dan Sensor PIR pada Proteus

        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.
  1. Buka Program CodeVision AVR-nya, kemudian klik menu "File" → pilih "New".
  2. Pada jendela pop up "Create New File" pilih "Project" kemudian klik OK.
  3. Kemudian akan muncul jendela CodeWizardAVR pilih tipe chip AVR yang atas.
  4. 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).
  5. Klik Tab Ports → Pilih Subtab Port B kemudian konfigurasikan seperti ini.
  6. Masih pada Tab Ports → Pilih Subtab Port D kemudian atur seperti berikut.
  7. Setelah itu klik Tab Alphanumeric LCD untuk mengaktifkan LCD karakter, kemudian konfigurasikan pada PORT C seperti pada gambar.
  8. Selanjutnya kembali pada Subtab Port C atur pada PORTC.3-nya seperti ini.
  9. Klik Tab ADC untuk mengaktifkan ADC pada Port A, kemudian centang "ADC Enabled".
  10. 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.
  11. Lalu lengkapi programnya seperti di bawah ini.
    1. /*****************************************************
    2. This program was produced by the
    3. CodeWizardAVR V2.05.3 Standard
    4. Automatic Program Generator
    5. © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
    6. http://www.hpinfotech.com

    7. Project : Kipas Adaptif
    8. Version : 1.2
    9. Date    : 17/03/2019
    10. Author  : Vidi Fitriansyah Hidarlan
    11. Company : Personal
    12. Comments: 
    13. Kelompok 3 Protek :
    14. Aida Wahyumi (H1A016040)
    15. Vidi Fitriansyah Hidarlan (H1A016042)
    16. Raditya Probo Sasmoko (H1A016045)


    17. Chip type               : ATmega16
    18. Program type            : Application
    19. AVR Core Clock frequency: 8,000000 MHz
    20. Memory model            : Small
    21. External RAM size       : 0
    22. Data Stack size         : 256
    23. *****************************************************/

    24. #include <mega16.h>
    25. #include <stdio.h>
    26. #include <stdlib.h>
    27. #include <delay.h>

    28. // Alphanumeric LCD functions
    29. #include <alcd.h>
    30.     int indeks=1;//untuk menampilkan judul saat awal program dijalankan
    31.     float SUHU1,SUHU2,SUHU3,SUHU4,suhu_celcius1,suhu_celcius2,suhu_celcius3,suhu_celcius4;
    32.     char data1[16];
    33.     char data2[16];
    34.     char data3[16];
    35.     char data4[16];

    36. #define ADC_VREF_TYPE 0x00

    37. // Read the AD conversion result
    38. unsigned int read_adc(unsigned char adc_input)
    39. {
    40. ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    41. // Delay needed for the stabilization of the ADC input voltage
    42. delay_us(10);
    43. // Start the AD conversion
    44. ADCSRA|=0x40;
    45. // Wait for the AD conversion to complete
    46. while ((ADCSRA & 0x10)==0);
    47. ADCSRA|=0x10;
    48. return ADCW;
    49. }

    50. // Declare your global variables here
    51. void sensor_suhu1()
    52. {
    53.     long datamaks1=SUHU1;
    54.     int data_suhu1;
    55.     for (data_suhu1=0;data_suhu1<=100;data_suhu1++)//sampling 100x
    56.     {
    57.         SUHU1 = read_adc(0);
    58.         if(SUHU1>datamaks1)//mengambil nilai maksimal dari hasil sampling 100x
    59.         {
    60.             datamaks1 = SUHU1;
    61.         }
    62.         delay_us(100);
    63.     }
    64.     suhu_celcius1 = datamaks1*510/1023;//rumus konversi read_adc() ke celcius dengan tegangan referensi 5V
    65.     if (suhu_celcius1>44)
    66.     {
    67.         suhu_celcius1 = suhu_celcius1-1;//koreksi karakteristik sensor LM35 (dari datasheet)
    68.     }
    69.     datamaks1=0;    
    70. }
    71. void sensor_suhu2()
    72. {
    73.     long datamaks2=SUHU2;
    74.     int data_suhu2;
    75.     for (data_suhu2=0;data_suhu2<=100;data_suhu2++)
    76.     {
    77.         SUHU2 = read_adc(1);
    78.         if(SUHU2>datamaks2)
    79.         {
    80.             datamaks2 = SUHU2;
    81.         }
    82.         delay_us(100);
    83.     }
    84.     suhu_celcius2 = datamaks2*510/1023;
    85.     if (suhu_celcius2>44)
    86.     {
    87.         suhu_celcius2 = suhu_celcius2-1;
    88.     }
    89.     datamaks2=0;    
    90. }
    91. void sensor_suhu3()
    92. {
    93.     long datamaks3=SUHU3;
    94.     int data_suhu3;
    95.     for (data_suhu3=0;data_suhu3<=100;data_suhu3++)
    96.     {
    97.         SUHU3 = read_adc(2);
    98.         if(SUHU3>datamaks3)
    99.         {
    100.             datamaks3 = SUHU3;
    101.         }
    102.         delay_us(100);
    103.     }
    104.     suhu_celcius3 = datamaks3*510/1023;
    105.     if (suhu_celcius3>44)
    106.     {
    107.         suhu_celcius3 = suhu_celcius3-1;
    108.     }
    109.     datamaks3=0;    
    110. }
    111. void sensor_suhu4()
    112. {
    113.     long datamaks4=SUHU4;
    114.     int data_suhu4;
    115.     for (data_suhu4=0;data_suhu4<=100;data_suhu4++)
    116.     {
    117.         SUHU4 = read_adc(3);
    118.         if(SUHU4>datamaks4)
    119.         {
    120.             datamaks4 = SUHU4;
    121.         }
    122.         delay_us(100);
    123.     }
    124.     suhu_celcius4 = datamaks4*510/1023;
    125.     if (suhu_celcius4>44)
    126.     {
    127.         suhu_celcius4 = suhu_celcius4-1;
    128.     }
    129.     datamaks4=0;    
    130. }
    131. void tombol()
    132. {
    133.    if (indeks==1)
    134.     {
    135.         lcd_gotoxy(0,0);
    136.         lcd_putsf("Kipas Adaptif");
    137.         lcd_gotoxy(0,1);
    138.         lcd_putsf("(Otomatis)");
    139.         delay_ms(300);
    140.         indeks=2;
    141.     }
    142.     else if (PINC.3==0 && indeks==2)
    143.     {
    144.         indeks=3;
    145.         delay_ms(100);
    146.     }
    147.     else if (PINC.3==0 && indeks==3)
    148.     {
    149.         indeks=2;
    150.         delay_ms(100);
    151.     }
    152.     /*else
    153.     {
    154.         indeks=1;
    155.     }*/
    156. }
    157. void kipas1()
    158. {
    159.     if (suhu_celcius1>27 && PIND.0==1 && (indeks==2||indeks==3))
    160.     {
    161.         PORTB.0=1;
    162.         //delay_ms(1000);
    163.     }
    164.     else 
    165.     {
    166.         PORTB.0=0;
    167.     }
    168. }
    169. void kipas2()
    170. {
    171.     if (suhu_celcius2>27 && PIND.1==1 && (indeks==2||indeks==3))
    172.     {
    173.         PORTB.1=1;
    174.         //delay_ms(1000);
    175.     }
    176.     else
    177.     {
    178.         PORTB.1=0;
    179.     }
    180. }
    181. void kipas3()
    182. {
    183.     if (suhu_celcius3>27 && PIND.2==1 && (indeks==2||indeks==3))
    184.     {
    185.         PORTB.2=1;
    186.         //delay_ms(1000);
    187.     }
    188.     else
    189.     {
    190.         PORTB.2=0;
    191.     }
    192. }
    193. void kipas4()
    194. {
    195.     if (suhu_celcius4>27 && PIND.3==1 && (indeks==2||indeks==3))
    196.     {
    197.         PORTB.3=1;
    198.         //delay_ms(1000);
    199.     }
    200.     else
    201.     {
    202.         PORTB.3=0;
    203.     }
    204. }
    205. void lcd_display()
    206. {
    207.     if (indeks==2)
    208.     {
    209.         lcd_clear();
    210.         lcd_gotoxy(0,0);
    211.         lcd_putsf("Suhu 1 :   ");
    212.         ftoa(suhu_celcius1,1,data1);
    213.         lcd_gotoxy(8,0);
    214.         lcd_puts(data1);
    215.         lcd_gotoxy(12,0);
    216.         lcd_putchar(0xdf);//menampilkan karakter derajat
    217.         lcd_putsf("C");
    218.         lcd_gotoxy(0,1);
    219.         lcd_putsf("Suhu 2 :   ");
    220.         ftoa(suhu_celcius2,1,data2);
    221.         lcd_gotoxy(8,1);
    222.         lcd_puts(data2);
    223.         lcd_gotoxy(12,1);
    224.         lcd_putchar(0xdf);//menampilkan karakter derajat
    225.         lcd_putsf("C");
    226.         delay_ms(100);
    227.     }
    228.     else if (indeks==3)
    229.     {
    230.         lcd_clear();
    231.         lcd_gotoxy(0,0);
    232.         lcd_putsf("Suhu 3 :   ");
    233.         ftoa(suhu_celcius3,1,data3);
    234.         lcd_gotoxy(8,0);
    235.         lcd_puts(data3);
    236.         lcd_gotoxy(12,0);
    237.         lcd_putchar(0xdf);//menampilkan karakter derajat
    238.         lcd_putsf("C");
    239.         lcd_gotoxy(0,1);
    240.         lcd_putsf("Suhu 4 :   ");
    241.         ftoa(suhu_celcius4,1,data4);
    242.         lcd_gotoxy(8,1);
    243.         lcd_puts(data4);
    244.         lcd_gotoxy(12,1);
    245.         lcd_putchar(0xdf);//menampilkan karakter derajat
    246.         lcd_putsf("C");
    247.         delay_ms(100);
    248.     }
    249.     /*else
    250.     {
    251.         indeks=1;
    252.     }*/    
    253. }
    254. void main(void)
    255. {
    256. // Declare your local variables here

    257. // Input/Output Ports initialization
    258. // Port A initialization
    259. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    260. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    261. PORTA=0x00;
    262. DDRA=0x00;

    263. // Port B initialization
    264. // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    265. // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
    266. PORTB=0x00;
    267. DDRB=0xFF;

    268. // Port C initialization
    269. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    270. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    271. PORTC=0x08;
    272. DDRC=0x00;

    273. // Port D initialization
    274. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    275. // State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P 
    276. PORTD=0xFF;
    277. DDRD=0x00;

    278. // Timer/Counter 0 initialization
    279. // Clock source: System Clock
    280. // Clock value: Timer 0 Stopped
    281. // Mode: Normal top=0xFF
    282. // OC0 output: Disconnected
    283. TCCR0=0x00;
    284. TCNT0=0x00;
    285. OCR0=0x00;

    286. // Timer/Counter 1 initialization
    287. // Clock source: System Clock
    288. // Clock value: Timer1 Stopped
    289. // Mode: Normal top=0xFFFF
    290. // OC1A output: Discon.
    291. // OC1B output: Discon.
    292. // Noise Canceler: Off
    293. // Input Capture on Falling Edge
    294. // Timer1 Overflow Interrupt: Off
    295. // Input Capture Interrupt: Off
    296. // Compare A Match Interrupt: Off
    297. // Compare B Match Interrupt: Off
    298. TCCR1A=0x00;
    299. TCCR1B=0x00;
    300. TCNT1H=0x00;
    301. TCNT1L=0x00;
    302. ICR1H=0x00;
    303. ICR1L=0x00;
    304. OCR1AH=0x00;
    305. OCR1AL=0x00;
    306. OCR1BH=0x00;
    307. OCR1BL=0x00;

    308. // Timer/Counter 2 initialization
    309. // Clock source: System Clock
    310. // Clock value: Timer2 Stopped
    311. // Mode: Normal top=0xFF
    312. // OC2 output: Disconnected
    313. ASSR=0x00;
    314. TCCR2=0x00;
    315. TCNT2=0x00;
    316. OCR2=0x00;

    317. // External Interrupt(s) initialization
    318. // INT0: Off
    319. // INT1: Off
    320. // INT2: Off
    321. MCUCR=0x00;
    322. MCUCSR=0x00;

    323. // Timer(s)/Counter(s) Interrupt(s) initialization
    324. TIMSK=0x01;

    325. // USART initialization
    326. // USART disabled
    327. UCSRB=0x00;

    328. // Analog Comparator initialization
    329. // Analog Comparator: Off
    330. // Analog Comparator Input Capture by Timer/Counter 1: Off
    331. ACSR=0x80;
    332. SFIOR=0x00;

    333. // ADC initialization
    334. // ADC Clock frequency: 1000,000 kHz
    335. // ADC Voltage Reference: AREF pin
    336. // ADC Auto Trigger Source: ADC Stopped
    337. ADMUX=ADC_VREF_TYPE & 0xff;
    338. ADCSRA=0x83;

    339. // SPI initialization
    340. // SPI disabled
    341. SPCR=0x00;

    342. // TWI initialization
    343. // TWI disabled
    344. TWCR=0x00;

    345. // Alphanumeric LCD initialization
    346. // Connections are specified in the
    347. // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
    348. // RS - PORTC Bit 0
    349. // RD - PORTC Bit 1
    350. // EN - PORTC Bit 2
    351. // D4 - PORTC Bit 4
    352. // D5 - PORTC Bit 5
    353. // D6 - PORTC Bit 6
    354. // D7 - PORTC Bit 7
    355. // Characters/line: 16
    356. lcd_init(16);

    357. // Global enable interrupts
    358. #asm("sei")

    359. while (1)
    360.       {
    361.       // Place your code here
    362.         tombol();
    363.         sensor_suhu1();
    364.         sensor_suhu2();
    365.         sensor_suhu3();
    366.         sensor_suhu4();
    367.         kipas1();
    368.         kipas2();
    369.         kipas3();
    370.         kipas4();
    371.         lcd_display();
    372.       }
    373. }
  12. Sehingga tampilannya seperti pada gambar berikut. Lalu kompilasi untuk mengecek apakah ada kesalahan atau error dan build semua program yang sudah dibuat sebelumnya.
  13. Selanjutnya buat desain skematik rangkaiannya seperti gambar di bawah ini atau bisa juga di-download desain rangkaian Proteus-nya pada link ini.
  14. 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.
  15. 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.
  16. Buka kembali ISIS Proteusnya, kemudian klik ikon "Pick from libraries".
  17. 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).
  18. Sesudah itu double click pada ATmega16 (U1) untuk memasukan program file *.Hex atau *.Coff, caranya seperti pada gambar berikut ini.
  19. 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".
  20. 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.
  21. Pilih file *.hex PIRSensorTEP dari folder yang sudah diekstrak sebelumnya.
  22. Sesudah selesai membuat seluruh desain rangkaiannya maka klik tombol Play untuk menjalankan simulasi rangkaiannya.
  23. Berikut fungsi dari tombol push button dan input logika dari tiap sensor PIR.
  24. Selesai, untuk hasil simulasinya dapat dilihat pada video di bawah ini.
        Terima kasih atas kunjungannya, selamat mencoba.

Tidak ada komentar:

Posting Komentar

Atas