Lompat ke konten Lompat ke sidebar Lompat ke footer

Tutorial Arduino DS3231 Real Time Clock AM/PM Code

RTC DS3231 Arduino

Tutorial Arduino DS3231 RTC dan Menampilkan Format Jam AM/PM  - Real Time Clock (RTC) adalah sebuah IC penghitung waktu dimana ia dapat menghitung detik, menit, jam, tanggal, bulan dan tahun secara presisi.

Berbagai vendor pembuat IC RTC seperti STMicroelectronics, Microchip, Micro Crystal, Maxim Integrated, Epson, NXP, Renesas Electronics. Pada artikel ini kita akan belajar RTC punya Maxim Integrated, DS3231.


A. Spesifikasi RTC DS3231

DS3231 adalah RTC dari Maxim Integrated yang mampu menghitung waktu hingga tahun 2100. Adapun rincian dari spesifikasi RTC DS3231 adalah sebagai berikut:
  • Perhitungan waktu valid hingga tahun 2100
  • Akurasi ±2ppm dari 0°C to +40°C 
  • Akurasi ±3.5ppm dari -40°C to +85°C
  • Output Sensor Suhu Digital: Akurasi ± 3 ° C
  • Komunikasi I2C (400KhZ)
  • Mendukung Baterai Backup
  • Arus Normal Max 200 µA
  • Arus standby Max 170 µA
  • Arus Vbat Max 100 nA
  • Paket IC 8-Pin DIP dan 8-pin SO
  • Kristal Internal
  • VCC 2.3 - 5.5 V
  • Vbat  2.3 - 5.5 V
  • Alamat I2C DS3231 adalah 0x68
    Alamat I2C DS3231 menggunakan pengalamatan 7-bit dengan alamat dalam biner adalah 1101000, jika di konversi ke hexadesimal adalah 0x68.
 

B. Cara Kerja RTC DS3231

Arduino ds3231  akan terus menghitung waktu selama diberikan sumber tegangan. Sumber tegangan yang dapat mengaktifkan IC ini ada dua, yaitu VCC dan Vbat. 

VCC merupakan tegangan yang bersumber dari tangkaian utama sedangkan Vbat adalah tegangan yang bersumber dari baterai cadangan atau sering disebut dengan baterai backup.

Ketika rangkaian utama hidup, maka IC DS3231 akan memilih tegangan VCC untuk mengoperasikan IC ini, namun ketika rangkaian utama kita padam, maka secara otomatis IC DS3231 ini akan switch ke tegangan baterai cadangan. Baterai cadangan ini biasanya berupa baterai pipih seperti tipe CR2032 yang memiliki tengangan 3V.

Selama tegangan listrik tersedia, maka IC ini akan terus mengeluarkan data waktu dalam format tertentu yang dikirimkan melalui pin I2C (SDA dan SCL). Mikrokontroller seperti board Arduino Uno, akan mengambil data tersebut melalui komunikasi I2C juga.

Pada modul RTC DS3231 ini, telah terdapat beberapa komponen tambahan seperti Baterai Backup, EEPROM IC dan beberapa resistor, kapasitor dan dioda. Namun tidak butuh kristal tambahan karena sudah ada didalam IC DS3231.

 

C. Rangkaian RTC DS3231

Untuk dapat berkomunikasi antara arduino ds3231 , kita perlu menghubungkan mereka melalui protokol I2C, SDA ke SDA dan SCL ke SCL. Adapun rangkaiannya arduino ds3231  adalah sebagai berikut:

Rangkaian arduino ds3231 

 


 

Rangkaian RTC diatas, ada dua sisi pin (VCC, GND, SDA dan SCl kiri dan kanan. Anda dapat menggunakan salah satunya, kiri atau kanan. Karena itu saling terhubung.

Pada dasarnya untuk dapat berkomunikasi dengan I2C hanya menggunakan 2 koneksi saja yaitu SDA dan SCL. Uanya dapat menentukan IC mana yang dipilih, kita hanya perlu tau alamat dari I2C dari IC tersebut.


D. Perpustakaan RTC DS3231 

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. Namun, dari percobaan yang saya alami sewaktu menggunakan library untuk DS3231, ada satu kendala saat saya menggunakan untuk tingkat lanjut yaitu day of the week tidak bisa sinkron.

Menurut saya lebih baik library buatan Adafruit yaitu RTClib

Library RTClib ini dapat digunakan untuk chip RTC DS3231, DS1307 dan PCF8523. 

Untuk board Arduino, library 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 mengoperasikan RTC ini menggunakan Arduino, silahkan download library RTClib pada link berikut:

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

 

E. Program RTC DS3231 Arduino 

1. Baca Data RTC 

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

RTC_DS3231 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();
}
}

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 DS3231 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 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
 
/*
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_DS3231 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();
}
}

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 DS3231 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_DS3231 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();
}

// 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 DS3231 

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_DS3231 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();
}
}

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
 
 

F. RTC 3231 Datasheet

Jika teman-teman membutuhkan datasheet untuk melihat deskripsi lengkap dengan parameter DS3231 ini, saya melampirkan datasheeetnya sebagai berikut:

 
Jika anda ingin tahu cara menampilkan file pdf di blog seperti pdf diatas, anda dapat membaca artikel Cara menampilkan pdf di blog atau website.
 
Sekian tutorial cara akses RTC DS3231 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 "Tutorial Arduino DS3231 Real Time Clock AM/PM Code"