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);
    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 :

70 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

  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. nanyak ka, klau rtc klau suka ngitung kembali ke hari senin pukul 00:00:00 , itu knapa ya,,,?
    padahl cek batrai, masih 3.3V ,,,

  9. 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

  10. 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);

  11. 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?

    1. banyak cara, contoh sederhana membaca sensor 1x sehari pada pukul 12:05:00

      //pembacaan setiap detik ke-5
      if ((now.hour() == 12) && (now.minute() == 5) && (now.second() == 0))
      {
      bacaSensor();
      }

  12. 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();
      }
      
  13. 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());

  14. 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 ?

  15. 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 ….

    3. bisa pake rtc ds1302
      kelebihan ds1302 bisa menggunakan super capacitor sebagai pengganti baterai,
      tapi rtc yang umum digunakan adalah yang punya akurasi yang bagus

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.