RTC atau Real-Time Clock adalah modul yang digunakan untuk mengukur waktu dan tanggal secara real-time. RTC digunakan dalam berbagai aplikasi seperti jam digital, sistem alarm, pemantauan energi, dan lain-lain. Salah satu RTC yang populer adalah RTC DS1307.
RTC DS1307 module adalah chip RTC yang memungkinkan penggunaannya dalam berbagai aplikasi yang memerlukan pengukuran waktu dan tanggal secara real-time. RTC DS1307 memiliki fitur-fitur seperti deteksi daya rendah, konsumsi daya rendah, dan memori SRAM 56-byte yang dapat diakses oleh mikrokontroler.

Berdasarkan RTC DS1307 datasheet yang bisa didowload disini,
Ic Real Time Clock DS1307 mempunyai konfigurasi pin RTC DS1307 sebagai berikut:
Pin 1-2 : Dipasang crystal oscillator 32.768 kHz
Crystal oscillator digunakan untuk menghasilkan sinyal osilasi yang stabil. RTC DS1307 menggunakan crystal oscillator 32.768 kHz.
Pin 3 : Pin dihubungkan dengan baterai 3V (CR2032)
Jika kita memasukkan baterai CR2032, itu membuat modul tetap berjalan saat daya utama dimatikan.
Jika tidak memasukkan baterai, informasi waktu akan hilang jika daya utama mati dan anda perlu mengatur waktu lagi
Pin 4 : Pin 0V
Pin 5 : Pin SDA: adalah pin serial data untuk antarmuka I2C.
Pin 6 : Pin SCL: adalah pin serial clock untuk antarmuka I2C.
Pin 7: Pin SQW : Menghasilkan output kotak yang frekuensinya bisa diset/diprogram dari 1Hz, 4kHz, 8kHz or 32kHz. Bisa dimanfaatkan misal dihubungkan dengan pin mikrokontroler untuk membuat blink detik.
Pin 8: Pin VCC: Supply tegangan untuk modul. Range tegangan dari 3.3V hingga 5.5V.
Pin yang biasa dipakai biasanya hanya 4 yaitu VCC,GND, SCL, SDA

Komponen-Komponen RTC DS1307
RTC DS1307 terdiri dari beberapa komponen penting seperti:
- Crystal Oscillator
Crystal oscillator digunakan untuk menghasilkan sinyal osilasi yang stabil. RTC DS1307 menggunakan crystal oscillator 32.768 kHz. - Clock Circuit
Clock circuit digunakan untuk menghitung waktu dan tanggal secara real-time. RTC DS1307 menggunakan chip RTC DS1307. - Battery Backup
Battery backup digunakan untuk menjaga waktu dan tanggal yang dihitung oleh RTC DS1307 ketika daya listrik sedang mati. RTC DS1307 menggunakan baterai CR2032. - Serial Interface
Serial interface digunakan untuk menghubungkan RTC DS1307 dengan mikrokontroler melalui protokol I2C. Kalau arduino uno pin scl yaitu pin A5 dan pin sda pin A4
Modul DS1307 sudah ada dipasaran seperti ini:

atau bisa membuat sendiri menggunakan modul pcb DS1307 yang telah kita buat, pcb ini didesain menggunakan software eagle, file PCB bisa didowload disini:

Pada artikel ini, akan dijelaskan tentang RTC DS1307 dan cara pemrogramannya menggunakan mikrokontroler.
Untuk rangkaian interface DS1307 dengan arduino uno seperti ini :

Cara Pemrograman RTC DS1307 Menggunakan Mikrokontroler
RTC DS1307 dapat diprogram menggunakan mikrokontroler seperti Arduino Uno. Pada bagian ini, akan dijelaskan tentang cara pemrograman RTC DS1307 menggunakan mikrokontroler.
Koneksi RTC DS1307 dengan Mikrokontroler
Sebelum memprogram RTC DS1307, pertama-tama lakukan koneksi antara RTC DS1307 dan mikrokontroler. Koneksi antara RTC DS1307 dan mikrokontroler dapat dilakukan menggunakan protokol I2C.
Berikut adalah koneksi RTC DS1307 dengan Arduino Uno:
SCL pada RTC DS1307 dihubungkan ke pin A5 pada Arduino
SDA pada RTC DS1307 dihubungkan ke pin A4 pada Arduino
VCC pada RTC DS1307 dihubungkan ke pin 5V pada Arduino
GND pada RTC DS1307 dihubungkan ke pin GND pada Arduino
Library RTC DS1307
Pertama-tama, download library RTC DS1307 untuk Arduino. Library ini dapat didownload dari website Arduino atau bisa didownload disini:
Setelah library RTC DS1307 didownload, bisa ditaruh di folder C:\Users(nama_user)\Documents\Arduino seperti ini

