Cara membuat sensor cahaya pada atmega dengan codevision avr biasanya macem2, mulai dari fotodioda, fototransistor, LDR dan masih banyak lagi. Untuk membuat rangkaian sensor cahaya kita menggunakan Analog to Digital Converternya ATMega, kalau untuk jenis ATMega16, ATMega32 dan ATMega8535 kita bisa menggunakan PINA.
Membuat Sensor Cahaya pada ATMega
Prinsip kerja rangkaian sensor cahaya ini sama seperti sensor suhu LM35, dimana subrutin ADC milik ATMega akan mengambil input dari kaki ADC kemudian program akan membaca output ADC tersebut.
Berikut contoh penggunaan sensor cahaya menggunakan LDR, saya ambil dari laporan praktikum yang saya ampu, dibuat oleh Mas Adi Candra Swastika. Cara kerja program ini mikrokontrol akan mengambil output ADC dari LDR dan jika hasil pembacaan ADC melebihi 150 maka LCD akan menampilkan angka 1 (high) selain itu maka akan menampilkan angka 0 (low). Program sensor cahaya CVAVR ini dapat dimodifikasi sendiri misal dengan memvariasikan perlakuan output.
Kode program Sensor Cahaya Menggunakan AVR ATMega
*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 13/04/2012
Author : Adi Candra Swastika
Company :
Comments: cara membuat sensor cahaya menggunakan atmega16 dan codevision avr
Chip type : ATmega16
Program type : Application
AVR Core Clock frequency : 16.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h> // mikrokontroler yang dipakai adalah atmega 16
#include <stdio.h>
#include <delay.h> //memasukkan library delay atau waktu tunda
// Alphanumeric LCD Module functions
#include <alcd.h> // library yang menunjukkan penggunaan lcd
unsigned char a, reff=150;//definisi variabel a, dan menentukan angka 150 sebagai referensi
char buff[32];
unsigned char adc_data;
#define ADC_VREF_TYPE 0x20
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
// Read the 8 most significant bits
// of the AD conversion result
adc_data=ADCH;
}
// Read the 8 most significant bits
// of the AD conversion result
// with noise canceling
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);
#asm
in r30,mcucr
cbr r30,__sm_mask
sbr r30,__se_bit | __sm_adc_noise_red
out mcucr,r30
sleep
cbr r30,__se_bit
out mcucr,r30
#endasm
return adc_data;
}
void main(void)
{
//definisi IO(input output) pada masing-masing port
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
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 Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AREF pin
// 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=0x8C;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS – PORTB Bit 0
// RD – PORTB Bit 1
// EN – PORTB Bit 2
// D4 – PORTB Bit 4
// D5 – PORTB Bit 5
// D6 – PORTB Bit 6
// D7 – PORTB Bit 7
// Characters/line: 16
lcd_init(16);
// Global enable interrupts
#asm(“sei”)
while (1)
{
a=read_adc(0); // pembacaan adc dimasukkan pada variabel a
lcd_gotoxy(0,0); //mendefinisikan koordinat x=0 y=0 sebagai awal mula penulisan LCD
sprintf (buff,”ADC0 : %d”,read_adc(0)); //menuliskan nilai ADC pada LCD
lcd_puts(buff);
lcd_gotoxy(0,1);//mendefinisikan koordinat x=0 y=1 sebagai awal mula penulisan LCD
if(a<reff){ //perumpamaan jika a kurang dari nilai referensi (150) maka LCD
lcd_putsf(“0”); //akan menampilkan angka 0, jika a>referensi (150) maka LCD
}else{ //akan menampilkan angka 1
lcd_putsf(“1”);
}
delay_ms(300); //memberikan delay sebesar 300 milisecond
lcd_clear();
}
}
Gambar Rangkaian Pembuatan Sensor Cahaya Menggunakan ATmel Atmega
Berikut adalah gambar rangkaian sensor cahaya menggunakan LDR pada atmel atmega
kenapa ketika LDR diganti nilainya di lcd nggak berubah gan?