Lompat ke konten Lompat ke sidebar Lompat ke footer

Cara Akses Modul RTC DS1307 Menggunakan Arduino Mega 2560

RTC DS1307 Arduino Mega 2560

Cara Akses Modul RTC DS1307 Menggunakan Arduino Mega 2560 - Pada tutorial sebelumnya, saya sudah membuat tutorial Cara Menggunakan RTC DS1307 Arduino Pakai Library Adafruit. Sekarang saya akan membagikan cara dan rangkaian bagaimana RTC DS1307 dapat diakses menggunakan Arduino.

Untuk lebih lengkap spesifikasi dari DS1307 dan bagaimana cara kerja,  lihat disini

Umumnya, penjelasan artikel ini hampir sama dengan artikel sebelumnya, namun pada ATMega2560 ini saya mendapatkan sedikit masalah saat modul ini diakses menggunakan Arduino Mega2560 dengan rangkaian yang sama menggunakan Arduino Uno, yaitu tidak berhasil membaca data dari RTC secara benar.

Jadi, solusi dari masalah tersebut adalah menambahkan sebuah resistor Pull-Up di pin SCL dan SDA. Untuk mengetahui nilai resistansi pull-up ini, silahkan baca artikel cara kerja protokol I2C.


Rangkaian RTC DS1307 Arduino Mega 2560

Untuk dapat berkomunikasi antara RTC dan Arduino, kita perlu menghubungkan mereka dengan komunkasi I2C, SDA ke SDA dan SCL ke SCL. Adapun rangkaiannya adalah sebagai berikut:

Cara Akses Modul RTC DS1307 Menggunakan Arduino Mega 2560
ATmega2560 DS1307
 

Pada modul RTC rangkaian diatas, terdapat dua sisi pin (VCC, GND, SDA dan SCl) pada kiri dan kanan. Teman-teman dapat menggunakan salah satunya, kiri bisa kanan juga bisa karena itu saling terhubung.

Agar dapat berkomunikasi antar I2C, kita hanya membutuhkan 2 koneksi saja yaitu SDA dan SCL. 

Agar dapat menentukan IC mana yang gunakan, kita harus tau alamat dari I2C dari IC tersebut.


Library RTC DS1307 

Berkomunikasi menggunakan mode I2C menggunakan protokol tersendiri dalam memilah data yang diterima. Untuk dapat mempermudah kita dalam mengambil dan memetakan data-data tersebut, kita perlu sebuah library.
 
Ada banyak library yang tersedia di internet untuk dapat mengakses RTC ini, seperti dari DinkyDink, Adafruit, Michael Margolis, Manjunath CV dan sebagainya. Setidaknya dalam mengoperasikan modul RTC saya telah mencoba dua library dari DinkyDink dan Adafruit.

Library dari RinkyDink merupakan library yang bagus. Dari sebuah percobaan yang pernah saya lakukan saat menggunakan library DS3231 dari RinkyDink ini, kendalanya adalah day of the week tidak bisa sinkron.

Setelah saya mencari, saya menemukan library yang lebih bagus "menurut saya" adalah RTClib. Library ini bisa untuk chip RTC DS3231, DS1307 dan PCF8523.

Untuk board, library RTClib ini mendukung: 

  • ATmega328 @ 16MHz : Arduino UNO, Adafruit Pro Trinket 5V, Adafruit Metro 328, Adafruit Metro Mini
  • ATmega328 @ 12MHz : Adafruit Pro Trinket 3V
  • ATmega32u4 @ 16MHz : Arduino Leonardo, Arduino Micro, Arduino Yun, Teensy 2.0
  • ATmega32u4 @ 8MHz : Adafruit Flora, Bluefruit Micro
  • ESP8266 : Adafruit Huzzah
  • ATmega2560 @ 16MHz : Arduino Mega
  • ATSAM3X8E : Arduino Due
  • ATSAM21D : Arduino Zero, M0 Pro
  • ATtiny85 @ 16MHz : Adafruit Trinket 5V
  • ATtiny85 @ 8MHz : Adafruit Gemma, Arduino Gemma, Adafruit Trinket 3V 
 
