[TUTORIAL] Menggunakan Real Time Clock (RTC) pada Arduino

Untuk aplikasi tertentu, penggunaan Real-Time Clock (RTC) pada Arduino sangat diperlukan, misalnya pada aplikasi penjadwalan, dan sebagainya. Mari kita simak tutorial bagaimana cara menggunakan RTC pada Arduino.


on Sel, 06/07/2016 - 09:53
91.889 View

Pendahuluan

RTC merupakan komponen yang diperlukan untuk memberikan informasi mengenai waktu. Waktu disini dapat berupa detik, menit, hari, bulan dan tahun. Arduino (misalnya UNO) tidak dilengkapi secara internal dengan RTC. Dengan demikian, untuk aplikasi yang memerlukan pewaktuan, kita harus menyertakannya secara tersendiri. Agar tetap dapat bekerja, sebuah RTC dilengkapi dengan baterai, yang umumnya orang-orang menyebutkannya sebagai baterai "CMOS". Pada tutorial ini, kita akan menggunakan RTC dengan chip DS3231. Selain DS3231, contoh chip lain misalnya DS1307 atau DS1302.

Hardware

Siapkanlah modul RTC DS3231, sebuah papan Arduino (disini kita gunakan UNO) dan beberapa kabel jumper. Rangkailah seperti pada Gambar 1. Tergantung modul yang kita beli, umumnya terdapat beberapa pin pada modul RTC kita. Namun, yang pokok terdapat empat buah pin, yaitu VCC, GND, SDA, dan SCL. SDA (Serial Data) dan SCL (Serial Clock) adalah dua pin unik untuk berkomunikasi secara I2C (Inter-Integrated Circuit). Pada tutorial kali ini, kita tidak akan membahas I2C secara detail. Sambungkan SDA dengan pin A4 pada Arduino, dan SCL dengan pin A5, seperti pada tabel berikut:

Tabel 1. Konfigurasi Pin RTC dan Arduino

Pin RTCPin Arduino
VCC5V
GNDGND
SDAA4
SCLA5

[[{"fid":"769","view_mode":"default","fields":{"format":"default","field_file_image_alt_text[und][0][value]":"RTC-Arduino","field_file_image_title_text[und][0][value]":"RTC-Arduino"},"type":"media","link_text":null,"attributes":{"alt":"RTC-Arduino","title":"RTC-Arduino","height":"427","width":"482","class":"media-element file-default"}}]]

Gambar 1. Konfigurasi pin-pin RTC dan Arduino UNO

Software

Pertama, unduhlah pustaka untuk RTC kita pada pada file yang telah disertakan pada tutorial ini. Library ini sedikit Penulis modifikasi, yaitu mengubah nama hari dan bulan yang dalam bahasa Inggris menjadi Bahasa Indonesia.

Jika telah selesai mengunduh, Import-lah pustaka tersebut ke library Arduino kita. Caranya, buka IDE Arduino, cari Sketch ->Include Library -> Add .ZIP Library... . Selanjutnya, ketiklah program untuk seting pertama kali RTC kita, sebagai berikut:

#include <DS3231.h>

DS3231  rtc(SDA, SCL);

void setup()
{
  Serial.begin(9600);  
  rtc.begin();
  // Seting waktu saat pertama kali RTC digunakan
  rtc.setDOW(SELASA);           // Set Hari
  rtc.setTime(23, 01, 00);      // Set waktu JJ:MM:DD (24hr format)
  rtc.setDate(20, 9, 2016);     // Set tanggal 20 September 2016

  //Selanjutnya, informasi berikut dapat diambil sesuai kebutuhan kita
  Serial.println(rtc.getDOWStr(FORMAT_SHORT));    //tampilkan hari dalam format singkat
  Serial.println(rtc.getDOWStr(FORMAT_LONG));     //tampilkan hari dalam format panjang
  Serial.println(rtc.getMonthStr(FORMAT_SHORT));  //tampilkan bulan dalam format singkat
  Serial.println(rtc.getMonthStr(FORMAT_LONG));   //tampilkan bulan dalam format panjang
  Serial.println(rtc.getDateStr());               //tampilkan tanggal
  Serial.println(rtc.getTimeStr());               //tampilkan waktu
  Serial.println(rtc.getUnixTime(rtc.getTime())); //konvert ke Unix time  
}

void loop()
{
   //tidak melakukan apa-apa
}

Hasil yang ditampilkan pada Serial Monitor adalah sebagai berikut:

Sel
Selasa
Sep
September
20.09.2016
23:01:00
1474412460

Seting cukup dilakukan hanya sekali. Selanjutnya, RTC kita siap digunakan sesuai kebutuhan. Misal, kita gunakan untuk melihat hari dan waktu saat ini:

#include <DS3231.h>

DS3231  rtc(SDA, SCL);
Time waktu;

void setup()
{
  Serial.begin(9600);  
  rtc.begin();
}

