Pengaturan waktu atau adjust rtc ds3231 bisa dilakukan dengan cara berikut :
1. Pengaturan langsung
a. Parameter jumlah detik sejak 1 Januari 1970 (UTC)
rtc.adjust(DateTime(1740199920));
angka 1740199920 adalah nilai utc pada 22 Februari 2025 11:52:00
b. Parameter tanggal wan waktu
rtc.adjust(DateTime(2025, 2, 22, 11, 52, 0));
parameter yang di inputkan masing-masing adalah tahun,bulan, tanggal, jam, menit dan detik.
c. Parameter string tanggal dan string waktu
rtc.adjust(DateTime("Feb 22 2025", "11:52:00"));
d. Paramter string ISO
rtc.adjust(DateTime("2025-02-22T11:52:00"));
2. Pengaturan otomatis sesuai waktu compile.
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
__DATE__ dan __TIME__ adalah macro preprocessor yang memiliki nilai string tanggal dan waktu pada saat compile, preprocessor lainnya seperti __FILE__, __LINE__, __TIMESTAMP__
3. Pengaturan dengan entry nilai
Untuk flexibilitas, pengaturan waktu rtc bisa dilakukan dengan entry melalui tombol, keypad, android, serial dll. Berikut ini adalah contoh pengaturan melalui tiga tombol:
Skema Pengaturan waktu modul rtc ds3231 meun tombol:

Koding arduino adjust rtc ds3231:
#define menuPin 8
#define plusPin 9
#define minusPin 10
#include <Wire.h>;
#include <LCD_I2C.h>;
#include <RTClib.h>;
LCD_I2C lcd(0x27, 16, 2);
RTC_DS3231 rtc;
DateTime now;
DateTime rtcSet;
enum menuMode {
settingStandby,
settingJam,
settingMenit,
settingDetik,
settingTanggal,
settingBulan,
settingTahun,
jumlahMenuMode,
};
char buffer[20];
byte menuIndex;
byte detikSebelumnya;
void setup() {
pinMode(menuPin, INPUT_PULLUP);
pinMode(plusPin, INPUT_PULLUP);
pinMode(minusPin, INPUT_PULLUP);
Serial.begin(9600);
Serial.println(F("Mengatur waktu rtc ds3231 dengan library RTCLib"));
Serial.println(F("https://www.semesin.com/project"));
Serial.println();
Wire.begin();
Wire.beginTransmission(0x27);
if (Wire.endTransmission())
{
lcd = LCD_I2C(0x3F, 16, 2);
}
lcd.begin();
// if (rtc.lostPower())
// {
// 1a
// rtc.adjust(DateTime(1740199920));
//
// 1b
// rtc.adjust(DateTime(2025, 2, 22, 11, 52, 0));
//
// 1c
// rtc.adjust(DateTime("Feb 22 2025", "11:52:00"));
//
// 1d
// rtc.adjust(DateTime("2025-02-22T11:52:00"));
//
// 2
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
//}
lcd.backlight();
lcd.print("Adjust RTC");
lcd.setCursor(0, 1);
lcd.print("semesin.com");
delay(3000);
lcd.clear();
}
void loop() {
now = rtc.now();
if (detikSebelumnya != now.second())
{
detikSebelumnya = now.second();
if (menuIndex == settingStandby) {
tampilanWaktu(now);
}
}
if (!digitalRead(menuPin)) {
delay(50);
if (!digitalRead(menuPin)) {
if (menuIndex == settingStandby) {
rtcSet = DateTime(now);
}
menuIndex++;
menuIndex %= jumlahMenuMode;
if (menuIndex == settingStandby) {
rtc.adjust(DateTime(rtcSet));
}
tampilanMenu();
while (!digitalRead(menuPin));
}
}
if (!digitalRead(plusPin)) {
delay(50);
if (!digitalRead(plusPin)) {
plusNilai();
tampilanMenu();
while (!digitalRead(plusPin));
}
}
if (!digitalRead(minusPin)) {
delay(50);
if (!digitalRead(minusPin)) {
minusNilai();
tampilanMenu();
while (!digitalRead(minusPin));
}
}
}
void tampilanMenu() {
tampilanWaktu(rtcSet);
switch (menuIndex) {
case settingStandby:
lcd.noBlink();
break;
case settingJam:
lcd.setCursor(4, 1);
lcd.blink();
break;
case settingMenit:
lcd.setCursor(7, 1);
break;
case settingDetik:
lcd.setCursor(10, 1);
break;
case settingTanggal:
lcd.setCursor(3, 0);
break;
case settingBulan:
lcd.setCursor(6, 0);
break;
case settingTahun:
lcd.setCursor(9, 0);
break;
}
}
void tampilanWaktu(DateTime datetime) {
sprintf(buffer, "%02d/%02d/%04d", datetime.day(), datetime.month(), datetime.year());
lcd.setCursor(3, 0);
lcd.print(buffer);
sprintf(buffer, "%02d:%02d:%02d", datetime.hour(), datetime.minute(), datetime.second());
lcd.setCursor(4, 1);
lcd.print(buffer);
}
void plusNilai() {
switch (menuIndex) {
case settingStandby:
break;
case settingJam:
rtcSet = rtcSet + TimeSpan(0, 1, 0, 0);
break;
case settingMenit:
rtcSet = rtcSet + TimeSpan(0, 0, 1, 0);
break;
case settingDetik:
rtcSet = rtcSet + TimeSpan(0, 0, 0, 1);
break;
case settingTanggal:
rtcSet = rtcSet + TimeSpan(1, 0, 0, 0);
break;
case settingBulan:
rtcSet = DateTime(rtcSet.year(), rtcSet.month() == 12 ? 1 : rtcSet.month() + 1, rtcSet.day(), rtcSet.hour(), rtcSet.minute(), rtcSet.second());
break;
case settingTahun:
rtcSet = DateTime(rtcSet.year() + 1, rtcSet.month(), rtcSet.day(), rtcSet.hour(), rtcSet.minute(), rtcSet.second());
break;
}
}
void minusNilai() {
switch (menuIndex) {
case settingStandby:
break;
case settingJam:
rtcSet = rtcSet - TimeSpan(0, 1, 0, 0);
break;
case settingMenit:
rtcSet = rtcSet - TimeSpan(0, 0, 1, 0);
break;
case settingDetik:
rtcSet = rtcSet - TimeSpan(0, 0, 0, 1);
break;
case settingTanggal:
rtcSet = rtcSet - TimeSpan(1, 0, 0, 0);
break;
case settingBulan:
rtcSet = DateTime(rtcSet.year(), rtcSet.month() == 1 ? 12 : rtcSet.month() - 1, rtcSet.day(), rtcSet.hour(), rtcSet.minute(), rtcSet.second());
break;
case settingTahun:
rtcSet = DateTime(rtcSet.year() - 1, rtcSet.month(), rtcSet.day(), rtcSet.hour(), rtcSet.minute(), rtcSet.second());
break;
}
}
Library:









