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 kita akan belajar RTC punya Maxim Integrated, DS3231.
A. Spesifikasi RTC DS3231
- 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 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 , namun ketika rangkaian utama kita padam, maka secara otomatis IC DS3231 akan switch ke tegangan baterai cadangan. Baterai cadangan biasanya berupa baterai pipih seperti tipe CR2032 yang memiliki tengangan 3V.
Selama tegangan listrik tersedia, maka IC 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 , 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 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
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 dapat digunakan untuk chip RTC DS3231, DS1307 dan PCF8523.
Untuk board Arduino, library mendukung:
- ATmega328 @ 16MHz : Arduino UNO, Adafruit Pro Trinket 5V, Adafruit Metro 328, Adafruit Metro M
- 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
Download DS3231 Libary RTClib
- Buka Arduino IDE
- Klik Sketch > Include Library > Add .ZIP Library
- Cari Library RTClib-master.zip yang telah teman-teman download
- Klik Ok
- Klik menu Sketch > Include Library > Manage Libraries
- Cari RTClib
- Kemudian klik install.
E. Program RTC DS3231 Arduino
1. Baca Data RTC
#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);
}
2. Atur Waktu Secara Manual Sesuai Keinginan (Arduino RTC DS3231 Set Time)
/*
www.arduino32.blogspot.com
Progam 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));
}
}
}
3. Cara Setting RTC DS3231 Agar Sesuai Dengan Laptop
#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 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);
}
4. Cara Merubah dan Menampilkan Format AM/PM DS3231
- 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.
#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);
}