Modul jam adalah modul elektronik yang umumnya digunakan untuk mengukur waktu dan tanggal. Modul ini biasanya dilengkapi dengan osilator kristal untuk menghasilkan referensi waktu yang akurat, serta memiliki rangkaian pengendali untuk mengatur dan menyesuaikan waktu.
Pada aplikasi yang membutuhkan akurasi waktu tinggi, modul jam DS1302 dan DS3231 dapat memenuhi kebutuhan dasar. Di bawah ini, saya akan memperkenalkan definisi, diagram pin, parameter, fungsi, dan pemrograman modul jam DS3231.
Apa itu Modul RTC DS3231?
Modul RTC DS3231 adalah modul Real-Time Clock (RTC) yang populer dan sering digunakan dalam proyek-proyek elektronik. Modul ini merupakan perangkat berukuran kecil dan berbiaya rendah yang menyediakan fungsi pencatatan waktu dan kalender yang akurat. Modul RTC DS3231 didasarkan pada chip DS3231, yang merupakan RTC yang sangat akurat dengan osilator kristal yang dikompensasi suhu terintegrasi. Modul ini mampu menyediakan informasi waktu dan tanggal dengan akurasi hingga ±2 ppm.
Modul RTC DS3231 banyak digunakan dalam aplikasi seperti pencatatan data, penandaan waktu, dan sistem alarm. Modul ini juga sering digunakan pada perangkat elektronik yang memerlukan pencatatan waktu yang presisi, seperti kamera, perekam audio, dan pengontrol industri. Modul ini mudah digunakan dan dapat diintegrasikan dengan mikrokontroler seperti Arduino dan Raspberry Pi.
Secara keseluruhan, Modul RTC DS3231 adalah modul jam yang andal dan akurat yang banyak digunakan dalam berbagai proyek elektronik.
Parameter Modul RTC DS3231
| Parameter | Value |
|---|---|
| Size | 38mm (length), 22mm (width), 14mm (height) |
| Weight | 8g |
| Working voltage | 3.3-5.5V |
| Clock accuracy | ±2ppm from 0°C to +40°C; ±3.5ppm from 40°C to +85°C |
| Calendar alarm clocks | 2 programmable |
| Square wave output | Yes |
| Real-time clock output | Seconds, minutes, hours, weekdays, dates, months and years |
| Leap year compensation | Up to 2100 |
| Temperature sensor | Built-in with ±3°C accuracy |
| Memory chip | AT24C32, 32K storage capacity, IIC bus interface |
| Memory chip features | Maximum transmission speed 400KHz, address can be modified |
| Battery backup | Yes, for continuous timing |
| Operating temperature | Commercial: 0°C to +70°C; Industrial: -40°C to +85°C |
| Power consumption | Low |
| Other features | Aging correction register, RST output, push button reset input |
| UL approved | Yes |
Struktur Chip Jam DS3231
Chip jam DS3231 terdiri dari delapan modul, yang dibagi menjadi empat kelompok fungsi: TCXO, pengatur daya, tombol reset, dan RTC.