A. Set Waktu dan Tanggal pada RTC DS1307
Untuk mengatur waktu dan tanggal pada RTC DS1307, gunakan kode program berikut:
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;
void setup() {
Serial.begin(9600);
Wire.begin();
rtc.begin();
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Set date 22 January 2018,Time 17:16:
//set rtc
rtc.adjust(DateTime(2018, 1, 22, 17, 16, 0));
}
void loop() {
DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
delay(1000);
}
video simulasi proteus bisa dicek sebagai berikut:
filenya program bisa didownload disini.
dan untuk file proteusnya bisa didapatkan disini.
B. Membaca Waktu dan Tanggal dari RTC DS1307
Untuk membaca waktu dan tanggal dari RTC DS1307, gunakan kode program berikut:
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;
void setup() {
Serial.begin(9600);
Wire.begin();
rtc.begin();
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Set date 22 January 2018,Time 17:16:
//set rtc
//dikomen agar tidak dieksekusi jadi set sekali saja
//rtc.adjust(DateTime(2018, 1, 22, 17, 16, 0));
}
void loop() {
DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
delay(1000);
}
C. Mengatur output frekuensi SQW DS1307

#include <Wire.h>
#include "RTClib.h"
#define DS1307_I2C_ADDRESS 0x68
RTC_DS1307 rtc;
// writes data to location
void writeRTC(byte location, byte data)
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(location);
Wire.write(data);
Wire.endTransmission();
}
void setup() {
Serial.begin(9600);
Wire.begin();
rtc.begin();
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Set date 22 January 2018,Time 17:16:
//set rtc
//dikomen agar tidak dieksekusi jadi set sekali saja
rtc.adjust(DateTime(2018, 1, 22, 17, 16, 0));
writeRTC(0X07, B00010000);// 1Hz
//writeRTC(0X07, B00010001);//4.096 KHz
//writeRTC(0X07, B00010010);//8.192 KHz
//writeRTC(0X07, B00010011);//32.768 KHz
}
void loop() {
DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
delay(1000);
}
filenya program bisa didownload disini.
dan untuk file proteusnya bisa didapatkan disini.
D. Menyimpan Data pada SRAM RTC DS1307
RTC DS1307 memiliki memori SRAM 56-byte yang dapat digunakan untuk menyimpan data. Untuk menyimpan data pada SRAM RTC DS1307, gunakan kode program berikut:
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;
void setup() {
Serial.begin(9600);
Wire.begin();
rtc.begin();
}
void loop() {
byte data[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
rtc.writeSram(0, data, 10);
byte readData[10];
rtc.readSram(0, readData, 10);
for (int i = 0; i < 10; i++) {
Serial.print(readData[i]);
Serial.print(' ');
}
Serial.println();
delay(1000);
}
E. Pemanfaatan memori SRAM DS1307 sebagai pengganti eeprom untuk menyimpan data counter tombol
Pemanfaatan memori SRAM ini bisa digunakan misal untuk menyimpan data counter dari tombol, jika power dimatikan maka data counter terakhir masih tersimpan, tanpa harus menggunakan fitur eeprom dari mikrokontroler sendiri, dan enaknya lagi memory tanpa batas waktu write cycle seperti eeprom, selama baterai CR2032 masih cukup tegangannya data di SRAM masih tersimpan seperti data waktu.
Berikut programnya:
#include <Wire.h>
#include "RTClib.h"
//menamakan tombol yang ada di PIN 2 sebagai PIN_TOMBOL
#define PIN_TOMBOL 2
//maksimal counter 254;
unsigned char data_counter=0;
bool penanda=0;
RTC_DS1307 rtc;
void setup() {
Serial.begin(9600);
Wire.begin();
rtc.begin();
//init tombol sebagai input pullup
pinMode(PIN_TOMBOL, INPUT_PULLUP);
//membaca address 0 SRAM RTC DS1307 dan menampung pada variable data_counter
data_counter=rtc.readnvram(0);
//kirim data serial
Serial.print("Data Counter: ");Serial.println(data_counter);
}
void loop() {
//membaca tombol saat ada penekanan karena aktif low
if(digitalRead(PIN_TOMBOL)==LOW && penanda==0)
{
//untuk mengatasi bouncing
delay(10);
if(digitalRead(PIN_TOMBOL)==LOW)
{
//menambah data counter + 1
data_counter=data_counter+1;
rtc.writenvram(0,data_counter);
//kirim data serial
Serial.print("Data Counter: ");Serial.println(data_counter);
//agar mengunci tombol hanya bisa counter sekali
penanda=1;
}
}
//mengecek bila tombol dilepas
if(digitalRead(PIN_TOMBOL)==HIGH)
{
delay(10);
//mengembalikan penanda ke semula
penanda=0;
}
}
filenya program bisa didownload disini.
dan untuk file proteusnya bisa didapatkan disini.
F. Menampilkan data tanggal dan waktu RTC DS1307 dengan display LCD16x2 pada arduino uno
Rangkaian interface RTC DS1307 dan LCD 16×2 :

Library lcd16x2 yang digunakan bisa didownload disini
berikut adalah programnya:
#include <Wire.h>
#include "RTClib.h"
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 4, 5, 6, 7);
char data1[16];
char data2[16];
RTC_DS1307 rtc;
void setup() {
Serial.begin(9600);
Wire.begin();
rtc.begin();
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Set date 22 January 2018,Time 17:16:
//set rtc
//dikomen agar tidak dieksekusi jadi set sekali saja
rtc.adjust(DateTime(2018, 1, 22, 17, 16, 0));
lcd.begin(16, 2);
}
void loop() {
DateTime now = rtc.now();
Serial.print(now.day(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.year(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
lcd.setCursor(0, 0);
sprintf(data1,"%02d-%02d-%04d",now.day(),now.month(),now.year());
lcd.print(data1);
sprintf(data2,"%02d:%02d:%02d",now.hour(),now.minute(),now.second());
lcd.setCursor(0,1);
lcd.print(data2);
delay(1000);
}
Demo video Menampilkan data RTC DS1307 pada display LCD16x2 dengan kontroler arduino uno sebagai berikut:
filenya program bisa didownload disini.
dan untuk file simulasi proteusnya bisa didapatkan disini
G. Compiler CVAVR & Mikrokontroler ATMEGA 8
Selain diprogram dengan mikrokontroler arduino seperti contoh diatas, bisa juga diprogram menggunakan mikrokontroler lainnya, misal dengan compiler codevision avr (CVAVR) dengan chip atmega8.
Misal contoh membaca data rtc DS1307 dan mengirimkan data RTC DS1307 via serial :
Rangkain interface sebagai berikut:

Berikut video tutorialnya:
Programnya sebagai berikut :
#include <mega8.h>
#include <delay.h>
// I2C Bus functions
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=4
.equ __scl_bit=5
#endasm
#include <i2c.h>
// DS1307 Real Time Clock functions
#include <ds1307.h>
// Standard Input/Output functions
#include <stdio.h>
// Declare your global variables here
unsigned char tanggal,bulan,tahun,jam,menit,detik;
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// I2C Bus initialization
i2c_init();
// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(0,0,0);
//diset sekali saja , bisa nanti dikomen/tidak dieksekusi
rtc_set_date(11,4,16);
rtc_set_time(12,45,0);
//baca data rtc
rtc_get_date(&tanggal,&bulan,&tahun);
rtc_get_time(&jam,&menit,&detik);
while (1)
{
//baca data rtc
rtc_get_date(&tanggal,&bulan,&tahun);
rtc_get_time(&jam,&menit,&detik);
//kirim serial
printf("Tanggal: %02d/%02d/20%02d \r",tanggal,bulan,tahun);
printf("Waktu: %02d:%02d:%02d \r\r",jam,menit,detik);
delay_ms(500); //delay setengah detik;
}
}
file program bisa didowload disini
dan file simulasi ds1307 CVAVR bisa didownload disini
G. Menampilkan data tanggal dan waktu RTC DS1307 dengan display LCD16x2 pada ATMega8 dengan compiler CVAVR / Codevision AVR 2.03
Rangkaian interface RTC DS1307 dan LCD 16×2 :

berikut adalah programanya:
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
// I2C Bus functions
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=4
.equ __scl_bit=5
#endasm
#include <i2c.h>
// DS1307 Real Time Clock functions
#include <ds1307.h>
// Alphanumeric LCD Module functions
#include <alcd.h>
// Declare your global variables here
unsigned char buffer[16];
unsigned char tanggal,bulan,tahun,jam,menit,detik;
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// USART disabled
UCSRB=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// I2C Bus initialization
i2c_init();
// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(0,0,0);
// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTD Bit 0
// RD - PORTD Bit 1
// EN - PORTD Bit 2
// D4 - PORTD Bit 4
// D5 - PORTD Bit 5
// D6 - PORTD Bit 6
// D7 - PORTD Bit 7
// Characters/line: 16
lcd_init(16);
//untuk pertama kali bisa set waktu habis itu bisa dikomen
//rtc_set_date(11,4,18);
//rtc_set_time(17,25,2);
rtc_get_date(&tanggal,&bulan,&tahun);
rtc_get_time(&jam,&menit,&detik);
lcd_gotoxy(0,0);
lcd_putsf("LCD RTC DS1307");
delay_ms(2000);
lcd_clear();
while (1)
{
// Place your code here
sprintf(buffer,"%02d-%02d-20%02d",tanggal,bulan,tahun);
lcd_gotoxy(0,0);
lcd_puts(buffer);
sprintf(buffer,"%02d:%02d:%02d",jam,menit,detik);
lcd_gotoxy(0,1);
lcd_puts(buffer);
rtc_get_date(&tanggal,&bulan,&tahun);
rtc_get_time(&jam,&menit,&detik);
delay_ms(500);
}
}
Berikut video tutorial pembuatannya :
file program bisa didowload disini
dan file simulasi ds1307 CVAVR bisa didownload disini
Kesimpulan
RTC DS1307 adalah chip RTC yang populer digunakan dalam berbagai aplikasi yang memerlukan pengukuran waktu dan tanggal secara real-time. RTC DS1307 memiliki fitur-fitur seperti deteksi daya rendah, konsumsi daya rendah, dan memori SRAM 56-byte yang dapat diakses oleh mikrokontroler.
Untuk memprogram RTC DS1307 menggunakan mikrokontroler seperti Arduino, lakukan koneksi antara RTC DS1307 dan mikrokontroler menggunakan protokol I2C. Setelah itu, download library RTC DS1307 untuk Arduino, dan gunakan kode program untuk mengatur waktu dan tanggal pada RTC DS1307, membaca waktu dan tanggal dari RTC DS1307, menyimpan data pada SRAM RTC DS1307, dan menyinkronkan RTC DS1307 dengan waktu sistem.
Dengan memahami cara pemrograman RTC DS1307 melalui mikrokontroler seperti Arduino, Anda dapat mengembangkan aplikasi yang memerlukan pengukuran waktu dan tanggal secara real-time. RTC DS1307 dapat digunakan pada berbagai aplikasi seperti sistem monitoring, logging data, pembuatan jadwal, dan sebagainya.
Namun, perlu diingat bahwa RTC DS1307 memiliki akurasi waktu yang terbatas, yaitu sekitar 2 detik per hari. Jika akurasi waktu yang lebih baik diperlukan, bisa dipertimbangkan penggunaan RTC dengan akurasi yang lebih tinggi seperti RTC DS3231.
Selain itu, perlu juga diperhatikan kualitas catu daya yang digunakan. Jika catu daya yang digunakan tidak stabil, maka RTC DS1307 tidak akan berfungsi dengan baik dan dapat mengganggu akurasi waktu.
Demikian artikel dari kami, bila kurang jelas atau ada yang ditanyakan bis kontak kami via wa 0896.7901.7407 . Terima kasih