Assalamu'alaikum Wr. Wb. pada kesempatan ini saya akan memberi tutorial cara membuat rangkaian sensor suhu LM35 dengan Mikrokontroler ATmega16 yang dikombinasikan dengan tampilan indikator LED dan dot matrix.
Pada rangkaian ini ATMEGA 16 digunakan untuk membaca data dari sensor suhu LM35 menggunakan ADC yang sudah built-in pada ATmega16, kemudian ditampilkan indikator suhunya ke LED dan nilai suhunya pada dot matrix (dalam celsius). ADC pada ATmega berfungsi untuk mengubah nilai tegangan analog dari sensor LM35 menjadi data digital.
Langsung saja ke topik pembahasan yang akan kita lakukan, tools yang digunakan sama seperti pada postingan sebelumnya yaitu software Code Vision AVR untuk membuat dan meng-compile programnya dan ISIS Proteus untuk membuat desain sistem dan melakukan simulasi.
Oke mari kita ikuti langkah-langkahnya sebagai berikut :
- Membuat project baru, kemudian pilih jenis chip dan clock speed-nya seperti pada gambar.
- Pada bagian tab "ADC", aktifkan pin ADCnya pada PORT A dengan mencentang "ADC Enabled".
- Kemudian pada bagian menu "Ports" di tab Port A dari pin 0 sampai 3 diatur sebagai keluaran active low. Port ini digunakan sebagai indikator tanda warna dengan lampu LED. Warna biru untuk nilai suhu di bawah 11 derajat, warna hijau untuk nilai suhu di bawah 21 derajat, warna kuning untuk nilai suhu dibawah 31 derajat dan warna merah untuk nilai suhu di atas 40 derajat celsius.
- Selanjutnya ke tab Port C dan Port D diatur sebagai keluaran ke pin-pin pada IC 74HC595. Konfigurasi keluaran active lownya pada Port C dari pin 0-7 dan pada Port D dari pin 0-5 seperti pada gambar berikut.
- Setelah program di "Generate, Save, and Exit" pada menu "Program" maka lengkapi programnya dengan memasukan source code program .c CV AVR 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 : Sensor Suhu V2
- Version : 2.0
- Date : 29/08/2019
- Author : Vidi Fitriansyah Hidarlan
- Company : Personal
- Comments:
- 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 <stdlib.h>
- #include <delay.h>
- #define data_hi1 PORTD.0=1//pendefinisian data high untuk IC 74HC595 1 pada PORTD.0
- #define data_lo1 PORTD.0=0//pendefinisian data low untuk IC 74HC595 1 pada PORTD.0
- #define data_hi2 PORTD.3=1//pendefinisian data high untuk IC 74HC595 2 pada PORTD.3
- #define data_lo2 PORTD.3=0//pendefinisian data low untuk IC 74HC595 2 pada PORTD.3
- #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
- int SUHU;
- //char temp[8];
- int suhu_celcius,puluhan,satuan;
- void clock1()
- {
- PORTD.1=0; //clock1
- PORTD.2=1; //Latch
- PORTD.1=1; //clock1
- PORTD.2=0; //Latch
- delay_us(1);
- }
- void clock2()
- {
- PORTD.4=0; //clock2
- PORTD.5=1; //Latch
- PORTD.4=1; //clock2
- PORTD.5=0; //Latch
- delay_us(1);
- }
- void indikator(void)
- {
- if (suhu_celcius<=10)
- {
- PORTA=0b00000001;//nilai PORTA yang aktif untuk indikator suhu <=10
- }
- else if (suhu_celcius<=20)
- {
- PORTA=0b00000011;//nilai PORTA yang aktif untuk indikator suhu <=20
- }
- else if (suhu_celcius<=30)
- {
- PORTA=0b00000111;//nilai PORTA yang aktif untuk indikator suhu <=30
- }
- else if (suhu_celcius>30)
- {
- PORTA=0b00001111;//nilai PORTA yang aktif untuk indikator suhu >30
- }
- }
- void main(void)
- {
- // Declare your local variables here
- unsigned char kosong[8]={0,0,0,0,0,0,0,0};
- unsigned char angka0[8]={0,0b01111110,0b11111111,0b11000011,0b11000011,0b11111111,0b01111110,0};
- unsigned char angka1[8]={0,0b00100011,0b01100011,0b11111111,0b11111111,0b00000011,0b00000011,0};
- unsigned char angka2[8]={0,0b01100011,0b11100111,0b11001111,0b11011011,0b11110011,0b01100011,0};
- unsigned char angka3[8]={0,0b01100110,0b11000011,0b11011011,0b11011011,0b11111111,0b01100110,0};
- unsigned char angka4[8]={0,0b00011100,0b00111100,0b01100100,0b11111111,0b11111111,0b00000100,0};
- unsigned char angka5[8]={0,0b11110110,0b11111011,0b11011011,0b11011011,0b11011111,0b10001110,0};
- unsigned char angka6[8]={0,0b01111110,0b11111111,0b11011011,0b11011011,0b11011111,0b01001110,0};
- unsigned char angka7[8]={0,0b11000000,0b11000111,0b11001111,0b11011000,0b11110000,0b11100000,0};
- unsigned char angka8[8]={0,0b01100110,0b11111111,0b11011011,0b11011011,0b11111111,0b01100110,0};
- unsigned char angka9[8]={0,0b01110010,0b11111011,0b11011011,0b11011011,0b11111111,0b01111110,0};
- unsigned char angka10[8]={0,0b01110010,0b11111011,0b11011011,0b11011011,0b11111111,0b01111110,0};
- unsigned char derajat[8]={0,0,0,0,0b11100000,0b10100000,0b11100000,0};
- unsigned char celcius[8]={0,0b0111110,0b11111111,0b11000011,0b11000011,0b11000011,0b01000010,0};
- //char data_angka[30]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- //char data2[6]={derajat,celcius};
- //char PORT[8] = {1,2,4,8,16,32,64,128}; //pin values of a port 2^0,2^1,2^2……2^7
- int x,y,a,b,i,j;
- // Input/Output Ports initialization
- // Port A initialization
- // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out
- // State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0
- PORTA=0x00;
- DDRA=0x0F;
- // 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=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
- PORTC=0x00;
- DDRC=0xFF;
- // Port D initialization
- // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out
- // State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0
- PORTD=0x00;
- DDRD=0x3F;
- // Timer/Counter 0 initialization
- // clock1 source: System clock1
- // clock1 value: Timer 0 Stopped
- // Mode: Normal top=0xFF
- // OC0 output: Disconnected
- TCCR0=0x00;
- TCNT0=0x00;
- OCR0=0x00;
- // Timer/Counter 1 initialization
- // clock1 source: System clock1
- // clock1 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
- // clock1 source: System clock1
- // clock1 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=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 clock1 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;
- while (1)
- {
- // Place your code here
- SUHU = read_adc(7);//membaca data ADC dari PORTA.7
- suhu_celcius = (int)(SUHU-1)/10;//rumus konversi ke derajat celcius
- if (suhu_celcius>35)
- {
- suhu_celcius = suhu_celcius-1;//untuk kalibrasi sensor suhu (lihat datasheet LM35)
- }
- //ftoa(suhu_celcius,0,temp);
- satuan = suhu_celcius%10;//rumus modulo untuk mengambil nilai data satuan
- puluhan = (suhu_celcius/10)%10;//rumus modulo untuk mengambil nilai data puluhan
- indikator();
- if (puluhan==0)
- {
- for(x=0;x<1;x++)//mengulang pergeseran baris dot matrix
- {
- for(a=0;a<5;a++)//mengulang baris dot matrix
- {
-
- for (i=0;i<=8;i++)//menggeser kolom dot matrix
- {
- clock1();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(i==1)
- data_hi1;
- else
- data_lo1;
- PORTC = ~kosong[i+x];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (puluhan==1)
- {
- for(x=0;x<1;x++)//mengulang pergeseran baris dot matrix
- {
- for(a=0;a<5;a++)//mengulang baris dot matrix
- {
-
- for (i=0;i<=8;i++)//menggeser kolom dot matrix
- {
- clock1();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(i==1)
- data_hi1;
- else
- data_lo1;
- PORTC = ~angka1[i+x];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (puluhan==2)
- {
- for(x=0;x<1;x++)//mengulang pergeseran baris dot matrix
- {
- for(a=0;a<5;a++)//mengulang baris dot matrix
- {
-
- for (i=0;i<=8;i++)//menggeser kolom dot matrix
- {
- clock1();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(i==1)
- data_hi1;
- else
- data_lo1;
- PORTC = ~angka2[i+x];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (puluhan==3)
- {
- for(x=0;x<1;x++)//mengulang pergeseran baris dot matrix
- {
- for(a=0;a<5;a++)//mengulang baris dot matrix
- {
-
- for (i=0;i<=8;i++)//menggeser kolom dot matrix
- {
- clock1();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(i==1)
- data_hi1;
- else
- data_lo1;
- PORTC = ~angka3[i+x];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (puluhan==4)
- {
- for(x=0;x<1;x++)//mengulang pergeseran baris dot matrix
- {
- for(a=0;a<5;a++)//mengulang baris dot matrix
- {
-
- for (i=0;i<=8;i++)//menggeser kolom dot matrix
- {
- clock1();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(i==1)
- data_hi1;
- else
- data_lo1;
- PORTC = ~angka4[i+x];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (puluhan==5)
- {
- for(x=0;x<1;x++)//mengulang pergeseran baris dot matrix
- {
- for(a=0;a<5;a++)//mengulang baris dot matrix
- {
-
- for (i=0;i<=8;i++)//menggeser kolom dot matrix
- {
- clock1();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(i==1)
- data_hi1;
- else
- data_lo1;
- PORTC = ~angka5[i+x];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (puluhan==6)
- {
- for(x=0;x<1;x++)//mengulang pergeseran baris dot matrix
- {
- for(a=0;a<5;a++)//mengulang baris dot matrix
- {
-
- for (i=0;i<=8;i++)//menggeser kolom dot matrix
- {
- clock1();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(i==1)
- data_hi1;
- else
- data_lo1;
- PORTC = ~angka6[i+x];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (puluhan==7)
- {
- for(x=0;x<1;x++)//mengulang pergeseran baris dot matrix
- {
- for(a=0;a<5;a++)//mengulang baris dot matrix
- {
-
- for (i=0;i<=8;i++)//menggeser kolom dot matrix
- {
- clock1();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(i==1)
- data_hi1;
- else
- data_lo1;
- PORTC = ~angka7[i+x];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (puluhan==8)
- {
- for(x=0;x<1;x++)//mengulang pergeseran baris dot matrix
- {
- for(a=0;a<5;a++)//mengulang baris dot matrix
- {
-
- for (i=0;i<=8;i++)//menggeser kolom dot matrix
- {
- clock1();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(i==1)
- data_hi1;
- else
- data_lo1;
- PORTC = ~angka8[i+x];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (puluhan==9)
- {
- for(x=0;x<1;x++)//mengulang pergeseran baris dot matrix
- {
- for(a=0;a<5;a++)//mengulang baris dot matrix
- {
-
- for (i=0;i<=8;i++)//menggeser kolom dot matrix
- {
- clock1();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(i==1)
- data_hi1;
- else
- data_lo1;
- PORTC = ~angka9[i+x];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else
- {
- PORTB=0x00;
- PORTC=0x00;
- PORTD=0x00;
- }
- if (satuan==0)
- {
- for(y=0;y<1;y++)//mengulang pergeseran baris dot matrix
- {
- for(b=0;b<5;b++)//mengulang baris dot matrix
- {
-
- for (j=0;j<=8;j++)//menggeser kolom dot matrix
- {
- clock2();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(j==1)
- data_hi2;
- else
- data_lo2;
- PORTC = ~angka1[j+x+8];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (satuan==1)
- {
- for(y=0;y<1;y++)//mengulang pergeseran baris dot matrix
- {
- for(b=0;b<5;b++)//mengulang baris dot matrix
- {
-
- for (j=0;j<=8;j++)//menggeser kolom dot matrix
- {
- clock2();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(j==1)
- data_hi2;
- else
- data_lo2;
- PORTC = ~angka2[j+x+8];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (satuan==2)
- {
- for(y=0;y<1;y++)//mengulang pergeseran baris dot matrix
- {
- for(b=0;b<5;b++)//mengulang baris dot matrix
- {
-
- for (j=0;j<=8;j++)//menggeser kolom dot matrix
- {
- clock2();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(j==1)
- data_hi2;
- else
- data_lo2;
- PORTC = ~angka3[j+x+8];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (satuan==3)
- {
- for(y=0;y<1;y++)//mengulang pergeseran baris dot matrix
- {
- for(b=0;b<5;b++)//mengulang baris dot matrix
- {
-
- for (j=0;j<=8;j++)//menggeser kolom dot matrix
- {
- clock2();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(j==1)
- data_hi2;
- else
- data_lo2;
- PORTC = ~angka4[j+x+8];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (satuan==4)
- {
- for(y=0;y<1;y++)//mengulang pergeseran baris dot matrix
- {
- for(b=0;b<5;b++)//mengulang baris dot matrix
- {
-
- for (j=0;j<=8;j++)//menggeser kolom dot matrix
- {
- clock2();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(j==1)
- data_hi2;
- else
- data_lo2;
- PORTC = ~angka5[j+x+8];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (satuan==5)
- {
- for(y=0;y<1;y++)//mengulang pergeseran baris dot matrix
- {
- for(b=0;b<5;b++)//mengulang baris dot matrix
- {
-
- for (j=0;j<=8;j++)//menggeser kolom dot matrix
- {
- clock2();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(j==1)
- data_hi2;
- else
- data_lo2;
- PORTC = ~angka6[j+x+8];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (satuan==6)
- {
- for(y=0;y<1;y++)//mengulang pergeseran baris dot matrix
- {
- for(b=0;b<5;b++)//mengulang baris dot matrix
- {
-
- for (j=0;j<=8;j++)//menggeser kolom dot matrix
- {
- clock2();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(j==1)
- data_hi2;
- else
- data_lo2;
- PORTC = ~angka7[j+x+8];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (satuan==7)
- {
- for(y=0;y<1;y++)//mengulang pergeseran baris dot matrix
- {
- for(b=0;b<5;b++)//mengulang baris dot matrix
- {
-
- for (j=0;j<=8;j++)//menggeser kolom dot matrix
- {
- clock2();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(j==1)
- data_hi2;
- else
- data_lo2;
- PORTC = ~angka8[j+x+8];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else if (satuan==8)
- {
- for(y=0;y<1;y++)//mengulang pergeseran baris dot matrix
- {
- for(b=0;b<5;b++)//mengulang baris dot matrix
- {
-
- for (j=0;j<=8;j++)//menggeser kolom dot matrix
- {
- clock2();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(j==1)
- data_hi2;
- else
- data_lo2;
- PORTC = ~angka9[j+x+8];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- else
- {
- for(y=0;y<1;y++)//mengulang pergeseran baris dot matrix
- {
- for(b=0;b<5;b++)//mengulang baris dot matrix
- {
-
- for (j=0;j<=8;j++)//menggeser kolom dot matrix
- {
- clock2();
- //PORTD = PORT[i];//inisialisasi keluaran PORT D = PORT dengan array i
- if(j==1)
- data_hi2;
- else
- data_lo2;
- PORTC = ~angka10[j+x+8];//inisialisasi PORT C sebagai negasi data1 dengan array i
- delay_us(50);//waktu tunda 50 microseconds
- }
-
- }
- }
- }
- }
- }
- Setelah dibuat programnya maka dilanjutkan ke perancangan rangkaiannya pada Proteus. Untuk komponen yang diperlukan dan desain rangkaiannya bisa dilihat pada gambar di bawah.
- Double kill pada ATmega16 untuk memasukan file programnya (*.coff atau *.hex).
- Jadi deh setelah diklik tombol play-nya.
Selamat mencoba... ;)
Semoga bermanfaat