Anda di halaman 1dari 16

Tutorial Membuat Project Termometer Dan Jam Digital Menggunakan

Codevision AVR by Muhammad Kennedy Ginting


A. Deskripsi Umum
Aplikasi ini dapat menampilkan suhu dan jam digital. Dimana sensor suhu
yang digunakan adalah LM35. Aplikasi ini merupakan gabungan dari
aplikasi yaitu termometer dengan LM35 dan jam digital menggunakan
LCD.
B. Spesifikasi Teknis Dan Karakteristik
Aplikasi pembacaan suhu (monitoring suhu) ini, menggunakan sensor
LM35 yang merupakan sebuah sensor suhu dengan harga yang relatif murah
dan output nya sudah berupa tegangan yang sudah linear.
Aplikasi ini tidak menggunakan RTC (Real Time Clock), sehingga ketika
catu daya atau power supply dimatikan maka nilai dari jam digital tersebut
akan menunjukan pukul 12:0:0. Oleh karena itu saya tambahkan 3 buah
push button untuk menset nilai tersebut.
C. Daftar Komponen
1. Sistem Minimum Atmega16
ATmega16
IC 7805
Crystal 12MHz
Kapasitor 22pF (2), 100nF (4), 100uF(2)
2 Resistor 1K
4 Switch Button
1x40 Female Header
1x40 Male Header
1N4002
2. LCD 16x2
3. LM35 (Sensor Suhu)
4. Potensiometer 1K
5. Battery 9V
6. Downloader AVR
D. Prinsip Kerja Dan Rangkaian
Cara kerja jam digital yang saya buat adalah menggunakan penampil LCD
216. Kemudian terdapat 3 buah pushbutton yaitu SET, UP dan DOWN.
Tombol SET digunakan untuk menset jam, kemudian UP dan DOWN
digunakan untuk menset nilai dari jam. Jika ingin menset menit maka harus
menekan tombol SET kembali, begitu seterusnya untuk menset detik.

Menurut datasheet LM35, untuk kenaikan 1 derajat Celcius akan


mengakibatkan perubahan 10mV terhadap output tegangannya. Dimana saat
suhu 0 Celcius sensor ini mempunyai tegangan offset sebesar 0 V.
Disini saya akan melakukan pembacaan suhu dalam satuan derajat Celcius
dengan range pengukuran 0-100 Celcius. Sehingga tegangan output dari
LM35 adalah 0-1 V.
Tegangan output tersebut sudah dapat dibaca oleh mikrokontroler melalui
ADC tanpa diperlukan sebuah penguat tegangan. Aplikasi ini telah saya
buat dalam bentuk real (sesungguhnya) dan juga saya simulasikan
menggunakan Proteus. Skematic LM35 yang kemudian ditampilkan pada
LCD dapat dilihat diatas.
Mikrokontroler Atmega16 memiliki fasilitas analog yang sudah build in
didalam chip. Fitur internal ADC inilah yang menjadi salah satu kelebihan
mikrokontroler ini jika dibandingan dengan beberapa jenis mikrokontroler
lainnya.
Atmega memiliki resolusi ADC 10 bit (dapat juga menggunakan ADC 8 bit)
dengan 8 channel (PA0-PA7) input ADC dan mendukung 16 macam
penguat beda. ADC ini bekerja dengan teknik succecive approximation.
Rangkaian internal ADC memiliki catu daya tersendiri yaitu pin AVCC.
Data hasil konversi ADC 10 bit (1024) adalah:
ADC=(Vin*1024)/Vref
Jika ingin menggunakan ADC 8 bit maka tinggal meng-klik saja pada use
8 bit. Volt Ref merupakan sumber pemilihan tegangan referensi ADC,
sedangkan Clock adalah banyaknya frekuensi sampling ADC. Dan Auto
Trigger Source merupakan mode ADC yang akan digunakan.
Sedangkan instruksi untuk pembacaan ADC pada program CodeVision
AVR adalah sebagai berikut:
int ADC;//variabel ADC dengan tipe data integer
ADC=read_adc(0);//baca data ADC dari channel 0 (ADC0/PA1)

Berikut skematik dan cara setting di CodeVision AVR :

Gambar 1. Skematik Jam Digital dan Termometer

Gambar 2. Setting Clock dan Timer1

Gambar 3. Setting LCD dan ADC


Listing Program :
/*****************************************************
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 : Jam Digital Dan Termometer
Version : v.1
Date

: 11/08/2014

Author : Muhammad Kennedy Ginting


Company : Apartment 57
Comments:

Chip type
Program type

: ATmega16
: Application

AVR Core Clock frequency: 12,000000 MHz


Memory model
External RAM size
Data Stack size

: Small
: 0
: 256

*****************************************************/

unsigned char temp[6];


int detik=0, menit=0, jam=12, indeks=6, adc_suhu;
float suhu;
#include <mega16.h>
#include <stdlib.h>
#include <delay.h>
// Alphanumeric LCD functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <alcd.h>
#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;
}
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer1 value
TCNT1H=0xD23A >> 8;
TCNT1L=0xD23A & 0xff;
// Place your code here
detik++;
adc_suhu=read_adc(0);
}

