Untuk buat jam digital Arduino, anda hanya perlukan tiga komponen: Arduino Uno, modul RTC DS3231 dan LCD1602 dengan backpack I2C. Kedua-dua modul duduk atas bus I2C yang sama — empat utas wayar setiap modul, dan talian datanya berkongsi pin A4 dan A5 — dan bateri backup pada DS3231 memastikan masa terus berjalan walaupun bekalan kuasa dicabut.
Kenapa perlu modul DS3231? Tak boleh ke Arduino kira masa sendiri?
Cip DS3231 wujud sebab Arduino Uno sebenarnya tak tahu pukul berapa sekarang. Fungsi millis() cuma mengira berapa lama board sudah hidup, dan kiraan itu kembali ke sifar setiap kali kuasa terputus atau butang reset ditekan. Tanpa RTC (real-time clock), "jam" anda bermula dari kosong setiap kali dipasang semula.
DS3231 menyelesaikan masalah itu dengan dua kelebihan. Pertama, TCXO — crystal oscillator yang dipampas suhu — memberikannya kejituan ±2ppm pada julat 0°C hingga +40°C, iaitu lebih kurang ±1 minit setahun. Kedua, holder bateri di belakang modul memastikan masa terus dikira walaupun Arduino dimatikan berbulan-bulan. Set masa sekali, dan jam anda kekal tepat.
Senarai komponen
Macam mana nak sambung DS3231 dan LCD1602 ke Arduino Uno?
Modul DS3231 dan LCD1602 I2C kedua-duanya bercakap melalui bus I2C, jadi pendawaiannya sangat mudah: kedua-dua modul berkongsi pin yang sama pada Arduino Uno. Tiada sepuluh utas wayar ke LCD — empat pin setiap modul, itu sahaja.
| Pin modul | Pin Arduino Uno | Catatan |
|---|---|---|
| DS3231 VCC | 5V | Modul ini boleh terima 3.3V atau 5V; untuk Uno, guna 5V. |
| DS3231 GND | GND | Ground mesti berkongsi. |
| DS3231 SDA | A4 (SDA) | Talian data I2C. |
| DS3231 SCL | A5 (SCL) | Talian clock I2C. |
| LCD1602 I2C VCC | 5V | Backpack LCD perlukan 5V untuk paparan yang jelas. |
| LCD1602 I2C GND | GND | Kongsi ground yang sama. |
| LCD1602 I2C SDA | A4 (SDA) | Pin sama dengan DS3231 — memang begitu caranya. |
| LCD1602 I2C SCL | A5 (SCL) | Pin sama dengan DS3231. |
Perhatikan SDA dan SCL: kedua-dua modul disambung ke pin yang sama. Itulah keistimewaan I2C — setiap peranti ada alamat sendiri, macam rumah-rumah di atas jalan yang sama. DS3231 menggunakan alamat 0x68, manakala cip EEPROM AT24C32 yang menumpang pada modul yang sama duduk di 0x57. Backpack LCD pula selalunya di 0x27 (cip PCF8574) atau 0x3F (PCF8574A). Kalau tak pasti, upload sketch I2C scanner — ia akan senaraikan semua alamat yang wujud pada bus anda.
Satu perkara praktikal: sesetengah modul DS3231 padat sampai dengan header pin yang belum dipasang penuh. Solder dulu header itu sebelum mula — panduan cara solder header pin kami tunjukkan langkah demi langkah. Sambungan longgar di breadboard ialah punca nombor satu masalah "RTC tak jumpa".

