Membuat Timer Digital untuk Lampu Otomatis - Elang Sakti
Download Ebook Belajar Arduino PDF, Arduino untuk pemula
Jasa Pembuatan Program Arduino, pemrograman Arduino
# Hack Your Skills! to be Professional Mechatronics

Membuat Timer Digital untuk Lampu Otomatis

12 komentar
Membuat Timer Digital untuk Lampu Otomatis

Salah satu implementasi dari timer digital adalah untuk membuat lampu otomatis. Sebelumnya kita telah membuat lampu otomatis dengan LDR [1], pembuatannya gampang, murah, dan peralatannya pun simpel. Akan tetapi, beberapa kendala yang sering dialami ketika menggunakan LDR sebagai lampu otomatis yaitu tergantung cahaya, jika siang hari cuaca mendung, maka jika tidak pas settingan LDR-nya, maka lampu akan menyala. Jika malam hari ada lampu sorot yang kuat mengenai LDR, maka lampu akan mati.

Baca juga : Timer Switch Relay Digital untuk Pompa Grease

Selain menggunakan LDR, kita bisa menggunakan timer digital untuk menghidup-matikan lampu sesuai waktu yang sudah ditentukan. Misal, jam 5 pagi - jam 6 sore lampu mati, lalu jam 6 sore - 5 pagi lampu mati.

Ini adalah cara yang agak kompleks untuk membuat lampu rumah otomatis. Cara dan alat yang sederhana adalah dengan >> Fitting Lampu Otomatis. Alat ini sederhana, gampang, dan siap pakai.

Alasan tidak Menggunakan Arduino Uno

Ada banyak cara dan banyak IC yang bisa kita program untuk membuat timer digital. Misalnya, sebelumnya kita sudah membahas tentang timer digital dengan arduino uno [2] dan timer digital denga mikrokontroller ATMega16A [3]. Dari kedua percobaan tersebut, tentu membuat program dengan arduino jauh lebih mudah. Akan tetapi karena sesuatu yang saya kerjakan dengan Arduino Uno tersebut, jadi terpaksa harus buat dengan ATMega16A yang tentu sedikit lebih susah. :D

ATMega16A dulu saya beli ketika pertama kali belajar tentang mikrokontroller. Waktu itu saya membeli trainer board, namanya DT-COMBO AVR-51 STARTER KIT. Fungsi trainer board tersebut tentu untuk pemula yang ingin belajar memprogram mikrokontroller. Dalam trainer board tersebut sudah disediakan socket untuk IC 20 pin dan 40 pin, 8 buah led, 8 buah switch, 1 buah LCD 8x2, dan project board kecil. Yah, cukuplah untuk pemula. :)

Akhirnya, daripada menggunakan Arduino, mending pake trainer board itu, toh sudah setahunan tidak terpakai. :)

Requirement dan Peralatan Sistem Timer Digital untuk Lampu Otomatis

Sistem ini bisa menentukan waktu secara tepat. Oleh sebab itu, mau tidak mau kita harus menggunakan modul timer yang terus-menerus nyala sepanjang waktu. Kita bisa saja membuat perulangan untuk menentukan clock waktu, tapi jika sistem tersebut mati, maka waktunya akan kacau balau. Untuk menentukan waktu, kita akan menggunakan modul RTC DS1302. Kita akan memanfaatkan project yang pernah kita lakukan sebelumnya [3].

Waktu ditampilkan ke layar LCD. Pada trainer board sudah ada LCD 8x2 dan sebelumnya kita juga sudah bermain-main dengan LCD ini [4]. Karena LCD ini terdiri dari 2 baris dan 8 kolom, maka baris pertama kita tampilkan informasi tanggal dan baris kedua untuk menampilkan informasi jam. Karena hanya ada 8 karakter, maka format tanggal yang akan kita gunakan adalah DD/MM/YY dan format waktu adalah HH:MM:SS. Detik pada LCD juga akan berubah setiap detik tentunya. :)

Bisa mengontrol lampu. Untuk pengontrol lampu, yang kita butuhkan adalah Relay. Kebetulan sekali relay yang saya punya saat ini hanya relay 12 volt, sehingga agar bisa mendrive relay tersebut kita butuh tambahan komponen. Tambahan komponen yang mungkin ada 2 cara :
  • Membuat boost converter dari 5 volt ke 7.5 - 12 volt (relay ini ternyata bisa aktif sejak 7.2 volt)
  • Tambahan voltase 12 volt dan membuat sakelar digital dengan transistor NPN untuk mengaktifkan relay