Untuk bisa akses RTC DS1307 pakai Arduino, anda harus download library RTClib pada dengan klik link dibawah ini:

Download DS1307 Libary RTClib

Jika sudah, masukkan library Libary RTClib yang telah teman-teman download ke Arduino IDE dengan cara:
  • Buka Arduino IDE
  • Klik Sketch > Include Library > Add .ZIP Library
  • Cari Library RTClib-master.zip yang telah teman-teman download
  • Klik Ok
Selain itu, anda juga dapat menambahkan library yang tersedia pada library manager Arduino IDE dengan cara:
  • Klik menu Sketch > Include Library > Manage Libraries
  • Cari RTClib
  • Kemudian klik install.

 

Program RTC DS1307 Arduino ATmega 2560

1. Baca Data RTC 

Sekarang, kita akan mencoba membaca data dari RTC. Adapun data yang diambil  adalah hari, tanggal, bulan, tahun, jam, menit dan detik. 
 
#include "RTClib.h"

RTC_DS1307 rtc;

char daysOfTheWeek[7][7] = {"Ahad", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
char Month [13][10] = {" ", "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"};

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


if (! rtc.begin()) {
Serial.println("Tidak ada RTC");
Serial.flush();
abort();
}

if (! rtc.isrunning()) {
Serial.println("RTC tidak berjalan");
}
}

void loop () {
DateTime now = rtc.now();

Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); // Menampilkan Hari
Serial.print(", ");
Serial.print(now.day(), DEC); // Menampilkan tanggga
Serial.print(' ');
Serial.print(Month[now.month()]); // Menampilkan bulan
Serial.print(' ');
Serial.print(now.year(), DEC); // Menampilkan tahun
Serial.print(", ");


Serial.print(now.hour(), DEC); // Menampilkan jam
Serial.print(':');
Serial.print(now.minute(), DEC); // Menampilkan menit
Serial.print(':');
Serial.print(now.second(), DEC); // Menampilkan detik
Serial.println('\n');

delay(1000);
}
 
Setelah program diupload, buka serial Monitor Arduino IDE dan anda akan melihat data yang tampil seperti berikut:

 

 
Pada program diatas, baris array Mont pertama saya tulis " ", karena pembacaan array dimulai dari 0, maka tidak ada bulan pada bulan ke-0. Dari itu, saya menambahkan karakter kosong.
 

2. Atur Waktu Secara Manual Sesuai Keinginan (Arduino RTC DS1307 Set Time) 

Sekarang kita akan membuat program yang mana dengan program ini kita dapat menyetel RTC secara manual.
 
Perintah dasarnya adalah:
rtc.adjust(DateTime(tahun, bulan, tanggal, jam, menit, detik));
 
 
Misalnya kita hanya ingin merubah tanggal saja atau jam saja, bagaimana caranya?
 
Berikut saya sertakan program lengkapnya.  Progam ini akan menampilkan data RTC pada Serial Monitor.
 
  Untuk setting data, ketikkan karakter ini pada serial monitor arduino:
   - TG untuk  Tanggal
   - BL untuk  Bulan
   - TH untuk  Tahun
   - JM untuk  Jam
   - MT untuk  Menit
   - DT untuk  Detik
 
/*
www.arduino32.blogspot.com

Progam ini akan menampilkan data RTC pada Serial Monitor

Untuk merubah data, kirimkan karakter berikut pada serial monitor:
- TG untuk merubah Tanggal
- BL untuk merubah Bulan
- TH untuk merubah Tahun
- JM untuk merubah Jam
- MT untuk merubah Menit
- DT untuk merubah Detik
*/

#include "RTClib.h"

RTC_DS1307 rtc;