DS3231 TCXO
TCXO dilengkapi dengan sensor suhu, osilator, dan logika pengendali. Pengendali membaca keluaran sensor suhu pada chip, menggunakan tabel pencarian untuk menentukan kapasitansi yang diperlukan, menambahkan koreksi penuaan dari register AGE, dan kemudian mengatur register pemilihan kapasitansi. Nilai-nilai baru, termasuk perubahan pada register AGE, hanya dimuat ketika suhu berubah atau ketika konversi suhu yang diinisiasi pengguna selesai. Nilai suhu dibaca saat daya VCC dinyalakan dan kemudian setiap 64 detik.
Pengaturan Daya DS3231
Fungsi pengendalian daya disediakan oleh referensi tegangan yang dikompensasi suhu (VPF) dan rangkaian komparator yang memantau tingkat tegangan VCC. Ketika VCC lebih tinggi dari VPF, DS3231 disuplai daya oleh VCC. Ketika VCC lebih rendah dari VPF tetapi lebih tinggi dari VBAT, DS3231 tetap disuplai daya oleh VCC. Ketika VCC lebih rendah dari VPF dan lebih rendah dari VBAT, DS3231 disuplai daya oleh VBAT. Untuk melindungi baterai, osilator tidak akan mulai beroperasi ketika VBAT pertama kali diterapkan ke perangkat kecuali VCC telah terisi atau alamat I2C yang valid ditulis ke perangkat. Waktu startup osilator tipikal kurang dari 1 detik. Setelah VCC dinyalakan atau alamat I2C yang valid ditulis, perangkat mengukur suhu sekali dan mengkalibrasi osilator menggunakan nilai koreksi yang dihitung setelah sekitar 2 detik. Setelah osilator berjalan, osilator akan tetap beroperasi selama daya (VCC atau VBAT) masih valid. Perangkat mengukur suhu dan mengkalibrasi frekuensi osilator setiap 64 detik.
Tombol Reset DS3231
DS3231 memiliki fungsi sakelar tombol yang terhubung ke pin keluaran RST. Jika DS3231 tidak sedang dalam siklus reset, perangkat ini terus memantau tepi turun sinyal RST. Jika terdeteksi adanya transisi tepi, DS3231 menyelesaikan proses debounce sakelar dengan menarik RST ke level rendah. Setelah timer internal habis, DS3231 terus memantau sinyal RST. Jika sinyal tetap pada level rendah, DS3231 terus memantau jalur sinyal untuk mendeteksi tepi naik. Setelah tombol dilepaskan, DS3231 memaksa RST ke level rendah dan mempertahankan tRST. RST juga dapat digunakan untuk menandakan alarm kegagalan daya. Ketika VCC lebih rendah dari VPF, sinyal alarm kegagalan daya internal dihasilkan, dan RST ditarik ke level rendah. Jika osilator tidak berfungsi saat VCC terbebani, tREC dilewati, dan RST segera menjadi tinggi.
DS3231 Jam dan Kalender RTC
Informasi jam dan kalender dapat diperoleh dengan membaca byte register yang sesuai. Data jam dan kalender dapat diatur atau diinisialisasi dengan menulis byte register yang sesuai. Isi register jam dan kalender disajikan dalam format bilangan desimal yang dikodekan secara biner (BCD). DS3231 beroperasi dalam mode 12 jam atau 24 jam. Bit keenam dari register jam menentukan pemilihan mode 12 jam atau 24 jam. Ketika bit ini bernilai tinggi, mode 12 jam dipilih. Dalam mode 12 jam, bit kelima adalah bit penunjuk AM/PM, yang bernilai logika tinggi untuk PM.
Register dan Fungsi Internal DS3231
Alamat register DS3231 adalah 00h–12h, yang masing-masing digunakan untuk menyimpan informasi detik, menit, jam, minggu, tanggal, dan pengaturan alarm. Selama akses multi-byte, jika alamat mencapai 12h di ujung ruang RAM, akan terjadi perputaran. Pada saat ini, posisikan kembali ke posisi awal yaitu unit 00h.
Informasi waktu dan kalender DS3231 diatur dan diinisialisasi dengan membaca register yang sesuai. Buffer bantu pengguna digunakan untuk mencegah kemungkinan kesalahan saat register internal diperbarui. Saat membaca register waktu dan kalender, buffer pengguna berada dalam kondisi START apa pun. Atau disinkronkan dengan register internal saat penunjuk register kembali ke nol.
Informasi waktu dibaca dari register bantu ini, dan jam terus berjalan pada saat ini, sehingga pembacaan ulang register dapat dihindari saat pembaruan register utama terjadi selama operasi pembacaan. Mengambil register kontrol (alamat 0EH) sebagai contoh, register ini dapat mengontrol jam waktu nyata, alarm, dan keluaran gelombang persegi.
DS3231 Pin Diagram

| Pin Name | Function |
|---|---|
| 32 kHz | 32 kHz frequency output |
| VCC | Used for the DC pin of the main power supply |
| /INT/SQW | Low-level active interrupt or square wave output |
| RST | Reset pin |
| N.C. | Indicates no connection; the external must be grounded |
| GND | Ground |
| VBAT | Backup power input |
| SDA | Serial data input and output |
| SCL | Serial clock input |
Diagram Blok DS3231

Memprogram Modul RTC DS3231 dengan Arduino Uno
Alat yang Dibutuhkan:
- Arduino Uno x1
- Modul RTC DS3231 x1
- Jumper (kabel DuPont)
Petunjuk Pemasangan Kabel