Dari kedua opsi tersebut, saya lebih memilih opsi yang kedua karena opsi yang pertama saya belum pernah buat, HAHA. Bukan begitu, sebelumnya kita sudah pernah membuat project bagaimana mendrive relay 12 volt dengan 3 volt dengan transistor [5]. Jadi, kita akan menggunakan rangkaian tersebut untuk lampu otomatis ini.

Indikator bahwa sistem berjalan dengan baik. Sebenarnya indikator ini bisa dilihat dari tampilan LCD. Tapi begini, saya belum benar-benar memahami cara kerja LCD ini sebab referensi tentang LCD ini masih minim. Ada masalah ketika menggunakan LCD dengan clock yang tinggi, misal 11.0592, maka tampilan LCD kacau. Tampilan LCD normal ketika clock yang saya pakai 1MHz.

Nah, karena waktunya mepet dan sistem ini harus segera diuiji, maka kita akan menggunakan clock 1MHz untuk lampu otomatis nanti. Sehingga untuk memastikan sistem berjalan dengan normal, maka kita akan membuat indikator dengan LED. LED akan menyala bergantian sesuai dengan detak detik. Dengan LED, kita bisa melihat dari jauh dan mencocokkannya dengan detak jam, jika detaknya seirama, berarti sistem normal dan berjalan dengan baik.

Berdasarkan requirement di atas, maka kita butuh:
- Timer, menggunakan RTC DS1302
- LCD, menggunaan LCD 8x2 model CFAH0802A (builtin dalam trainer kit)
- Relay, menggunakan relay 12 volt + Transistor C9013 + resistor 10k ohm
- LED + resistor 1k ohm
- Power supply 5 volt dan 12 volt (built in dalam trainer kit)
- Beberapa kabel jumper

Rangkaian Lampu Otomatis

Rangkaian Timer digital dengan ATMega16A untuk lampu otomatis
Rangkaian Timer digital dengan ATMega16A untuk lampu otomatis (klik - perbesar)
Pada dasarnyanya, rangkain ini tidak hanya bisa untuk membuat lampu otomatis. Rangkain ini juga bisa digunakan untuk penyiram tanaman otomatis, pemberikan makan ayam otomatsi, pemberian makan ikan otomatis, dan beberapa rutinitas harian yang sudah tertentu jamnya. Rangkaian ini juga bisa dikembangkan untuk mendrive relay sesuai dengan tanggal dan waktu.

Program Timer Lampu Otomatis

Dalam membuat timer berarti kita akan bemain dengan jam. Berbeda dengan bahasa pemrograman yang biasa dijalankan untuk komputer seperti PC, laptop, dan smartphone. Tanggal dan waktu pada pemrograman aplikasi biasanya cukup dengan:

if( NOW > time_awal && NOW < time_akhir )

Tapi untuk pemrograman yang kita lakukan ini tidak mengenal perintah tersebut. Jadi mau tidak mau harus mencari cara agar bisa menentukan apakah waktu sekarang harus menghidupkan relay atau tidak. Nah, cara yang saya gunakan adalah menggabungkan jam dan menjadi satu nilai. Jika sekarang jam 10.30 maka akan dikonversi menjadi 1030, jika sekarang jam 9.45 maka akan dikonversi menjadi 945. Oleh sebab itu, kita akan menggunakan format jam 00-23, kalau menggunakan AM/PM, kita akan kesulitan.

Untuk mendapatkan nilai tersebut, maka jam akan dikalikan 100, kemudian ditambah dengan menit. Setidaknya konversi untuk setiap jam akan seperti ini:
0000 => jam 12:00 malam
0145 => jam  1:45 pagi
0412 => jam  4:12 subuh
0523 => jam  5:23 pagi
1245 => jam 12:45 siang
1532 => jam  3:32 sore
1745 => jam  5:45 sore
dst..

Waktu lampu yang saya pilih untuk dihidupkan adalah antara jam 5.30 sore hingga 5.30 pagi, atau kalau dikonversi akan menjadi 1730 - 530. Sehingga logika yang mungkin kita pakai adalah:
if(NOW > 1730 && NOW < 530) lampu ON;
atau
if(NOW > 530 && NOW < 1730) lampu OFF;

Itu sekilas tentang dasar teori bagaimana menentukan relay mati atau hidup. Berikut ini adalah full source code untuk sistem ini.

/*
 * Timer dengan ATMega16A-PU untuk Lampu Otomatis
 * Clock Internal 1MHz
 * Timer dengan RTC DS1302
 * LED sebagai indikator detik
 * LCD 8x2 model CFAH0802A untuk menampilkan tanggal dan waktu
 * Transistor NPN 1903 untuk mendrive Relay 12 volt
 * Relay 12 volt untuk mengontrol lampu
 * Board yang dipakai adalah DT-COMBO AVR-51 Starter Kit
 *
 * coder : haripinter
 */
 
