Seting waktu RTC otomatis dengan arduino

DS1307 dan DS3231 merupakan RTC (real time clock) yang umum digunakan dalam perancangan arduino. kedua RTC ini saling kompatibel untuk register waktunya, sedangkan register kontrol memiliki alamat berbeda. Selain itu DS3231 memiliki kelebihan dua alarm yang tidak dimiliki oleh DS1307.

Penggunaan RTC pertama kali, RTC harus disetting terlebih dahulu, cara setting DS3231 adalah dengan memberi nilai pada register waktunya, juga register kontrol atau register alarm (khusus DS3231).

Cara menyetting RTC DS3231 dan DS1307 umumnya membutuhkan dua sketch untuk menggunakan RTC ini yaitu setTime dan program utama. Program ‘set waktu’ harus dipisah untuk menghindari program me-‘set waktu’ setiap kali arduino reset.

Otomatisasi setting RTC bertujuan untuk membuat setting waktu berada dalam sketch utama sehingga lebih praktis terutama jika sketch akan bagikan ke publik atau pengguna lain.

Untuk mengetahui apakah RTC sudah disetting atau belum, digunakan 1 byte EEPROM untuk menyimpan status (dibaca tokenRTC), jika RTC sudah disetting maka sketch akan menulis dialamat alamatEEPROMCekToken pada EEPROM dengan nilai tokenRTC.

Ketika program dijalankan sketch akan menguji nilai tokenRTC, jika sama maka sketch tidak lagi melakukan setting waktu RTC.

Skema tulis waktu rtc otomatis (kompatibel DS1307):

sketch/program Atur waktu RTC otomatis (bisa digunakan langsung untuk DS1307 dan DS3231 tanpa library):

#include <EEPROM.h>
#include <Wire.h>
#include <Sodaq_DS3231.h>

#define alamatRTC 0x68
#define alamatEEPROMCekToken 0
#define tokenRTC 0xAA //<== rubah token jika ingin nilai baru

void setup() {
  Serial.begin(9600);
  Serial.println("Set waktu RTC otomatis dengan arduino");
  Serial.println("http://www.semesin.com/project/");
  Serial.println();

  Wire.begin();
  if (EEPROM.read(alamatEEPROMCekToken) != tokenRTC)
  {
    //Waktu compiler
    char bulan[12];
    byte indexBulan;
    int jam, menit, detik, tanggal, tahun;

    char *namaBulan[12] = {
      "Jan", "Feb", "Mar", "Apr", "May", "Jun",
      "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
    };
    sscanf(__TIME__, "%d:%d:%d", &jam, &menit, &detik);
    sscanf(__DATE__, "%s %d %d", bulan, &tanggal, &tahun);
    for (indexBulan = 0; indexBulan < 12; indexBulan++) {
      if (strcmp(bulan, namaBulan[indexBulan]) == 0)
        break;
    }
    uint8_t wday = hariDariTanggal(tanggal, indexBulan + 1, tahun);
    DateTime dt(tahun, indexBulan + 1, tanggal, jam, menit, detik, wday - 1);
    rtc.setDateTime(dt);
    EEPROM.write(alamatEEPROMCekToken, tokenRTC);
    Serial.println("RTC sudah otomatis di setting (Sekali saja)");
  }
}

uint32_t old_ts;
void loop() {
  String strNamaHari[] = {"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jum'at", "Sabtu"};
  DateTime now = rtc.now(); //get the current date-time
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.date(), DEC);
  Serial.print(' ');
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.print(' ');
  Serial.print(strNamaHari[now.dayOfWeek()-1]);
  Serial.println();

  while (1);
}
byte hariDariTanggal(byte tanggal, byte bulan, uint16_t tahun)
{
  uint16_t jumlahHariPerBulanMasehi[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  if (tahun >= 2000)
    tahun -= 2000;

  uint32_t jumlahHari = tahun * 365;
  uint16_t tahunKabisat = tahun / 4;
  for (byte i = 0; i < tahun; i++)
  {
    if (!(i % 4))
    {
      jumlahHari++;
    }
  }
  jumlahHari += jumlahHariPerBulanMasehi[bulan - 1];
  if ( (bulan >= 2) && !(tahun % 4))
  {
    jumlahHari++;
  }
  jumlahHari += tanggal;
  return ((jumlahHari + 5) % 7) + 1;
}

Library: Sodaq_DS3231.zip
Versi tanpa library : set_otomatis_rtc.ino

Bagikan Link halaman ini :

29 thoughts on “Seting waktu RTC otomatis dengan arduino

    1. ya karena beda library beda gayanya, ikuti aturan main masing-masing library
      untuk RTC banyak jenis librarynya
      misalnya ada yang pake “DateTime now – now.second()” ada juga “tmElements_t tm – tm.Second”

    1. kode yang akan di looping di tulis didalam bracket loop()

      dan contoh di halaman ini tidak jalan looping-nya karena

      while (1);

      dengan tujuan men-stop program biar bisa dilihat hasilnya dengann cara nge-looping program kosong

    1. contoh sederhana:

      if (now.hour() == 17 and now.minute() == 0 and now.second() == 0 )
      {
      matikanSistem();
      }
      if (now.hour() == 8 and now.minute() == 0 and now.second() == 0 )
      {
      hidupkanSistem();
      }

  1. Min klw jam di serial monitornya 165.165.165
    Gimana yah cara memperbaikinya?
    Sudah gonta ganti script juga tapi tetap eror

    1. Kemungkinan ada masalah rangkaian/pengkabelan
      *cek sda-scl terpasang tepat (tidak terbalik)
      *pastikan kabel yang digunakan nyambung
      *jika menggunakan chip, gunakan pullup pada sda-scl

  2. mas kalu mau setting rtc akan nampilkan waktu ketika buttton diklik 2 kali dalan kurun waktu 10 detik apakah bisa?

    1. lakukan pengecekan jam menit detik dalam loop
      jika sama dengan waktu alarm jalankan fungsi aksi

      Jika ingin menggunakan alarm internal ds3231

      hingga saat ini library sodaq_ds3231 tidak mendukung alarm.
      pake library yang lebih mumpuni seperti “ds3231.h”
      gunakan fungsi :

      void setA1Time(byte A1Day, byte A1Hour, byte A1Minute, byte A1Second, byte AlarmBits, bool A1Dy, bool A1h12, bool A1PM);
      void setA2Time(byte A2Day, byte A2Hour, byte A2Minute, byte AlarmBits, bool A2Dy, bool A2h12, bool A2PM);

      untuk setting alarm-nya

  3. Gan saya mau buat project penjadwalan program
    Senin-jum’at program jalan
    Sabtu – minggu program tidak jalan
    m
    bisa gak gan, rtc ds3231

    1. bisa dengan mengunakan variabel dayOfWeek()/hari yang bernilai 1-7 (1=minggu) sebagai penanda aktif-nya
      contoh:

      byte hari = now.dayOfWeek();
      if((hari == 1) && (hari >= 6))
      {
      //kode matikan sistem
      }
      else
      {
      //kode hidupkan sistem
      }

    1. rtc 3231 banyak seri-nya dengan akurasi (ppm) tertentu ppm lebih kecil lebih bagus
      misal dengan +- 5ppm saja bisa melenceng 0.432 detik perhari pada suhu 0-40 celcius

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.