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


Kusuma Wardana 07 Jun 2016 Elektronika

Mulai Baca

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

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 :)

Komentar

Pak Profesor..arduino yg sudah built in RTCnya yg seri apa ya?

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...

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

Wedew... puyeng liat itu coding... masternya mana nih

HTSL://HIGH THINKING SIMPLE LIVING . ME

Kusuma Wardana

Tentang Penulis, Kusuma Wardana

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 Negeri Bali. Ia menjadi salah satu penulis di tutorkeren.com bersama Aditya Suranata dan Agus Ady Aryanto.

lihat artikel lain oleh Kusuma Wardana

Artikel Lainnya

Kategori Tulisan

E-Book Terbaru

Teknik Antarmuka MATLAB dan Arduino

Teknik Antarmuka MATLAB dan Arduino - Cover.jpg
Pelajari konsep yang sangat luar biasa antara visualisasi, analisis dan komputasi yang ditawarkan MATLAB dengan Platform Arduino sebagai perangkat...
Jumlah Halaman:
411 Halaman

Video Terbaru

Belum Puas ? Mari Kita Saling Bicara


Join Forum Diskusi MiaranaDIY untuk berdiskusi dengan respon cepat mengenai berbagai macam tutorial hingga ulasan yang terdapat di blog ini. Untuk berlangganan artikel terbaru silahkan Like & Follow Facebook Page MiaranaDIY dan Follow Twitter @MiaranaDIY