#include <mega16a.h>

// RTC pada PORT A pin 3, 5, 7
#asm
    .equ __ds1302_port=0x1b
    .equ __ds1302_io=5
    .equ __ds1302_sclk=3
    .equ __ds1302_rst=7
#endasm

#include <ds1302.h>
#include <stdio.h>
#include <delay.h>

// RELAY pada PORTB pin 0
#define DDR_RELAY DDRB.0
#define RELAY PORTB.0

// LCD CFAH0802A pada PORTD
#define LCD_PORT PORTD
#define LCD_PIN PIND
#define LCD_DDR DDRD

// Kontrol LCD pada PORTC pin 1, 6, dan 7
#define CMD_DDR DDRC
#define CMD_PORT PORTC
#define CMD_RS PORTC.1
#define CMD_RW PORTC.7
#define CMD_EN PORTC.6

// LED Indikator pada PORTC pin 0
#define LED PORTC.0

// fungsi untuk LCD
void LCD_init(void);
void LCD_cmd(unsigned char cmd);
void LCD_char(unsigned char data);
void LCD_string(unsigned char data[]);
void LCD_ready(void);
void LCD_linecol(unsigned char line,unsigned char col);
unsigned char LCD_busy(void);


unsigned char hour, min, sec, day, month, year;
int last_detik = 0;
int jam_menit = 0;
char *elang = "elang";
char *sakti = "sakti";

void main(void){
    // LCD dan RELAY sebagai output
    CMD_DDR = 0xFF;
    DDR_RELAY = 1;
    
    // inisialisasi rtc, aktifkan dioda charger
    rtc_init(1,1,3); 
    
    // inisialisasi LCD
    LCD_init();
    
    while(1){
        // Ambil jam-menit-detik dari RTC
        rtc_get_time(&hour, &min, &sec);
        
        // jika detik berubah, set tampilan LCD dan atur kedipan LED
        if(last_detik != sec){
        
            // konversi jam dan menit menjadi nilai integer
            jam_menit = hour*100 + min;
            
            // ambil tanggal dan tampilkan ke LCD
            rtc_get_date(&day, &month, &year); 
            LCD_linecol(1,2);
            if(LED == 1){
                sprintf(elang,"    %04d",jam_menit);
            }else{                              
                sprintf(elang,"%02d/%02d/%02d",day,month,year);
            }
            LCD_string(elang);
            
            LCD_linecol(2,0);
            sprintf(sakti,"%02d:%02d:%02d",hour,min,sec);
            LCD_string(sakti);
            
            if(LED == 0){
                LED = 1;
            }else{
                LED = 0;
            }
            
            last_detik = sec;
        }
               
        // lampu off antara 05.30 - 17.30
        // > 530 && < 1730  ---> relay ON
        // settingan relay NC (normally close)
        // agar kalau ada problem di uC, lampu terus nyala
        if(jam_menit > 530 && jam_menit < 1730){
            RELAY = 1;
        }else{
            RELAY = 0;
        } 
    }
}

void LCD_init(void){
    delay_ms(50);
    LCD_cmd(0b00111000); //0b0011NF00 f-set
    delay_ms(1);
    
    LCD_cmd(0b00111000); //0b0011NF00 f-set
    delay_ms(1);
    
    LCD_cmd(0b00001111); //0b00001DCB on
    LCD_ready();
    delay_ms(1);
    
    LCD_cmd(0b00000001); //0b00000001 clear
    LCD_ready();
    delay_ms(1);
    
    LCD_cmd(0b00000110); //0b000001DS entrymode
    LCD_ready();
    delay_ms(1);
}
 
void LCD_cmd(unsigned char cmd){
    LCD_DDR = 0xFF;
    
    CMD_RS = 0;
    CMD_RW = 0;
    CMD_EN = 1;
    LCD_PORT = cmd;
    CMD_EN = 0;
}
 
void LCD_linecol(unsigned char line,unsigned char col){
    unsigned char tmp;
    switch(line){
        case 1:
            tmp = 0x00 + col;
            break;
        case 2:
            tmp = 0xC0 + col;
            break;
    }
    LCD_cmd(tmp); 
}
 
void LCD_string(unsigned char data[]){
    int loop = 0;
    while(data[loop]!='\0'){
        LCD_char(data[loop]);
        LCD_ready();
        loop++;
    }
}
 
void LCD_char(unsigned char data){
    LCD_DDR = 0xFF;
    
    CMD_RS = 1;
    CMD_RW = 0;
    CMD_EN = 1;
    LCD_PORT = data;
    CMD_EN = 0;
}
 
