Hallo teman-teman semuanya, kali ini saya akan mem-posting sebuah tutorial untuk membaca banyak sensor suhu LM-35 menggunakan mikrokontroler Atmega 16. Wah, pastinya penasaran banget ya, gimana cara membaca banyak sensor, tetapi dengan menggunakan pin input/output sedikit saja.
Keterbatasan jumlah pin pada sebuah mikrokontroler, membuat kita harus berpikir bagaimana cara agar dapat membaca banyak sensor tetapi dengan jumlah penggunaan pin yang sedikit. Misalnya kita ingin membaca sensor suhu dengan jumlah yang mencapai puluhan sensor. Dan, jika kita mengacu pada datasheet mikrokontroler Atmega 16 jumlah pin ADC (Analog Digital Converter) hanya berjumlah 8 pin. Jumlah pin ADC yang sedikit ini hanya bisa dipakai maksimum 8 sensor suhu LM 35 saja, sedangkan jumlah pin lainnya tidak dapat digunakan, kecuali jika menggunakan sensor suhu digital.
Sekilas Tentang Atmega 16
ATmega16 adalah mikrokontroler CMOS 8-bit mengkonsumsi daya rendah yang menggunakan arsitektur RISC keluarga AVR buatan Atmel. AVR mempunyai 32 register general-purpose, timer/counter dengan metode compare, interrupt eksternal dan internal, serial UART, progammable Watchdog Timer, ADC (Analog Digital Converter atau konversi dari sinyal analog ke digital) dan PWM (Pulse Width Modulation atau Modulasi Lebar Pulsa) internal. Dengan menjalankan instruksi satu siklus clock tunggal, ATmega16 dapat mencapai throughput mendekati 1 MIPS per MHz yang memungkinkan perancang sistem untuk mengoptimalkan konsumsi daya dibandingkan kecepatan pemrosesan. Atmega 16 memiliki batas maksimum throughput yaitu 16 MIPS pada 16 MHz[1][2]. Kecepatan clock tersebut sudah mencukupi untuk menjalankan aplikasi skala kecil yang tidak membutuhkan perhitungan yang cepat.
Ada banyak sekali jenis-jenis mikrokontroler AVR keluaran Atmel, seperti: Atmega 8, Atmega 16, Atmega 32, Atmega 128, dll. Mikrokontroler seri AVR juga dipakai oleh Arduino, misalnya pada Arduino UNO menggunakan Atmega328. Berikut diagram pin Atmega 16 seri DIP (Dual Inline Package) dan TQFP/QFN/MLF,
Teman-teman bisa men-download datasheet mikrokontroler Atmega 16 disini (klik tulisan biru, disini). Dan, berikut fitur-fitur yang dimiliki oleh Atmega 16,
Cukup untuk sekilas tentang Atmega 16, selebuhnya bisa dibaca-baca pada datasheet yang link download-nya sudah saya sediakan.
Sekilas Tentang Sensor Suhu Analog LM 35
Selanjutnya kita akan membahas sekilas tenang sensor suhu analog LM 35. Sensor suhu LM 35 banyak digunakan dalam perancangan instrumentasi pengukur suhu. Penggunaan sensor LM 35 pun tidak begitu sulit dan harganya pun cukup murah, mulai dari Rp 8.000 sampai Rp 26.000 di toko online, dan untuk mendapatkannya pun tidak begitu sulit.
Sensor suhu seri LM35 adalah sebuah sensor suhu dengan sirkuit terpadu yang sangat presisi, tegangan outputnya berbanding lurus dengan suhu Celcius (Celcius). Sensor suhu LM35 tidak memerlukan kalibrasi tambahan untuk mendapatkan akurasi pembacaan suhu khas ±¼° C pada suhu kamar dan ±3⁄4° C lebih pada kisaran −55 hingga +150° C. Dan, teman-teman juga dapat men-download datasheet sensor LM 35 disini.
Berikut adalah fitur lengkap yang dimiliki oleh sensor LM 35;
Sekian untuk sekilas tentang sensor Lm35.
Memprogram 24 Sensor Suhu LM 35
Oke, kita langsung saja membahas poin inti dari artikel ini yaitu memprogram 24 sensor suhu menggunakan 3 multiplekser pada Atmega 16. Pembahasan multiplekser dapat dibaca pada artikel saya yang berjudul “Membaca 40 Sensor ADC Menggunakan Arduino Uno dengan IC Multiplekser“. Pada artikel ini saya tidak membahas lagi cara kerja multiplekser, jadi kita bisa langsung membahas pada rangkaian elektronikanya saja. Berikut rangkaian elektronika yang saya buat menggunakan software proteus 8.
Dan, berikut program yang saya buat menggunakan software CodeVision AVR 3.12, dan saya sertakan juga pengaturan CV AVR nya agar memudahkan dalam memprogram proyek kita ini.
- Settingan Chip
Atur Chip menjadi ATmega16 dengan clock yang saya gunakan adalah 11,059200 MHz. Untuk memudahkan dapat dilihat pada gambar 6 berikut ini:
- Settingan ADC
Atur ADC menjadi enabled dan jangan mencentang Use 8 bits agar kita mendapatkan nilai bacaan dengan tingkat presisi sebesar 10 bit yaitu dari 210 atau 0-1023.
- Settingan pin I/O
Atur PORT B pada pin 1-3 atau bit 0-2 menjadi out, karena pin ini akan kita gunakan sebagai pengontrol (selektor) pin input IC multiplekser.
- Settingan pin LCD
Atur pin LCD menjadi Enabled dan line menjadi 20, karena disini kita akan menggunakan LCD 20×4 dan atur PORT pada PORT C semuanya.
Terakhir, berikut program lengkapnya, dan saya buat sangat sederhana saja karena disini kita berfokus pada dasar kerja program pada IC multiplekser, kedepannya teman-teman dapat memodifikasinya sesuai dengan kebutuhan masing-masing. Kode program juga dapat di download langsung di repo github penulis berikut https://github.com/Wayan123/ATmega16-Multiplexer.
/***************************************************** 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.comProject : Version : Date : 08/01/2016 Author : Wayan Dadang Company : Sains Lab Comments: Chip type : ATmega16A Program type : Application AVR Core Clock frequency: 11.059200 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/#include <mega16a.h> #include <stdio.h> #include <stdlib.h> #include <delay.h> unsigned char buff[21],buff1[21],buff2[21],buff3[21],buff4[21],buff5[21],buff6[21],buff7[21]; unsigned char buff8[21],buff9[21],buff10[21],buff11[21],buff12[21],buff13[21],buff14[21],buff15[21]; unsigned char buff16[21],buff17[21],buff18[21],buff19[21],buff20[21],buff21[21],buff22[21],buff23[21]; unsigned char looper; unsigned char temp; unsigned int sensor_data[8],sensor_data1[8],sensor_data2[8]; float suhu_celcius[8],suhu_celcius1[8],suhu_celcius2[8];
// Alphanumeric LCD functions // Read the AD conversion result // Declare your global variables here void main(void) // Input/Output Ports initialization // Port B initialization // Port C initialization // Port D initialization // Timer/Counter 0 initialization // Timer/Counter 1 initialization // Timer/Counter 2 initialization // External Interrupt(s) initialization // Timer(s)/Counter(s) Interrupt(s) initialization // USART initialization // Analog Comparator initialization // ADC initialization // SPI initialization // TWI initialization // Alphanumeric LCD initialization while (1) for (looper = 0; looper < 8; looper++) temp = PORTB; sensor_data[looper] = read_adc(0); suhu_celcius[looper] = (float)sensor_data[looper]*500/1023; //rumus untuk mengubah kedalam derajat celcius } ftoa(suhu_celcius[0],0,buff); ftoa(suhu_celcius1[0],0,buff8); ftoa(suhu_celcius2[0],0,buff16); lcd_gotoxy(3,1); lcd_gotoxy(6,2); lcd_gotoxy(11,3); } |
Nah selesai sudah artikel ini, jika ada pertanyaan dapat disampaikan pada kolom koemntar dan semoga bermanfaat.
Dan berikut video demonya;
[embedyt] https://www.youtube.com/watch?v=QjhpC2sSQ7o[/embedyt]
Refrensi:
- Atmel, atmega16 datasheet PDF
- Wikipedia Indonesia, Atmega 16 (https://id.wikipedia.org/wiki/ATMega16) diakses pada tanggal 31 Oktober 2016
- Texas Instruments (National Semiconductor), LM35 Precision Centigrade Temperature Sensors