LM35 adalah IC untuk sensor temperatur yang bisa digunakan untuk mengukur temperatur dengan keluaran berupa perubahan tegangan yang sebanding dengan perubahan temperatur dalam Celcius.
Kenapa LM35? Karena dengan LM35 kita bisa mengukur temperatur lebih presisi dan akurat dibandingkan dengan jenis sensor lain yang harganya seimbang, contoh thermistor. Keluaran dari LM35 berupa perubahan tegangan sebesar 10 millivolt per 1 derajat Celcius. Dengan range temperatur dari -55 sampai dengan +150 derajat Celcius. LM35 menghasilkan keluaran yang lebih besar dari thermocouple sehingga dalam aplikasi, dimungkinkan untuk digunakan tanpa menggunakan penguat tegangan.

Berikut adalah penampakan dari sensor LM35 TO-92 Plastic Package (Z):

bentuk LM35
LM35 tidak memerlukan kalibrasi dan LM35 mempunyai akurasi sebesar +/-0.4 derajat Celcius pada temperatur kamar dan +/-0.8 derajat Celcius full range dari temperatur -55 derajat Celcius sampai dengan +100 derajat Celcius. Karakteristik LM35 yang lain adalah LM35 hanya mengkonsumsi arus hanya sebesar 60 micro ampere dari power supply dan mempunyai self-heating yang rendah. Self-heating pada LM35 hanya mempengaruhi akurasi hingga 0.1 derajat Celcius pada udara yang tenang (tanpa angin).

Pada datasheet LM35 sudah tercantum bagaimana cara merangkai LM35 sesuai kebutuhan kita, misalkan bagaimana cara merangkai LM35 sehingga bisa mengukur temperatur dari -55 sampai dengan +150 derajat celcius dengan menggunakan catu simetris +,- dan ground. Atau bagaimana cara merangkai LM35 untuk mengukur temperatur dari -5 sampai dengan +40 derajat celcius. Dalam datasheet juga dijelaskan bagaimana cara koneksi dan pembebanan keluaran LM35, misal dengan beban capasitive yang besar, biasanya dari pengkabelan karena LM35 hanya mampu terbebani oleh beban capasitive sebesar 50pF sehingga bila kabel kita nilai kapasitifnya terlalu besar, harus ditambahi dumper untuk menambah toleransi terhadap beban kapasitif atau bisa juga dengan menambahkan resistansi (resistor) untuk output decoupling pada capasitive load. O iya, jangan lupa ambient temperaturnya misal konfigurasi standar 0 sampai dengan +150 derajat Celcius, ambient temperaturnya sebesar 1 derajat Celcius atau sebesar 10 millivolt. Jadi LM35 hanya bisa untuk mengukur temperatur dari 2 sampai dengan 150 derajat Celcius. Untuk keterangan yang lebih komplit silahkan download datasheetnya disini.
Berikut adalah salah gambar dari datasheet, contoh koneksi LM35 untuk pengukuran dari 2 sampai dengan 150 derajat Celcius:

LM35 Sample
Berikutnya, gambar dibawah ini adalah konfigurasi pin LM35 untuk LM35 TO-92 Plastic Package (Z):

LM35dz
Nah, sekarang sudah ada gambaran tentang sensor yang satu ini kan..
Wokey sekarang kita langsung beranjak ke cara pembuatan Thermometer digital dengan sensor LM35 dan AVR ATmega 16 sebagai controllernya. Bahasa pemrograman yang akan ane gunakan adalah bahasa C dengan compiler CodeVisionAVR. Seperti biasanya, ane sertakan juga simulasi dari program dengan menggunakan Proteus ISIS simulator. Tapi yang harus diingat adalah bahwa schematic yang ada didalam simulasi Proteus yang ane buat hanya untuk kepentingan simulasi saja dan bukan untuk dirangkai secara real, jadi bila ingin dibuat secara real harus refer ke datasheet masing2 komponen yang akan dipake :D dan harus dimodif sana dan sini, tapi mudah kok.. be creative :D Yang paling penting, program 100% worked dan bisa diaplikasikan secara nyata :). Gambar screenshot dari simulasi bisa dilihat seperti dibawah ini:

LM35 Proteus ISIS
Dalam simulasi sudah dilengkapi dengan komponen LM35, ATmega16, LCD dan beberapa komponen tambahan. Okey sekarang kita bahas programnya.

#include <mega16.h>
#include <delay.h>
#include <stdio.h>
 
// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
 
#define ADC_VREF_TYPE 0xC0 //Internal

Pada penggalan program diatas berfungsi untuk microcontroller preprocessor, pemanggilan library serta penentuan referensi ADC yang akan dipakai. Dalam program ini memerlukan library “stdio.h” karena program ini menggunakan fungsi “sprintf()” untuk formatting text dan data ke LCD.

unsigned char buffer[16]; //Untuk buffer sprintf
float temperature; //Untuk data perhitungan temperature (float)
unsigned int temporary; //Untuk temporary data ADC (komparasi)
 
void updatetemp(void);
void sett_regs(void); //Fungsi untuk setting register di awal proses
unsigned int read_adc(unsigned char adc_input);//Fungsi baca ADC