void LCD_ready(void){
    while ((LCD_busy() & 0x80) == 0x80);
}
 
unsigned char LCD_busy(void){
    unsigned char tmp;
    CMD_DDR = 0xFF;
    CMD_RS = 0;
    CMD_RW = 1;
    CMD_EN = 1;
    tmp = LCD_PIN;
    CMD_EN = 0;
    return tmp;
}

Sedikit penjelasan tambahan untuk script di atas, untuk menentukan PORT yang digunakan untuk RTC yaitu konfigurasi pada baris berikut :

// RTC pada PORT A pin 3, 5, 7
#asm
  .equ __ds1302_port=0x1b
  .equ __ds1302_io=5
  .equ __ds1302_sclk=3
  .equ __ds1302_rst=7
#endasm

Pemilihan port 0x1B berarti adalah PORTA. Jika Anda ingin mengganti PORT-nya, maka Anda harus menggantinya. Penentuan nilai tersebut tergantung pada referensi kaki ATMega16A, yaitu pada file mega16a.h pada folder inc di folder instalasi CVAVR. Jika ingin mengganti dengan port yang lain, Anda berikut informasi nilai untuk PORTA-D:
- PORTA => 0x1B
- PORTB => 0x18
- PORTC => 0x15
- PORTD => 0x12
Sedangkan untuk io, sclk, dan rst disesuaikan dengan posisi kaki untuk port tersebut. Misal io = 5 berarti pada kaki PORTB.5 dan seterusnya.

Untuk penjelasan selanjutnya bisa Anda pelajari di source codenya, sebab di situ sudah saya jelaskan masing-masing barisnya. Jika ada yang kurang dipahami, jangan sungkan untuk bertanya. Semoga aplikasi timer digital untuk lampu otomatis ini berguna dan bisa berjalan dengan baik sampai saya balik dari mudik. ;D

Berikut ini video sekilas dari project ini, board ini memang gede dan lebar sebab memang tidak menggunakan sistem minimum, tapi menggunakan training board / trainer kit untuk belajar. Semoga bermanfaat, dan selamat menunaikan ibadah puasa dan mohon maaf lahir batin. :))




Written by Hari Santoso
Membuat Timer Digital untuk Lampu Otomatis
Bahasan: Salah satu implementasi dari timer digital adalah untuk membuat lampu otomatis . Sebelumnya kit...
Published at Selasa, 07 Juli 2015, Updated at Selasa, 07 Juli 2015
Reviewed by dr. on
Rating: 4.7

12 komentar :

  1. thank gan cuman ane pkai arduino uno gan... ada kodingnya ngk gan untuk arduino uno... masih awam nih hahah

    BalasHapus
  2. mas klau untuk arduino uno gimana mas, asih awam mas, saya memiliki arduino uno, rtcds3231, dan lcd 16x2, dan relay pengen buat penyiraman otomatis cuman bingung

    BalasHapus
    Balasan
    1. kalau untuk jenis rtc itu belum pernah pakai mas Masrudin, kalau untuk LCD bisa sampeyan cek di artikel lainnya di web ini :)

      Hapus
    2. bentar mas, sampeyan itu pakek source apa project ?

      Hapus
    3. ehm.. coba kirim'in aja program CVAVR nya sampean ke emailku mas .. biar aku pelajari nanti .. tolong mas yaa .. rizak.ramadhan@gmail.com

      Hapus
  3. gan pas saya build, eror + disuruh menduplikat '_lcd_init:'.. nahh gimana tuh gan ?

    BalasHapus
    Balasan
    1. mas Rizak, nanti dicompile ulang dan paste errornya di sini ya..
      kita cek, mungkin ada pesan selain disuruh untuk menduplikat '__lcd_init:'

      Hapus
  4. udah aku compile trus eror gan .. lalu muncul "Percobaan3.asm". di "Percobaan3.asm" itu muncul eror kayak gini "Error: D:\Data Rizak\Percobaan3\List\Percobaan3.asm(1960): Duplicate label: '_LCD_init' ".

    BalasHapus
    Balasan
    1. saya di sini pakai CodeVision AVR, kalau mas Rizak juga pakai Codevision, coba method LCD_init diganti dengan nama lainnya mas. Kalau dari pesan errornya sih, method LCD_init lebih dari satu.

      Hapus
  5. alhamdulillah udah gk eror waktu di compile ,,cuma ada warning 1 gan

    BalasHapus
  6. gan ane udah ikutin rancangan sama program CVAVRnya, pas di compile gk ada error, cuman pas programnya di start di proteus lampu LED nya gk nyala gan, kira2 itu kenapa ya gan ?

    BalasHapus