Menguji Rangkaian & Source Code RTC DS1302 + Arduino Uno - Elang Sakti
Download Ebook Belajar Arduino PDF, Arduino untuk pemula
Jasa Pembuatan Program Arduino, pemrograman Arduino
# Hack Your Skills! to be Professional Mechatronics

Menguji Rangkaian & Source Code RTC DS1302 + Arduino Uno

1 komentar
Yak, kali ini kita akan bercerita tentang modul Real Time Clock - RTC DS1302 dan Arduino Uno. Pada tulisan ini kita akan mencoba beberapa sampel source code dari library yang diposting oleh Playground Arduino dan beberapa keanehannya, atau lebih tepatnya, kita akan mencoba menganalisa source code yang error (sementara akan kita sebut error karena ini adalah tulisan awal dalam web ini tentang RTC). Artinya, kami baru mulai mempelajari RTC dan sampel awalnya adalah IC DS1302. :D

Untuk menggunakan RTC DS1302, selain membuat sendiri library prosedur komunikasinya, kita bisa menggunakan library yang sudah ada. Salah satu library yang bisa kita langsung gunakan adalah library yang dibuat oleh Henning Karlsen yang bis didownload di link ini [1]. Selain library untuk interfacing DS1302, kita juga butuh library Time, karena kita akan bermain dengan waktu. Library time yang kami pakai adalah versi 1.3 dan bisa Anda download di link ini [2].

Karena kami ingin buru-buru mencoba modul ini, maka kami tidak melakukan coding dari awal dan memilih untuk mencoba salah satu sampel bawaan dari library DS1302. File yang kami coba ada di folder DS1302_Serial dengan file bernama DS1302_Serial.ino. Berikut isi dari source code dalam file tersebut:

// DS1302_Serial_Easy (C)2010 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//
// Adopted for DS1302RTC library by Timur Maksimov 2014
//
// A quick demo of how to use my DS1302-library to
// quickly send time and date information over a serial link
//
// I assume you know how to connect the DS1302.
// DS1302:  CE pin    -> Arduino Digital 27
//          I/O pin   -> Arduino Digital 29
//          SCLK pin  -> Arduino Digital 31
//          VCC pin   -> Arduino Digital 33
//          GND pin   -> Arduino Digital 35

#include <Time.h>
#include <DS1302RTC.h>

// Set pins:  CE, IO,CLK
DS1302RTC RTC(27, 29, 31);

// Optional connection for RTC module
#define DS1302_GND_PIN 33
#define DS1302_VCC_PIN 35

void setup()
{

  // Setup Serial connection
  Serial.begin(9600);
  
  Serial.println("DS1302RTC Read Test");
  Serial.println("-------------------");
  
  // Activate RTC module
  digitalWrite(DS1302_GND_PIN, LOW);
  pinMode(DS1302_GND_PIN, OUTPUT);

  digitalWrite(DS1302_VCC_PIN, HIGH);
  pinMode(DS1302_VCC_PIN, OUTPUT);
  
  Serial.println("RTC module activated");
  Serial.println();
  delay(500);
  
  if (RTC.haltRTC()) {
    Serial.println("The DS1302 is stopped.  Please run the SetTime");
    Serial.println("example to initialize the time and begin running.");
    Serial.println();
  }
  if (!RTC.writeEN()) {
    Serial.println("The DS1302 is write protected. This normal.");
    Serial.println();
  }
  
  delay(5000);
}

void loop()
{
  tmElements_t tm;
  
  Serial.print("UNIX Time: ");
  Serial.print(RTC.get());

  if (! RTC.read(tm)) {
    Serial.print("  Time = ");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.print(", DoW = ");
    Serial.print(tm.Wday);
    Serial.println();
  } else {
    Serial.println("DS1302 read error!  Please check the circuitry.");
    Serial.println();
    delay(9000);
  }
  
  // Wait one second before repeating :)
  delay (1000);
}

void print2digits(int number) {
  if (number >= 0 && number < 10)
    Serial.write('0');
  Serial.print(number);
}

