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):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #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(); 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
harinya meleset mas… jam dan tanggal dah pas
ralat…. dah ok
Min kalau make rtc ds1307 ko error declarasi di Datetime dt nya knp ya?
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”
min kalo buat programnya ngelooping gimana? biar di serial monitor jalan terus gitu…… hehehe makasih
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
mas kalau untuk menghidupkan dan mematikan sistem arduino dr rtc itu caranya gimana ya?
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();
}
Min klw jam di serial monitornya 165.165.165
Gimana yah cara memperbaikinya?
Sudah gonta ganti script juga tapi tetap eror
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
Gan, kalau yg keluar Saturday/2000/1/1. 0:0:0 kenapa ya gan?
rtc belum di set/gagal di set
mas untuk set RTC pertama kali gimana code nya ya ?
pak,pull up untuk sda,scl berapa ohm?
10k ohm cukup
kalo pake modul rtc, umunya sudah termasuk pullup resistor ini
mas kalu mau setting rtc akan nampilkan waktu ketika buttton diklik 2 kali dalan kurun waktu 10 detik apakah bisa?
bisa saja,
misal menggunakan millis() untuk menentukan waktu klik pertama dan kedua
Kalo menggunakan 1 rtc untuk 2 arduino bisa gak ya?
Gan nmoang nanya ni, klo memasukan 2 entri alarm gimana yak?
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
Gan saya mau buat project penjadwalan program
Senin-jum’at program jalan
Sabtu – minggu program tidak jalan
m
bisa gak gan, rtc ds3231
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
}
mas kalo setiap 5 menit sekali ada data yang hilang selama 3 detik di rtc ds1307 itu kenapa ya mas ?
bisa disebabkan rtc (crystal-nya) tidak akurat
Mas kalau bikin program count down menggunakan RTC 1307 bagaimana caranya mas?
contoh hitung mundur:
https://www.project.semesin.com/2018/05/28/hitung-mundur-arduino-volatile-countdown/
Gan saya bikin jam digital pake rtc ds3231, kok waktunya berkurang sekitar 30 detk perhari, kenapa ya?rtc nya baru
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
klo gini kn tinggal setting tiap jam 24:00 reset rtc ke 00:00 biar menghindari melencengnya
Mas kalau sketch jws, untuk jam, hari, tgl, th, itu ngisi sendiri ya, minta contohnya, Mas, pengin belajar.
jam, hari, tgl, th, itu ngisi sendiri sesuai tanggal compile-nya, contohnya sama seperti koding di halaman ini
hasil hari ini saya coba, ternyata harinya meleset, gimana solusinya
13:51:54.962 -> Set waktu RTC otomatis dengan arduino
13:51:54.996 -> https://www.project.semesin.com/
13:51:55.029 ->
13:51:55.029 -> Senin, 24/8/2019 13:51:48
#define tokenRTC 0xAA //<== rubah token jika ingin nilai baru (update)
Mas, kenapa ya RTC saya gagal diset. Saya udah memasukkan progam sama persis yg diatas. Dan pi nya juga udah bener. Tolong solusinya????
coba ganti #define tokenRTC 0xAA jadi 0xAB
karena koding ini hanya ngeset rtc 1x
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
bisa mulai dari contoh ini
pewaktu tomatis dengan arduino aplikasi pemberi pakan ikan
Gan, kok gak pas ya.apa yg perlu dirubah. Tolong infonya?????
copy koding dihalaman ini, ganti ‘tokenRTC’ pada baris 7 dengan nilai lainnya misal 0xBB
Mas, kalau ngganti nama harinya,dr Inggris ke Indonesia bisa gak? Tolong dijawab kak, pengen belajar
bisa, ganti bagian ini
String strNamaHari[] = {“Minggu”, “Senin”, “Selasa”, “Rabu”, “Kamis”, “Jum’at”, “Sabtu”};
menjadi
String strNamaHari[] = {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”};
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
contoh kasus pemberi makan ikan
https://www.project.semesin.com/2019/07/13/pewaktu-otomatis-dengan-arduino-aplikasi-pemberi-pakan-ikan/
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.
bisa, periksa detik hingga tanggal setiap waktu untuk alarm 1
nanyak ka, klau rtc klau suka ngitung kembali ke hari senin pukul 00:00:00 , itu knapa ya,,,?
padahl cek batrai, masih 3.3V ,,,
coba cek fisiknya
bisa jadi korslet atau baterai tidak kontak dengan holdernya (goyang)
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
indikasi pembacaan rtc = gagal
cek kabel (kebalik), modul, baterai
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
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);
mas, kalo di display saya muncul jamnya 45:85:85 dan tanggalnya 165/45/2165. itu karena apa ya mas?
rtc tidak terbaca
ce pengkabelan, cek pemasangan kemungkinan terbalik sda/scl
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?
if(now.minute() != 0 && now.minute() != 30) first = true;
if((now.minute() == 0 || now.minute() == 30) && first == true)
Mas, bagaimana yah program untuk membuat penjadwalan kerja suatu sensor menggunakan RTC DS3231 mas ?
Terima kasih
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();
}
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
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();
}
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?
belum bisa dianalisa permasalahannya
cek code sketchnya barangkali ada kekeliruan
Mas. Sya mau naNya. Cara nampilin rtc ke print thermal gmn yh
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());
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 ?
untuk timernya cek https://www.project.semesin.com/2020/02/22/penjadwalan-pembacaan-sensor-berbasis-rtc-ds3231/
pada saat hendak mati, gunakan perintah dmd.end()
pada saat hendak hidup, gunakan perintah dmd.begin()
Mas, bikin waktu untuk fermentasi otomatis gimana ya ? Programnya, jika alat dihidupkan timer akan berjalan setelah 24 jam , alat akan mati otomatis
banyak cara, salah satunya menggunakan epoch, jadi jika epoch + 1 hari (= 24 * 60 * 60) tercapai, maka alat akan dimatikan
kak mau tanya kalo beda nya sama RTC DS1302 itu gimana ya?
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
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 ….
bisa pake rtc ds1302
kelebihan ds1302 bisa menggunakan super capacitor sebagai pengganti baterai,
tapi rtc yang umum digunakan adalah yang punya akurasi yang bagus
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
untuk penjadwalan pompanya bisa dengan mengembangkan sketch di link ini https://www.project.semesin.com/2020/02/22/penjadwalan-pembacaan-sensor-berbasis-rtc-ds3231/
untuk kontrol pompa melalui sensor kelembaban bisa dengan cara memonitor terus menerus/loop sensor kelembabannya dan melakukan aksi pompa hidup/mati jika syaratnya terpenuhi
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
artikel mengenai penjadwalan https://www.project.semesin.com/2020/02/22/penjadwalan-pembacaan-sensor-berbasis-rtc-ds3231/
buat fungsi sesuai kebutuhan dan panggil ketika syarat jadwalnya terpenuhi
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
untuk penjadwalan seperti itu, lihat contoh ini: https://www.project.semesin.com/2020/02/22/penjadwalan-pembacaan-sensor-berbasis-rtc-ds3231/
Min, kalo Rtc kurang akurat itu kenapa yah? untuk tanggalnya akurat tapi untuk jamnya beda 2 menit
[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
Kak cara ngambil data 15 Menit sekali dengan rtc ds1307 gimana ya kak
cek artikel : https://www.project.semesin.com/2020/02/22/penjadwalan-pembacaan-sensor-berbasis-rtc-ds3231/
Harinya kok keliru ya mas?
Pakai program yang tanpa library + pakai nodemcu esp8266
sketch ini hanya efektif untuk modul rtc yang dalam kondisi baru/cabut baterai
terimakasih bang, sangat membantu.
mas utk set RTCnya pertama kali gimana ya ?
karena diserial monitor saya munculnya 1/1/2000
lepas sementara baterai nya
Saya mau membuat servo otomatis menggunakan esp8266+RTC ,apakah saya harus setting RTC nya dahulu?
‘otomatis’ dalam arti kata otomatis gerak/pindah posisi pada waktu rtc tertentu, sebaiknya setting rtc dahulu agar timing/waktunya tepat
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
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
pagi mas
maaf library nya tdk bs d download ya?
bisa
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
bisa seperti itu, bisa dimulai dengan contoh2 yang ada
Min Cara Reset waktu RTC nya gimana ya ?soalnya RTC saya pas di check di serial monitor waktunya 1-1-2000
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