Mengatur waktu rtc ds3231 dengan library RTCLib

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:

1. LCD_I2C-2.3.0
2. RTClib-1.13.0

Leave a Reply

Your email address will not be published. Required fields are marked *