void jam_digital()
{
if (detik==60)
{
lcd_clear();
detik=0;
menit++;
}
if (menit==60)
{
lcd_clear();
menit=0;
jam++;
}
if (jam==24)
{
lcd_clear();
jam=0;
}
}
void tampil_lcd()
{
lcd_gotoxy(0,0);
lcd_putsf(" Apartment 57");
itoa(jam,temp); //menampilkan JAM di LCD
lcd_gotoxy(0,1);
lcd_puts(temp);
lcd_gotoxy(2,1); //menampilkan :
lcd_putsf(":");
itoa(menit,temp); //menampilkan MENIT di LCD
lcd_gotoxy(3,1);
lcd_puts(temp);
lcd_gotoxy(5,1); //menampilkan :
lcd_putsf(":");

itoa(detik,temp); //menampilkan DETIK di LCD


lcd_gotoxy(6,1);
lcd_puts(temp);
ftoa(suhu,1,temp); //menampilkan suhu
lcd_gotoxy(9,1);
lcd_puts(temp);
lcd_gotoxy(13,1) ;
lcd_putchar(0xdf);//menampilkan karakter derajat
lcd_gotoxy(14,1) ;
lcd_putsf("C");
}
void set_jam()
{
if (PIND.0==0 && indeks==6)
{
TIMSK=0x00; //MENGHENTIKAN TIMER
delay_ms(300);
indeks=5;
while (PIND.0==1 && indeks==5)
{
tampil_lcd();
if (PIND.1==0)
{
delay_ms(300);
jam=jam+10;
if (jam>=24)
{
jam=23;
}
}
if (PIND.2==0)
{
delay_ms(300);
jam=jam-10;
if (jam<=9)
{

lcd_clear();
if (jam<0)
{
jam=0;
}
}
}
}
}
if (PIND.0==0 && indeks==5)
{
delay_ms(300);
indeks=4;
while (PIND.0==1 && indeks==4)
{
tampil_lcd();
if (PIND.1==0)
{
delay_ms(300);
jam=jam+1;
if (jam>=24)
{
jam=23;
}
}
if (PIND.2==0)
{
delay_ms(300);
jam=jam-1;
if (jam<=9)
{
lcd_clear();
if (jam<0)
{
jam=0;
}
}
}
}

}
if (PIND.0==0 && indeks==4)
{
delay_ms(300);
indeks=3;
while (PIND.0==1 && indeks==3)
{
tampil_lcd();
if (PIND.1==0)
{
delay_ms(300);
menit=menit+10;
if (menit>=60)
{
menit=59;
}
}
if (PIND.2==0)
{
delay_ms(300);
menit=menit-10;
if (menit<=9)
{
lcd_clear();
if (menit<0)
{
menit=0;
}
}
}
}
}
if (PIND.0==0 && indeks==3)
{
delay_ms(300);
indeks=2;
while (PIND.0==1 && indeks==2)
{

tampil_lcd();
if (PIND.1==0)
{
delay_ms(300);
menit=menit+1;
if (menit>=60)
{
menit=59;
}
}
if (PIND.2==0)
{
delay_ms(300);
menit=menit-1;
if (menit<=9)
{
lcd_clear();
if (menit<0)
{
menit=0;
}
}
}
}
}
if (PIND.0==0 && indeks==2)
{
delay_ms(300);
indeks=1;
while (PIND.0==1 && indeks==1)
{
tampil_lcd();
if (PIND.1==0)
{
delay_ms(300);
detik=detik+1;
if (detik>=60)
{
detik=59;

}
}
if (PIND.2==0)
{
delay_ms(300);
detik=detik-1;
if (detik<=9)
{
lcd_clear();
if (detik<0)
{
detik=0;
}
}
}
}
}
if (PIND.0==0 && indeks==1)
{
delay_ms(300);
indeks=0;
while (PIND.0==1 && indeks==0)
{
tampil_lcd();
if (PIND.1==0)
{
delay_ms(300);
detik=detik+1;
if (detik>=60)
{
detik=59;
}
}
if (PIND.2==0)
{
delay_ms(300);
detik=detik-1;
if (detik<=9)

{
lcd_clear();
if (detik<0)
{
detik=0;
}
}
}
}
indeks=6;
TIMSK=0x04; //MEMULAI LAGI TIMER
delay_ms(450);
}
}
void baca_suhu()
{
suhu=(float)adc_suhu*500/1023;//perhitungan suhu menggunakan
LM35
}

// Declare your global variables here


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=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=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
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: 11,719 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off


TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xD2;
TCNT1L=0x3A;
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=0x04;
// 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: AREF pin
// ADC Auto Trigger Source: ADC Stopped
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
// 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
baca_suhu();
jam_digital();
tampil_lcd();
set_jam();
}
}

Selamat Mencoba
Good Luck !!!