| Pin on DS3231 RTC Module | Pin on Arduino Uno |
|---|---|
| SCL | A5 |
| SDA | A4 |
| VCC | 5V |
| GND | GND |
Menginstal Pustaka RTClib
Pustaka yang digunakan dalam contoh ini adalah RTClib yang dibuat oleh Adafruit; silakan instal pustaka ini terlebih dahulu.
Proyek – Muat Perpustakaan – Kelola Perpustakaan – Masukkan "RTClib" di kotak pencarian
Mengonfigurasi DS3231
Pertama, Anda perlu memuat pustaka RTClib yang baru saja Anda instal.
#include "RTClib.h"
Setelah itu, Anda dapat membuat sebuah instance DS3231 bernama rtc, dan Anda dapat memanggil fungsi RTC_DS3231
RTC_DS3231 rtc;
Fungsi yang digunakan untuk mengatur waktu adalah rtc.adjust, misalnya:
rtc.adjust(DateTime(to_year, to_month, to_day, to_hours, to_minute, to_second));
Fungsi ini digunakan untuk mendapatkan waktu dari DS3231 melalui rtc.now(), dan data yang dikembalikan berjenis DateTime, yang berisi informasi tahun, bulan, hari, jam, menit, dan detik, misalnya:
DateTime now = rtc.now();
// Display the current time of DS3231 through the serial port output
Serial.print(now.year(), DEC); // display the year in decimal
Serial. print('/');
Serial.print(now.month(), DEC);// Display the month in decimal
Serial. print('/');
Serial.print(now.day(), DEC);// Display the day in decimal
Serial. print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial. print(") ");
Serial.print(now.hour(), DEC);// display in decimal
Serial. print(':');
Serial.print(now.minute(), DEC);// Display minutes in decimal
Serial. print(':');
Serial.print(now.second(), DEC);// Display seconds in decimal
Serial. println();
Kode program lengkap
// by lingshunlab.com
// Load the library of DS3231
#include "RTClib.h"
// create rtc instance
RTC_DS3231 rtc;
String input_string; // Declare the variable input_string to store the data input by the serial port
// Declare a two-dimensional array variable daysOfTheWeek, which is used to match the corresponding week name through the index (index) of the array
char daysOfTheWeek[7][12] = {"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"};
// get serial port data function
void GetSerialStuff(String& input_string) {
String temp_string = ""; // Declare the variable temp_string to temporarily store the data input by the serial port
while(Serial.available()) { // When the serial port has data, loop execution
temp_string += (char)Serial.read(); // Combine the read serial data into the inStr variable one by one
delay(2);
}
input_string = temp_string; // Assign the reference pointer variable to tempStr
}
void setup() {
Serial.begin(9600);
// Initialize rtc,
if (! rtc.begin()) { // If initialization fails, then
Serial.println("Couldn't find RTC");
Serial. flush();
abort(); // program stops
}
}
void loop() {
GetSerialStuff(input_string); // Get the data of the serial port
if(input_string != "") { // If the serial port is not empty, then
int to_year = input_string.substring(0, 4).toInt(); // Intercept year data from string and convert to int data type
int to_month = input_string.substring(5, 7).toInt(); // Intercept the month data from the string and convert it to int data type
int to_day = input_string.substring(8, 10).toInt(); // Intercept the day data from the string and convert it to int data type
int to_hours = input_string.substring(11, 13).toInt(); // Intercept the hour data from the string and convert it to int data type
int to_minute = input_string.substring(14, 16).toInt(); // Intercept minute data from the string and convert it to int data type
int to_second = input_string.substring(17, 19).toInt(); // Intercept the second data from the string and convert it to int data type
// Reset the time of the DS3231 module
rtc.adjust(DateTime(to_year, to_month, to_day, to_hours, to_minute, to_second));
delay(100);
}
// Get the time of DS3231
DateTime now = rtc.now();
// Display the current time of DS3231 through the serial port output
Serial.print(now.year(), DEC); // display the year in decimal
Serial. print('/');
Serial.print(now.month(), DEC);// Display the month in decimal
Serial. print('/');
Serial.print(now.day(), DEC);// Display the day in decimal
Serial. print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial. print(") ");
Serial.print(now.hour(), DEC);// display in decimal
Serial. print(':');
Serial.print(now.minute(), DEC);// Display minutes in decimal
Serial. print(':');
Serial.print(now.second(), DEC);// Display seconds in decimal
Serial. println();
// Display the temperature sensor data of DS3231 through the serial port output
Serial. print("Temperature: ");
Serial.print(rtc.getTemperature());
Serial. println("C");
delay(1000);
}
Aplikasi DS3231
- Sistem akuisisi data
- Sistem kontrol industri
- Cadangan baterai
- Pemantauan suhu
- Sistem kontrol akses
- Perangkat medis