Bateri LIR2032 atau CR2032 — mana satu selamat untuk DS3231?
Kebanyakan modul DS3231 padat ada litar cas ringkas — satu diode 1N4148 dan perintang 200Ω — yang direka untuk mengecas semula bateri jenis LIR2032 (boleh dicas) setiap kali modul menerima kuasa 5V. Di sinilah ramai orang tersilap: bateri CR2032 biasa tidak boleh dicas, tetapi saiznya sama dan muat elok dalam holder yang sama.
Kalau CR2032 dipasang pada modul yang litar casnya masih aktif, arus cas akan dipaksa masuk ke dalam bateri yang tak direka untuk menerimanya. Bateri boleh kembung, bocor, dan dalam kes terburuk menjadi risiko kebakaran. Peraturannya mudah:
- Jalan paling selamat untuk pemula: guna LIR2032. Itulah bateri yang memang dirancang untuk modul ini, dan ia dicas semula secara automatik setiap kali jam anda hidup.
- CR2032 hanya jika laluan cas tiada atau sudah dilumpuhkan. Sesetengah modul dijual tanpa diode dan perintang cas. Kalau anda tak pasti modul anda yang mana, kekal sahaja dengan LIR2032.
- Bagi yang berpengalaman, laluan cas boleh dilumpuhkan dengan menanggalkan diode atau perintang 200Ω itu — tetapi itu kerja solder SMD peringkat advanced, bukan langkah wajib projek ini.

Apa kod penuh untuk jam digital Arduino ini?
Jam digital DS3231 ini perlukan dua library daripada Library Manager Arduino IDE: RTClib oleh Adafruit untuk RTC, dan LiquidCrystal I2C oleh Frank de Brabander untuk paparan. Pergi ke Sketch → Include Library → Manage Libraries, cari nama masing-masing, dan tekan Install.
Logik paling penting dalam sketch ini ialah rtc.lostPower(): ia hanya benar apabila DS3231 pernah kehilangan kuasa sepenuhnya, contohnya semasa bateri baru dipasang. Ketika itu sahaja masa akan diset — kepada masa komputer anda semasa sketch di-compile. Selepas itu bateri yang jaga masa, dan anda bebas upload sketch lain tanpa jam terpadam. Pastikan bateri sudah terpasang sebelum upload kali pertama.
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2); // tukar ke 0x3F kalau backpack anda guna PCF8574A
// RTClib: dayOfTheWeek() pulangkan 0 = Ahad ... 6 = Sabtu
const char namaHari[7][7] = {"Ahad", "Isnin", "Selasa", "Rabu",
"Khamis", "Jumaat", "Sabtu"};
void setup() {
lcd.init();
lcd.backlight();
if (!rtc.begin()) {
lcd.print("RTC tak jumpa");
while (true); // berhenti di sini - semak wayar SDA/SCL
}
// Kalau RTC baru pertama kali hidup (atau bateri baru diganti),
// set masa kepada masa komputer semasa sketch ini di-compile
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
DateTime now = rtc.now();
char baris[17]; // LCD muat 16 aksara + penamat null
// Baris atas: masa dalam format HH:MM:SS
snprintf(baris, sizeof(baris), "%02d:%02d:%02d",
now.hour(), now.minute(), now.second());
lcd.setCursor(0, 0);
lcd.print(baris);
// Baris bawah: hari + tarikh DD/MM/YY
snprintf(baris, sizeof(baris), "%-6s %02d/%02d/%02d",
namaHari[now.dayOfTheWeek()], now.day(),
now.month(), now.year() % 100);
lcd.setCursor(0, 1);
lcd.print(baris);
delay(1000);
}
Selepas upload, baris atas LCD memaparkan jam, minit dan saat manakala baris bawah memaparkan hari dan tarikh. Kalau LCD menyala tetapi kosong, pusing trimmer biru di belakang backpack perlahan-lahan sehingga aksara muncul — itu pelarasan contrast, bukan kerosakan.