void loop()
{
  //tampilkan hari
  Serial.println(rtc.getDOWStr(FORMAT_LONG));

  //ambil waktu
  waktu = rtc.getTime();
  int dataJam = waktu.hour;     
  int dataMenit = waktu.min;
  int dataDetik = waktu.sec;
  Serial.print(dataJam);
  Serial.print(':');
  Serial.print(dataMenit);
  Serial.print(':');
  Serial.println(dataDetik);
  delay(1000);
}

Hasil yang ditampilkan pada Serial Monitor adalah sebagai berikut:
Selasa
23:13:2
Selasa
23:13:3
Selasa
23:13:4
Selasa
23:13:5
Selasa
23:13:6
Selasa
23:13:7

Demikian tutorial kali ini. Semoga bermanfaat :)

Profil Penulis

User Picture
  • Member Since 9 tahun 4 bulan ago
Kusuma Wardana

MATLAB, Mikrokontroler, FPGA, Elektronika, Kontrol/Kendali, Signal Processing

I Nyoman Kusuma Wardana, yang akrab dipanggil Kusuma, lahir dan besar di Bali. Ia tinggal di Desa Wisata Ubud, dan lebih banyak melaksanakan aktivitasnya di Denpasar. Profesinya adalah sebagai staf pengajar di Jurusan Teknik Elektro, Politeknik...

Comments

Setahu saya untuk Arduino belum ada Frans. Secara fundamental Mikrokontroler ATmega328 dapat dibuat RTC. Pada datasheet ada keterangan "Real Time Counter with Separate Oscillator". Tapi malah jadi ribet. Paling gampangnya kita beli terpisah saja, Frans.. hehe. Terima kasih sudah berkunjung...

Jum, 06/10/2016 - 10:06 Link permanen

permisi mau tanya , kalau program nya kayak gini , hasil waktunya tidak menentu . tolong bantuannya #include #define CS_PIN 10 #include "U8glib.h" DS3231 rtc(SDA, SCL); Time waktu; U8GLIB_ST7920_128X64_1X u8g(CS_PIN); int ledPin = 13; // Memilih pin indikator LED int inputPin = 2; // Memilih input PIR Sensor int pirState = LOW; // Pada saat mulai, Matikan sensor int val = 0; // Variable pembaca status pin int pinSpeaker = 9; // Memilih pin buzzer, dengan pin PWM void peringatan1(){ u8g.setFont(u8g_font_6x10); u8g.drawStr( 29, 35, "SISTEM AKTIF"); u8g.drawFrame(5,5,117,54); u8g.drawFrame(3,3,121,58); } void peringatan2(){ u8g.setFont(u8g_font_6x10); u8g.drawStr( 29, 35, "SISTEM AKTIF"); u8g.drawFrame(5,5,117,54); u8g.drawFrame(3,3,121,58); } void setup() { pinMode(ledPin, OUTPUT); // jadikan LED sebagai Output pinMode(inputPin, INPUT); // jadikan Sensor sebagai Input pinMode(pinSpeaker, OUTPUT); // jadikan buzzer sebagai output Serial.begin(9600); rtc.begin(); u8g.firstPage(); do { peringatan1(); }while(u8g.nextPage()); delay(3000); } void loop() { Serial.println(rtc.getDOWStr(FORMAT_LONG)); waktu = rtc.getTime(); int dataJam = waktu.hour; int dataMenit = waktu.min; int dataDetik = waktu.sec; Serial.print(dataJam); Serial.print(':'); Serial.print(dataMenit); Serial.print(':'); Serial.println(dataDetik); delay(1000); val = digitalRead(inputPin); if (val == HIGH) { digitalWrite(ledPin, HIGH); playTone(300, 160); delay(150); u8g.firstPage(); do { u8g.setFont(u8g_font_courB14); u8g.drawStr( 10, 30, "ADA MALING"); u8g.drawStr( 30, 46, "HUB 117"); u8g.drawFrame(5,5,117,54); u8g.drawFrame(3,3,121,58); }while(u8g.nextPage()); if (pirState == LOW) { Serial.println("Terdeteksi suatu pergerakan!"); pirState = HIGH; } } else { digitalWrite(ledPin, LOW); playTone(0, 0); delay(300); if (pirState == HIGH){ Serial.println("Motion ended!"); pirState = LOW; u8g.firstPage(); do { peringatan2(); }while(u8g.nextPage()); delay(3000); } } } void playTone(long duration, int freq) { duration *= 1000; int period = (1.0 / freq) * 1000000; long elapsed_time = 0; while (elapsed_time < duration) { digitalWrite(pinSpeaker,HIGH); delayMicroseconds(period / 2); digitalWrite(pinSpeaker, LOW); delayMicroseconds(period / 2); elapsed_time += (period); } } ps : itu programnya langsung saya gabung
Sen, 06/05/2017 - 13:58 Link permanen