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("https://www.project.semesin.com/");
  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);
    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

96 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
      }

  4. Mas, kenapa ya RTC saya gagal diset. Saya udah memasukkan progam sama persis yg diatas. Dan pi nya juga udah bener. Tolong solusinya????

  5. Om mau nanya om .. gmana ya buat program untuk menghidupkan motor servo dengan RTC Dan waktunya Di tampilkan Di LCD ? MOHON BANTUANNYA OM UNTUK T.A SAYA OM
    saya kurang mengerti om untuk membuat programnya. Terima kasih om semoga Di jawab

    1. bisa, ganti bagian ini
      String strNamaHari[] = {“Minggu”, “Senin”, “Selasa”, “Rabu”, “Kamis”, “Jum’at”, “Sabtu”};
      menjadi
      String strNamaHari[] = {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”};

  6. bang saya punya project buat real time menggunakan motor, dan jamnya itu diatur jam 7 pagi sama jam 4 sore gimana caranya bang mohon pencerahanya

  7. bang kalau pakai rt ds 1307 bisa menjalankan 2 alarm ngga ya? misalkan alarm 1: jam 12:01:30 tgl 30.
    sedangkan alarm 2 : jam 12:01:30 setiap hari.

  8. bang saya bikin absensi ds3231 dengan finger print tapi tampilan di lcd hanya id dari sidik jari doang yang muncul sedangkan untuk rtc nya tampilan hanya angka 165 165 165…
    gimana itu bang

  9. Jika kita ingin memanipulasi waktunya gimana ya ??
    seperti 1 jam menjadi 30 detik atau 5 hari menjadi 5 menit itu seperti apa ya kodinganya
    terima kasih banyak

    1. nah, itu dia yang bikin bingung

      mungkin bisa mulai dengan kode ini (5 menit dan 30 detik)

      DateTime dt(2000, 01, 01, 00, 5, 30, 5); // set tanggal dan waktu (format): tahun, bulan tanggal, jam, menit, detik, hari (1=minggu, 7=sabtu)
      rtc.setDateTime(dt);

  10. kalau setting setiap satujam seperti ini
    if(now.minute() != 0) first = true;
    if(now.minute() == 0 && first == true)

    kan berarti setiap menit menjadi 0 (artinya setiap satujam)

    kalau setiap 30 menit jadi bagaimana ya pak?

  11. Mas izin bertanya, saya punya 1 sensor suhu dengan ketentuan sistem:
    – jam 7-10 siang jika sensor >30 derajat, motor ON
    – jam 11-15 pompa tidak boleh ON( harus OFF) walau sensor >30 derajat
    -jam 20-03 (dini hari) juka sensor >20, motor ON

    Mohon beri solusi mas soalnya saratnta sensor nya hanya boleh satu. Terimakasih

    1. contoh penjadwalan berdasarkan rentang waktu

      if ((Hor >= 7) && (Hor < 10))
      {  
          proses1();
      }
      else if ((Hor >= 11) && (Hor < 15))
      {
          proses2();
      }
      else if ((Hor >= 20) || (Hor < 3))
      {
          proses3();
      }
      
  12. Bang maaf saya mau nanya, ini kan saya bikin alarm otomatis sesuai jadwal sekolah tapi ketika saya tes ke lcd print nya tidak sesuai malah beda beberapa menit, sama ketika output nya mau sesuai jadwal sekolah di coding if tidak bisa memanggil nama hari harus tanggal terimakasih?

    1. Printer thermal yang menggunakan komunikasi serial sama penggunaannya seperti serial biasa

      printer.print(now.hour());
      printer.print(':');
      printer.print(now.minute());
      printer.print(':');
      printer.println(now.second());

  13. Mas saya mau nanya ,saya kan bikin projek runningtext pake RTC !nah caranya biar otomatis running trxt nyala pada saat jam 9 pagi dan mati sendiri pada jam 9 malam gimana ya ?

  14. Mas, bikin waktu untuk fermentasi otomatis gimana ya ? Programnya, jika alat dihidupkan timer akan berjalan setelah 24 jam , alat akan mati otomatis

    1. Salah satu perbedaan nya adalah protokol komunikasi yang digunakan :
      RTC DS3231/DS1307 menggunakan komukasi 2-wire serial interface
      sedangkan RTC DS1302 menggunakan 3-Wire Interface

    2. oiya kak, kalo misal mau buat sistem dimana servo bakal buka otomatis sesuai waktu yang udah di atur di RTC. Itu apakah bisa pake RTC DS1302? terus juga saya cari2 library untuk DS1302 agak susah ya kak. Kebanyakan pakai DS1307 ?
      Makasih banyak kak, maaf banyak nanya ….

  15. kak kalau saya ingin menyalakan pompa di waktu yg ditentukan rtc serta bds kelembapan yg ditentukan dari sensor kelmbapan setelah itu pompa akan mati jika mencapai kelembapan yang diinginkan bagaimana ya kak?
    singkatnya jika pompa akan menyala di jam 7 dan 4 sore, saat kelembapan >900 dan akan mati saat kelembapan <600. selain di jam tsb pompa juga akan mati. mohon pencerahannya kak. Terimakasih

  16. Mas sy pakai RTC ds3231 dan df palyer mini gimna cara buat coding waktur tertentu dfpalyer mp3 mini bunyi misla jam 07.00 nyala df player mini sesuai urutan rekamannya , trimakasih

  17. Kak kalo mau ngambil data 15 menit sekali gimana yaaa . Bisakah?
    Misalnyaa ngambil data suhu nyaa setiap 15menit sekali dan disimpan dalam sdcard gituu
    Mohon bantuannya kak

    1. [konteks menggunakan sketch di halaman ini] : pc/laptop akan mengkompile settingan rtc sesuai waktu ‘saat’ kompile, kemudian settingan itu akan di terapkan ‘saat’ ardunio running pertama kali.
      selisih waktu saat kompile dan saat running pertama kali, akan menjadi selisih waktu rtc vs waktu pc/laptop

      [konteks akurasi setelah 1 bulan jalan] : masing2-masing modul rtc punya akurasi tertentu (biasanya dalam satuan ppm), jadi gunakan modul rtc dengan ppm paling rendah

  18. mau tanya mas kalau RTC ds3231 itu kadang waktunya suka mundur sendiri kenapa ya
    contohnya : saya membuat penyiram tanaman otomatis yang saya Set penyiraman di jam 4 sore, nah tiba tiba selang beberapa hari penyiraman tiba tiba mundur jadi jam 5 sore. dan distatus waktu serial RTC nya juga telat sama waktu real nya. mohon jawabannya mas

    1. coba perhatikan lebih lanjut misalnya:
      *apakah pergeserannya konstan misal 5 menit lebih lambat dalam 1 hari :: ganti rtc dengan yang lebih akurat
      *jika nilai rtc kembali ke tanggal awal (tanggal compile) kemungkinan programnya ada kesalahan
      *jika nilai settingnya berubah (rtc akurat) kemungkinan juga ada masalah di programnya
      *dst

  19. pagi bang ijin tanya
    sy lg pkl d ksh tugas kaya gini.
    klo data rtc yg di program ini kan bs d liat d serial monitor, klo pngn di tampilkan d lcd gmn ya?
    trus rtc ini akan nyala hidup ngikutin kontaktor yg dpt input dr sensor
    data rtc ini hidup brp kali dalam sehari dan brp lm setiap kali nyala nya pengen d smpen d eeprom

    1. 1 lepas baterai
      2 jalankan program di halaman ini atau “program adjust” yang ada (misal dari example librarynya)
      3 pasang baterai
      4 upload ulang prorgram aslinya

      jika program aslinya sudah ada koding auto adjust seperti di halaman ini cukup lepas baterai tunggu 5 detik, pasang lagi baterai

Leave a Reply to ahmad pujiono Cancel reply

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