Penggalan program diatas adalah penentuan variabel global dan function prototype. Variabel global “buffer[16]” berfungsi untuk buffer “sprintf()”, karena hanya untuk formating LCD 2×16, jadi hanya butuh 16 komponen array. Variabel temperature adalah variabel yang berfungsi untuk tampungan data temperature setelah data LCD dikonversikan kedalam nilai temperature. Variabel global yang terakhir adalah temporary, fungsinya untuk penyimpanan hasil dari pembacaan nilai ADC terakhir dan membandingkannya dengan data nilai ADC terkini, dan bila nilai antara keduanya tidak sama, baru program akan memperbaharui (update) nilai pembacaan temperature. Function prototype “updatetemp, sett_regs dan read_adc” diperlukan bila fungsi main ingin diletakkan dimana saja dalam program (tidak harus dibawah fungsi lain) sebenarnya akan sangat efektif bila file program sudah besar dan dibutuhkan multifile file source code dan tentu saja dengan tambahan file header.

// Main function
void main(void){
//--------------- Setting IO and peripheral at startup!
sett_regs();
_lcd_ready();
//--------------- Time for going CRAZY (looping forever)..
for(;;){ //mainloop looping forever until ERROR/POWER SHUTDOWN/RST/WDT ACTIVE
    #asm("wdr") //kick your DOG before DEAD! hwahwa... :D
    updatetemp();
    #asm("nop")
    };
}

Potongan program diatas adalah fungsi main yang bertugas untuk memanggil fungsi-fungsi yang lain pada single thread process (super loop) dan akan berbeda kasus bila kita menggunakan multi thread process misal menggunakan scheduler atau RTOS :D. Pada awal startup karena mikro tidak menggukanan bootloader, program akan langsung menuju ke fungsi main dan akan memanggil fungsi – fungsi yang lain misal sett_regs untuk setting IO dan register pada awal proses, “_lcd_ready” (dari library lcd.h) berfungsi untk menunggu sampai LCD module controller siap untuk menerima data. Selanjutnya perintah “for(;;){}” berfungsi untuk superloop. (the power of microcontroller). “#asm(“wdr”)” berfungsi untuk mereset watchdog timer kembali ke 0 sebelum overflow dan mereset mikrokontroler dalam waktu…? 2.1s (lihat datahseet ATmega16) hehe :D. updatetemp(), fungsi ini untuk proses pengolahan data ADC ke temperature sedangkan “#asm(“nop”)” berfungsi untuk istirahat sejenak 1cycle.

void updatetemp(void){
if (temporary != read_adc(0)){
    temperature = read_adc(0)/4;
    lcd_gotoxy(0,0);
    lcd_putsf("WWW.NUBIELAB.COM");
    lcd_gotoxy(0,1);
    sprintf(buffer,"SUHU: %0.1f%cC  ",temperature,0xDF);
    lcd_puts(buffer);
    temporary = read_adc(0);
    delay_ms(100);
    }
}

Perintah “if (temporary != read_adc(0)){…” befungsi untuk membandingkan pembacaan sebelumnya dengan pembacaan terkini dan bila masih sama fungsi ini akan ditinggalkan / kembali ke fungsi main(). Code berikut, “temperature = read_adc(0)/4;” berfungsi untuk konversi dari data ADC ke temperature yang didapat dengan cara sebagai berikut:
Sebelumnya perlu diingat bahwa V referensi diambil dari Vref internal ATmega16 sebesar 2.56V. Dan mode ADC adalah 10bit.
ADC = ( Vin * 1024 / Vref ) misal, temperature LM35 = 30 derajat Celcius, Vin ADC = 300mV = 0.3V, jadi nilai ADC = (.3*1024/2.56)=120, selanjutnya nilai ADC dibagi temperature aktual jadi 120/30 = 4 nah ketemu dah faktor pembaginya :D. Persamaan bisa disederhanakan dengan output data ADC/4. “sprintf(buffer,”SUHU: %0.1f%cC “,temperature,0xDF);” Syntax tersebut berfungsi untuk formatting data temperature yang berupa float satu digit dibelakang koma “%0.1f”, dan karakter derajat yang bernilai “0x0DF”.

Fungsi yang terakhir adalah fungsi “sett_regs” :

// Function for setting register
void sett_regs(void){
// Port a initialization
PORTA=0x00;DDRA=0x00;
// Port b initialization
PORTB=0x00;DDRB=0x00;
// Port c initialization
PORTC=0x00;DDRC=0x00;
// Port D initialization
PORTD=0x00;DDRD=0x00;
 
// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC Auto Trigger Source: Free Running
ADMUX=ADC_VREF_TYPE &amp; 0xff;
ADCSRA=0xA2;
SFIOR&amp;=0x1F;
 
// LCD module initialization
lcd_init(16);
 
ACSR=0x80;
SFIOR=0x00;
 
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k
#pragma optsize-
WDTCR=0x1F;
WDTCR=0x0F;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
}

Fungsi ini untuk mengatur I/O ATmega16 dan mengatur pheriperal lain, misal untuk watchdog ADC etc.. sudah ada keterangannya, jadi baca sendiri dan tidak usah diulang lagi :D.

Wooooooooooookey dah, ngetik capek juga.. sekarang mari dicoba sama-sama silahkan download program komplit pake telor + simulasi ISIS Proteusnya disini.

Project file untuk CodeVisionAVR, buka dengan CodeVisionAVR versi 2.039 atau yang lebih baru dan File .DSN untuk simulasi Proteus ISIS, buka dengan Proteus versi 7.4sp3 atau yang lebih baru.

Link download pending dolo, ntar nunggu kalo ada yang request ya gan, minimal tiga orang yang IP-Address nya beda-beda komentar dan request :D. Silahkan dikomeng, awas kalo gak komeng ^^”
NB: Cocok juga bwt tugas kuliah :D ^^” kalo disuruh bwt contoh aplikasi sensor..