char daysOfTheWeek[7][7] = {"Ahad", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
char Month [13][10] = {" ", "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"};
String read_string = " ";
int read_int = 0;

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


if (! rtc.begin()) {
Serial.println("Tidak ada RTC");
Serial.flush();
abort();
}

if (! rtc.isrunning()) {
Serial.println("RTC tidak berjalan");
}
}

void loop () {
bacaRTC();
aturRTC();
delay(1000);
}

void bacaRTC()
{
DateTime now = rtc.now();

Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); // Menampilkan Hari
Serial.print(", ");
Serial.print(now.day(), DEC); // Menampilkan tanggga
Serial.print(' ');
Serial.print(Month[now.month()]); // Menampilkan bulan
Serial.print(' ');
Serial.print(now.year(), DEC); // Menampilkan tahun
Serial.print(", ");
Serial.print(now.hour(), DEC); // Menampilkan jam
Serial.print(':');
Serial.print(now.minute(), DEC); // Menampilkan menit
Serial.print(':');
Serial.print(now.second(), DEC); // Menampilkan detik
Serial.println('\n');
}
void aturRTC() {
DateTime now = rtc.now();

while (Serial.available() > 0) {

read_string = Serial.readStringUntil('\n');
read_string.trim();
delay(100);

//Hari tidak dapt diubah karena akan berubah sendiri sesuai tanggal

//Jika tanggal
if (read_string == "TG") {
Serial.print("Masukkan Tanggal: ");

//Tahan sebentar menunggu data baru dikirim
while (!Serial.available()) {}

read_int = Serial.parseInt();
Serial.println(read_int);

rtc.adjust(DateTime(now.year(), now.month(), read_int, now.hour(), now.minute(), now.second()));
}

//Jika bulan
if (read_string == "BL") {
Serial.print("Masukkan Bulan: ");

//Tahan sebentar menunggu data baru dikirim
while (!Serial.available()) {}

read_int = Serial.parseInt();
Serial.println(read_int);

rtc.adjust(DateTime(now.year(), read_int, now.day(), now.hour(), now.minute(), now.second()));
}

//Jika tahun
if (read_string == "TH") {
Serial.print("Masukkan Tahun: ");

//Tahan sebentar menunggu data baru dikirim
while (!Serial.available()) {}

read_int = Serial.parseInt();
Serial.println(read_int);

rtc.adjust(DateTime(read_int, now.month(), now.day(), now.hour(), now.minute(), now.second()));
}

//Jika jam
if (read_string == "JM") {
Serial.print("Masukkan Jam: ");

//Tahan sebentar menunggu data baru dikirim
while (!Serial.available()) {}

read_int = Serial.parseInt();
Serial.println(read_int);

rtc.adjust(DateTime(now.year(), now.month(), now.day(), read_int, now.minute(), now.second()));
}

//Jika menit
if (read_string == "MT") {
Serial.print("Masukkan Menit: ");

//Tahan sebentar menunggu data baru dikirim
while (!Serial.available()) {}

read_int = Serial.parseInt();
Serial.println(read_int);

rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), read_int, now.second()));
}

//Jika detik
if (read_string == "DT") {
Serial.print("Masukkan Detik: ");

//Tahan sebentar menunggu data baru dikirim
while (!Serial.available()) {}

read_int = Serial.parseInt();
Serial.println(read_int);

rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), read_int));
}
}
}
 
Maka hasilnya adalah sebagai berikut:
Cara Menggunakan RTC DS1307 Arduino Pakai Library Adafruit

3. Cara Setting RTC DS1307 Agar Sesuai Dengan Laptop

Setelah kita mengetahui program dasar dan program set waktu, lalu bagaimana caranya kita dapat mengatur waktu sesuai waktu di komputer/laptop kita saat di upload?
 
Perintah dasarnya adalah:
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
 
Perintah tersebut diletakkan pada setup(); Berikut adalah programnya.
#include "RTClib.h"

RTC_DS1307 rtc;

