Minggu, 12 Oktober 2025

Jam Digital dengan Arduino Uno, Dot Matrix (MAX7219), dan RTC DS3231



Panduan lengkap untuk membuat Jam Digital dengan Arduino Uno, Dot Matrix (MAX7219), dan RTC DS3231, lengkap dengan fitur teks berjalan yang menampilkan pesan "Waktu tidak akan pernah kembali, jadi hargailah setiap detiknya" secara bergantian.

🛠️ Komponen yang Dibutuhkan

  1. Arduino Uno x1

  2. Modul Dot Matrix (Disarankan modul -in- dengan chip MAX7219) x1

  3. Modul RTC DS3231 x1

  4. Kabel Jumper


🔌 Rangkaian Komponen (Wiring Diagram)

Proyek ini menggunakan dua jenis komunikasi: I2C untuk RTC DS3231 dan SPI untuk Dot Matrix MAX7219.

1. Koneksi RTC DS3231 (I2C)

DS3231 PinArduino Uno PinKeterangan
VCCCatu daya
GNDGNDGround
SCLA5Clock I2C
SDAA4Data I2C

2. Koneksi Dot Matrix MAX7219 (SPI)

MAX7219 PinArduino Uno PinKeterangan
VCCCatu daya
GNDGNDGround
DIN (Data In)D11Pin Data (MOSI)
CLK (Clock)D13Pin Clock (SCK)
CS (Chip Select/LOAD)D10Pin Chip Select

💻 Kode Program (Sketch Arduino)

1. Instalasi Library

Pastikan Anda telah menginstal dua library utama ini melalui Arduino IDE > Sketch > Include Library > Manage Libraries...:

  1. RTClib (oleh Adafruit)

  2. MD_Parola dan MD_MAX72xx (oleh MajicDesigns)

2. Kode Lengkap

Gunakan kode berikut. Logika di dalamnya akan menampilkan Jam selama 10 detik dan Teks Berjalan selama animasi teks selesai (sekitar 10 detik), dan berulang.

C++
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include <Wire.h>
#include "RTClib.h" 

// --- DEFNISI HARDWARE ---
// Tipe hardware (umumnya FC16_HW untuk modul 4-in-1)
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW 
// Jumlah modul 8x8 yang dirangkai (biasanya 4)
#define MAX_DEVICES 4 

// Pin koneksi SPI ke Arduino Uno
#define CS_PIN    10 

// --- INISIALISASI OBJEK ---
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
RTC_DS3231 rtc; 

// --- VARIABEL GLOBAL ---
// Buffer untuk string waktu (HH:MM:SS)
char timeChar[9]; 

// Pesan Teks Berjalan
const char MESSAGE[] = "Waktu tidak akan pernah kembali, jadi hargailah setiap detiknya";

// Variabel untuk mengelola pergantian mode tampilan
unsigned long previousMillis = 0;
// Interval minimal untuk mode jam digital sebelum beralih ke teks berjalan (10 detik)
const long interval = 10000; 
bool isClockMode = true;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  
  // Inisialisasi Dot Matrix
  P.begin();
  P.setIntensity(0); // Kecerahan 0 (tergelap) sampai 15 (terang)
  P.displayClear();

  // Inisialisasi RTC
  if (! rtc.begin()) {
    Serial.println("Tidak dapat menemukan modul RTC");
    while (1); 
  }
  
  /* * HANYA JALANKAN SEKALI UNTUK MENGATUR WAKTU AWAL!
   * Setelah waktu diatur, beri komentar pada baris di bawah ini.
   * rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); 
   */
   
  // Atur mode tampilan awal menjadi jam
  P.setTextAlignment(PA_CENTER);
  P.setTextEffect(PA_PRINT, PA_NO_EFFECT);
  previousMillis = millis();
}

void loop() {
  // Fungsi ini WAJIB dijalankan. Akan mengembalikan TRUE jika animasi selesai.
  if (P.displayAnimate()) { 
    // Jika animasi teks berjalan selesai, atau sudah waktunya ganti mode
    unsigned long currentMillis = millis();
    
    // Logika Pergantian Mode Tampilan
    if (currentMillis - previousMillis >= interval || !isClockMode) {
      previousMillis = currentMillis;
      isClockMode = !isClockMode; // Balik mode
      
      // Persiapkan tampilan baru
      if (isClockMode) {
        // Mode Jam Digital
        P.setTextAlignment(PA_CENTER);
        P.setTextEffect(PA_PRINT, PA_NO_EFFECT); 
      } else {
        // Mode Teks Berjalan
        P.setTextAlignment(PA_LEFT);
        // Tampilkan teks berjalan ke kiri dengan kecepatan 50ms per kolom
        P.displayScroll(MESSAGE, PA_LEFT, PA_SCROLL_LEFT, 50); 
      }
    }
  }

  // Logika tampilan Jam Digital (hanya berjalan saat isClockMode = true)
  if (isClockMode) {
    DateTime now = rtc.now();
    // Format waktu ke HH:MM:SS
    sprintf(timeChar, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
    P.print(timeChar);
  }
}

💡 Petunjuk Penggunaan Kode

  1. Pengaturan Waktu Awal:

    • Cari baris ini di fungsi setup(): // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

    • Hapus tanda komentar (//) dan upload kode. Ini akan menyetel RTC ke waktu komputer Anda saat kode dikompilasi.

    • Setelah upload pertama berhasil, TAMBAHKAN KEMBALI TANDA KOMENTAR (//) pada baris tersebut. Jika tidak, jam akan disetel ulang setiap kali Arduino dinyalakan.

  2. Mode Tampilan:

    • Tampilan akan berada dalam Mode Jam Digital selama 10 detik.

    • Setelah itu, tampilan akan beralih ke Mode Teks Berjalan dan menampilkan "Waktu tidak akan pernah kembali, jadi hargailah setiap detiknya".

    • Setelah pesan selesai bergulir, tampilan akan kembali ke Mode Jam Digital, dan seterusnya.

0 Comments:

Posting Komentar