Video ini menunjukkan pemasangan DS3231 dengan LCD I2C yang hampir serupa, langkah demi langkah:
Kesilapan biasa yang kami nampak
Lima kesilapan DS3231 dan LCD I2C di bawah paling kerap berulang dalam kalangan pelajar yang buat projek jam. Semuanya senang dielakkan.
- Pasang CR2032 pada modul yang masih ada litar cas. Beberapa minggu kemudian bateri kembung. Guna LIR2032, atau pastikan laluan cas memang tiada sebelum guna CR2032.
- LCD menyala tapi tiada tulisan. Selalunya ini cuma hal contrast — pusing trimmer biru di belakang backpack. Kalau masih kosong juga, barulah semak alamat I2C.
- "RTC tak jumpa" padahal wayar nampak betul. Selalunya SDA dan SCL tertukar, atau header pin modul belum disolder dan cuma tersisip longgar. Semak setiap sambungan dengan mod continuity — panduan cara guna multimeter digital kami tunjukkan caranya.
- Jam kembali ke masa lama setiap kali reset. Dua punca: bateri tiada atau sudah lemah, atau
rtc.adjust()dipanggil tanpa syaratlostPower()sehingga masa diset semula ke masa compile lama pada setiap restart. - Alamat LCD salah dalam kod. Backpack PCF8574 selalunya 0x27, PCF8574A pula 0x3F. Kalau paparan degil, jalankan I2C scanner dan padankan alamat dalam constructor
LiquidCrystal_I2C.
FAQ
Kenapa jam saya lambat beberapa saat berbanding jam telefon?
Sebab kaedah F(__DATE__), F(__TIME__) mengambil masa ketika sketch di-compile, dan proses compile serta upload makan beberapa saat. Selepas itu DS3231 sendiri hanya hanyut lebih kurang satu minit setahun, jadi beza itu takkan membesar. Kalau mahu saat yang lebih tepat, cabut USB dan bateri sekejap supaya lostPower() benar semula, kemudian compile dan upload sejurus jam komputer masuk minit baharu.
Berapa lama bateri pada modul DS3231 boleh bertahan?
Bateri hanya bekerja apabila kuasa utama terputus, dan dalam mod backup DS3231 menggunakan arus yang sangat kecil — sebab itu satu sel kecil mampu menjaga masa selama bertahun-tahun. LIR2032 pula dicas semula secara automatik setiap kali jam anda hidup, jadi dalam penggunaan biasa anda jarang perlu menggantinya.
Boleh ke DS3231 papar suhu sekali?
Boleh. DS3231 ada sensor suhu terbina dalam — sensor itu sebahagian daripada sistem pampasan TCXO-nya — dan RTClib mendedahkannya melalui rtc.getTemperature(). Panggil fungsi itu dan paparkan nilainya pada baris kedua LCD kalau anda mahu jam yang sekali gus jadi termometer bilik.
Boleh ke guna DS1307 yang lebih murah untuk projek ini?
Boleh berfungsi, tetapi DS1307 bergantung pada crystal luaran tanpa pampasan suhu, jadi masanya hanyut jauh lebih cepat dan hanyutnya berubah ikut suhu persekitaran. Untuk jam yang akan berjalan berbulan-bulan tanpa diset semula, DS3231 dengan TCXO ialah pilihan yang betul, dan library RTClib yang sama menyokong kedua-duanya.
Projek ini sesuai tak untuk projek RBT atau FYP?
Sangat sesuai — pendawaian ringkas, hasilnya nampak serta-merta, dan senang dikembangkan: tambah buzzer untuk fungsi alarm, paparkan suhu, atau cuba projek Uno yang lain seperti jemuran automatik dengan sensor hujan. Untuk FYP, modul ini juga asas yang baik untuk data logger kerana EEPROM AT24C32 di atasnya boleh menyimpan bacaan.
Kemas kini terakhir Ogos 2026. Tersangkut? Chat dengan kami di WhatsApp.



Arduino Uno Compatible SMD UNO R3 with Type B Cable - ATMEGA328P with CH340G-Microcontroller Project
DS3231 Real Time Clock Module RTC I2C Module Compact Size For Arduino IOT
LCD1602 LCD2004 Liquid Crystal Display Module with IIC I2C Basic 16x2 20x4For Arduino Display Application - 1602 + I2C (Blue)