Sebelum mengcompile, biasanya kami membaca setiap baris dari source code yang akan kami coba tersebut dengan harapan bisa memahami alur program yang akan kami upload nanti. Dari hasil pembacaan sekilas tersebut, ada yang mengganjal di pikiran kami. Perhatikan pada baris 66, di situ ada perintah if (! RTC.read(tm)) {, artinya, jika RTC tidak bisa dibaca maka munculkan data waktu dan tanggal. Aneh. Kalau ndak bisa dibaca, tanggal apa yang mau dimunculkan? Untuk sekilas, okelah. Sebab kan belum baca semua dan baca file header dan file yang diimport.

Sekilas Tentang Modul RTC DS1302


Gambar Menguji Rangkaian & Source Code RTC DS1302 + Arduino Uno
Gambar Modul RTC DS1302
RTC DS1302 memiliki 5 pin yang bisa dihubungkan ke Arduino, pin-pin tersebut adalah VCC, GND, CE (RST), IO (DAT), dan SCLK (CLK). Dalam komunikasinya, kita membutuhkan 3 pin yang dikondisikan untuk membaca atau menulis data ke dalam RTC tersebut. Sebenarnya banyak karakteristik yang perlu diketahui tentang modul ini baik dari segi memory, konfigurasi pin, dan format data yang digunakan dalam modul tersebut. Akan tetapi, pada tulisan ini kami tidak akan membahasnya terlalu detail. Semoga pembahasan mendetail tentang modul ini bisa kita ulas pada beberapa artikel lainnya di website ini.

Rangkaian dan Source Code RTC DS1302 + Arduino Uno
Gambar rangkain RTC DS1302 dan Arduino Uno
Konfigurasi yang kami gunakan dalam percobaan ini terlihat seperti pada gambar di atas dan posisi pin-pinnya adalah sebagai berikut:
VCC pada pin 8
GND pada pin 9
RST pada pin 11
DAT pada pin 12
CLK pada pin 13

Sehingga script yang kami ubah adalah :
// Set pins:  CE, IO,CLK
DS1302RTC RTC(11, 12, 13);

// Optional connection for RTC module
#define DS1302_GND_PIN 9
#define DS1302_VCC_PIN 8

Hasil yang kami dapatkan setelah mengcompile dan mengupload pada arduino, muncul pesan error. Pesan error tadi ada kaitannya dengan bagian script yang kami curigai tadi. Berikut adalah pesan error yang muncul pada terminal. Pesan yang bunyinya, "DS1302 read error!  Please check the circuitry." Arti dari pesan tersebut adalah : COBA LAGI, DAN LEBIH TELITI! :D

Menguji Rangkaian & Source Code RTC DS1302 + Arduino Uno 1

Berdasarkan logika yang dipakai, tentu aneh, ketika kita ingin menampilkan sesuatu yang tidak bisa dibaca. Oleh sebab itu, kami iseng mengubah logika source code yang tadi menjadi if ( RTC.read(tm)) {, artinya, jika RTC bisa dibaca, tampilkan waktu dan tanggal. Setelah kami upload ke sistem, ternyata datanya keluar. Yang muncul adalah jam dan tanggal. Eng, tapi kenapa tanggal yang muncul tahunnya 2165? :D Padahal, menurut informasi yang ada pada link ini [3], data tahun pada modul ini terdiri dari 2 digit, yaitu dari 0 hingga 99. Yang artinya 2000 hingga 2099. Apakah data yang keluar tersebut benar? Entahlah. Yang pasti, jam yang muncul bertambah layaknya jam beneran :D.

Rangkaian & Source Code RTC DS1302 dan Arduino Uno

Pada gambar di atas, UNIX time bernilai 0. Apa itu UNIX time? Entahlah. Yang pasti data ini diambil dengan kode RTC.get(). Setelah ditelusuri, script tersebuat ada pada file library RTC DS1302, yaitu pada file DS1302RTC.cpp. Script untuk fungsi get() terdapat pada baris 51 yang isi lengkapnya adalah sebagai berikut :

// --------------------------------------------------------
// Read the current time from the RTC and return it as a 
// time_t value. Returns a zero value if an bus error occurred
// (e.g. RTC not present).
time_t DS1302RTC::get()
{
    tmElements_t tm;
    
    if ( read(tm) ) return 0;
    return( makeTime(tm) );
}

Nah, pada fungsi tersebut juga aneh. Perhatikan logika pada kode if ( read(tm) ) return 0;, artinya, sebelum kita melihat apa isi dari fungsi read(), maka baris tersebut setidaknya akan bermakna : jika tm bisa terbaca, maka nilai dari fungsi get adalah 0. Logikanya, jika variabel tm bisa terbaca, kenapa tidak ambil saja nilai tm? Berdasarkan rasa penasaran tersebut, kami mengganti mengubah logika script tersebut menjadi if (! read(tm) ) return 0; yang artinya, jika tm TIDAK bisa dibaca, maka beri nilai 0. Tapi jika kondisi tersebut tidak sesuai, maka tm bisa dibaca dan tm diproses dengan fungsi makeTime(tm). Dan ternyata hasilnya mirip dengan timestamp (eh, istilahnya timestamp atau bukan ya? :D). Yang pasti, setelah fungsi tersebut dirubah menjadi seperti ini :

// --------------------------------------------------------
// Read the current time from the RTC and return it as a 
// time_t value. Returns a zero value if an bus error occurred
// (e.g. RTC not present).
time_t DS1302RTC::get()
{
    tmElements_t tm;
    
    //if ( read(tm) ) return 0;
    if (! read(tm) ) return 0;
    return( makeTime(tm) );
}

Maka data yang keluar pada terminal setelah source code dicompile ulang adalah seperti berikut:

Contoh Rangkaian & Source Code RTC DS1302 + Arduino Uno

Dengan demikian, sepertinya data dari modul RTC sudah bisa terbaca (terlepas benar atau tidak data tersebut). Selanjutkan akan kami konfirmasi kebenaran data default dari modul RTC tersebut dan kami akan mencoba untuk mengganti data tanggal dan waktu dalam RT DS1302. Semoga tulisan ini bermanfaat dan selamat bermain-main dengan modul RTC DS1302. :)

Update 28/06/15

Ternyata kesalahan yang saya paparkan di atas hanya berlaku untuk modul DS1302 yang masih baru dan belum pernah dirubah data tanggalnya. Ketika saya mencoba sample yang kedua, yaitu sampel untuk ngeset data dalam modul DS1302 (file SetSerial.ino dalam folder SetSerial), maka ketika kembali mengupload file yang saya rubah di atas, maka akan terjadi error yang sama dengan ketika belum dimodifikasi.

So, source code library di atas tidak perlu dimodifikasi jika akan digunakan untuk RTC yang sudah diset dan disesuaikan tanggalnya. Tapi akan error jika tanggal belum pernah diset atau disesuaikan.


Referensi :
[1] http://playground.arduino.cc/uploads/Main/DS1302RTC.zip
[2] http://www.pjrc.com/teensy/arduino_libraries/Time.zip
[3] http://playground.arduino.cc/Main/DS1302

Written by ElangSakti
Menguji Rangkaian & Source Code RTC DS1302 + Arduino Uno
Bahasan: Yak, kali ini kita akan bercerita tentang modul Real Time Clock - RTC DS1302 dan Arduino Uno . Pada tulisan ini kita akan mencoba beberap...
Published at Jumat, 26 Juni 2015, Updated at Jumat, 26 Juni 2015
Reviewed by dr. on
Rating: 4.7

1 komentar :

  1. Gan, gimana caranya untuk mengatur waktu On/Off relay sesuai jadwal yang sudah kita tentukan?

    Saya menggunakan Arduino Uno R3 + Relay 4 Channel dan RTC DS1302, saya ingin mengontrol Relay secara otomatis berdasarkan waktu yang sudah diatur.
    Pin ang saya gunakan adalah, 2,3,4,5.

    Mohon bantuannya gan.

    BalasHapus