char daysOfTheWeek[7][7] = {"Ahad", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
char Month [13][10] = {" ", "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"};

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


if (! rtc.begin()) {
Serial.println("Tidak ada RTC");
Serial.flush();
abort();
}

if (! rtc.isrunning()) {
Serial.println("RTC tidak berjalan");
}

// baris berikut menyetel RTC ke tanggal & waktu dari komputer saat sketsa ini dikompilasi
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

}

void loop () {
DateTime now = rtc.now();

Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); // Menampilkan Hari
Serial.print(", ");
Serial.print(now.day(), DEC); // Menampilkan tanggga
Serial.print(' ');
Serial.print(Month[now.month()]); // Menampilkan bulan
Serial.print(' ');
Serial.print(now.year(), DEC); // Menampilkan tahun
Serial.print(", ");


Serial.print(now.hour(), DEC); // Menampilkan jam
Serial.print(':');
Serial.print(now.minute(), DEC); // Menampilkan menit
Serial.print(':');
Serial.print(now.second(), DEC); // Menampilkan detik
Serial.println('\n');

delay(1000);
}
 
Maka hasilnya adalah sebagai berikut:
Cara Menggunakan RTC DS1307 Arduino Pakai Library Adafruit

 

4. Cara Merubah dan Menampilkan Format AM/PM 

Sekarang ketika sudah bisa membuat program untuk RTC ini, mari kita belajar cara menampilkan format waktu dalam 12 jam yaitu AM dan PM.

Secara default, program diatas akan menampilkan waktu dalam format 24jam seperti pukul:
  • 9.14
  • 14.20
  • 18.30 
  • dan sebagainya. 
Dengan format 12 jam, maka waktu yang ditampilkan adalah:
  • 9.14 AM
  • 2.20 PM 
  • 6.30 PM
  • dan sebagainya.

Adapun perintah dasarnya adalah :
(h > 12) ? h - 12 : ((h == 0) ? 12 : h), DEC
dan 
(h < 12) ? " AM" : " PM"


Berikut adalah programnya:

#include "RTClib.h"

RTC_DS1307 rtc;

char daysOfTheWeek[7][7] = {"Ahad", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
char Month [13][10] = {" ", "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"};

int h = 0;

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


if (! rtc.begin()) {
Serial.println("Tidak ada RTC");
Serial.flush();
abort();
}

if (! rtc.isrunning()) {
Serial.println("RTC tidak berjalan");
}

}

void loop () {
DateTime now = rtc.now();
h = now.hour();

Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); // Menampilkan Hari
Serial.print(", ");
Serial.print(now.day(), DEC); // Menampilkan tanggga
Serial.print(' ');
Serial.print(Month[now.month()]); // Menampilkan bulan
Serial.print(' ');
Serial.print(now.year(), DEC); // Menampilkan tahun
Serial.print(", ");


Serial.print((h > 12) ? h - 12 : ((h == 0) ? 12 : h), DEC); // Menampilkan jam
Serial.print(':');
Serial.print(now.minute(), DEC); // Menampilkan menit
Serial.print(':');
Serial.print(now.second(), DEC); // Menampilkan detik
Serial.print((h < 12) ? " AM" : " PM");
Serial.println('\n');

delay(1000);
}

Hasil yang ditampilkan adalah sebagai berikut:
Cara Menggunakan RTC DS1307 Arduino Pakai Library Adafruit

 

RTC 1307 Datasheet

Jika teman-teman membutuhkan datasheet untuk melihat deskripsi lengkap dengan parameter DS1307 ini, saya melampirkan datasheeetnya sebagai berikut:
 
Untuk dapat menampilkan file pdf pada blog seperti file pdf di atas, anda dapat melihatnya pada halaman Cara menampilkan pdf di blog atau website.

Sekian tutorial cara akses RTC DS1307 Arduino ini, semoga artikel ini bermanfaat untuk kita semua.

Terima kasih telah berkunjung. Jika teman-teman merasa artikel ini bermanfaat, silahkan di share ke teman-teman lainnya yang membutuhkan.

Posting Komentar untuk "Cara Akses Modul RTC DS1307 Menggunakan Arduino Mega 2560"