//======== Deklarasi Library-variabel-konstanta terkait Library RTC ========
#include <DS3231.h>
#include <Wire.h>
DS3231 myRTC; //deklarasi nama objek myRTC
//======= Deklarasi Library-variabel-konstanta terkait Library MD_Parola =======
#include <MD_Parola.h> //deklarasi penggunaan library Parola
#include <MD_MAX72xx.h>
#include <SPI.h> //deklarasi penggunaan library SPI
/* Mendefinisikan dua jalur I2C terpisah 2 grup x 2 modul */
#define HW_TYPE_1 MD_MAX72XX::FC16_HW //pendefinisian tipe FC16_HW utk grup atas
#define HW_TYPE_2 MD_MAX72XX::FC16_HW //pendefinisian tipe FC16_HW utk grup bawah
// Pendefinisian jumlah modul yg digunakan dan pin CS (Chip Select)
#define MAX_DEVICES 8 //pendefinisian total modul yg dikaskade | grup atas
#define CS_PIN 10 //pin CS terhubung ke pin 10 pd Arduino | grup atas
#define CLK_PIN 5 //pin CLK terhubung ke pin 13 pd Arduino | grup bawah
#define DATA_PIN 7 //pin DATA_PIN terhubung ke pin 11 pd Arduino | grup bawah
#define CS2_PIN 6 //pin CS terhubung ke pin 10 pd Arduino | grup bawah
//Membuat nama Class 'layar' lalu dikaitkan dengan library MD_Parola
MD_Parola layar1= MD_Parola(HW_TYPE_1, CS_PIN, MAX_DEVICES); // | grup atas
MD_Parola layar2= MD_Parola(HW_TYPE_2,DATA_PIN,CLK_PIN,CS2_PIN,MAX_DEVICES);// | grup bawah
textEffect_t animasi[] = { //blok var array berisi mode animasi
PA_SCROLL_RIGHT, PA_WIPE, PA_SCROLL_UP, //animasi #0, #1, #2
PA_SCROLL_DOWN, PA_OPENING_CURSOR, PA_BLINDS,//animasi #3, #4, #5
PA_SCROLL_UP_RIGHT, PA_SCROLL_DOWN_RIGHT,//animasi #6 dan #7
PA_MESH, PA_WIPE_CURSOR //animasi #8 dan #9
};
int i=0, j=0; //deklarasi dua penghitung utk display data dan animasi
void setup() {
layar1.begin(); //inisialisasi dot matrix
layar1.setIntensity(0); //set intensitas
layar1.displayClear(); //matikan seluruh dot
layar1.setTextAlignment(PA_CENTER);//set ke posisi tengah
layar1.setPause(500); //set jeda antar animasi
layar1.setSpeed(30); //set kecepatan animasi
layar2.begin(); //inisialisasi dot matrix
layar2.setIntensity(0); //set intensitas
layar2.displayClear(); //matikan seluruh dot
layar2.setTextAlignment(PA_CENTER);//set ke posisi tengah
layar2.setPause(500); //set jeda antar animasi
layar2.setSpeed(30); //set kecepatan animasi
if (layar1.displayAnimate()) { // | grup atas
layar1.displayText("- Jam Digital -", layar1.getTextAlignment(), layar1.getSpeed(), 2000, animasi[2], animasi[2]);
layar2.print("RTC-DotMatrix");
}
}
//=============================== Setup RTC ====================================
// Tidak ada perintah utk setup RTC karena diasumsikan RTC-DS3231 telah dipasang
// batere dan sudah dilakukan setting jam, tanggal, mode 12h/24h pd praktikum sebelumnya
}
//==============================================================================
void loop() {
int second, minute, hour; //deklarasi variabel detik, menit dan jam
int DoW; //variabel lokal utk menyimpan pembacaan DoW dari RTC
bool CenturyBit = false; //penanda overflow tahun 2099 ke 2100 tdk digunakan
bool h12Flag, pmFlag;//deklarasi variabel boolean utk mode 12h/24h
String tanggal, bulan, tahun, namaHari, temp;
String jam, menit, detik;
String grup_Tgl, grup_Jam;//variabel menyatukan data tgl dan data jam sblm ditampilkan
tanggal=myRTC.getDate(); //ambil data tanggal dari RTC
bulan = myRTC.getMonth(CenturyBit); //ambil data bulan dari RTC
tahun = myRTC.getYear(); //ambil data tahun dari RTC
//-------------------------
//membaca data jam, menit, detik dan hari (DoW)
hour = myRTC.getHour(h12Flag, pmFlag); //baca data jam dari RTC
minute = myRTC.getMinute(); //baca data menit dari RTC
second = myRTC.getSecond(); //baca data detik dari RTC
temp = myRTC.getTemperature(); //baca data suhu dari RTC
DoW = myRTC.getDoW(); //baca angka kode nama hari dari RTC
//-------------------------
switch (DoW) { //menterjemahkan kode nama hari dg Hari
case 1: namaHari="Mon "; break;
case 2: namaHari="Tue "; break;
case 3: namaHari="Wed "; break;
case 4: namaHari="Thu "; break;
case 5: namaHari="Fri "; break;
case 6: namaHari="Sat "; break;
case 7: namaHari="Sun "; break;
}
//-------------------------
//menambahkan angka 0 jika angka jam, menit & detik < 2 digit
jam = hour ; if (hour<10) { jam = "0" + String(hour); }
menit = minute ; if (minute<10) { menit = "0" + String(minute); }
detik = second ; if (second<10) { detik = "0" + String(second); }
//-------------------------
//menyatukan data ke dalam satu grup sebelum ditampilkan
grup_Tgl = namaHari + tanggal + "-" + bulan + "-" + tahun ;
grup_Jam = jam + ":" + menit + ":" + detik;
if (i==1) { //jika i=1 tampilkan grup jam
layar2.print(grup_Jam);
}
//--------------- Menampilkan data pada grup bawah ----------------
if (layar1.displayAnimate()) {
switch(i) {
case 0: //jika i=1, tampilkan Jam:menit:detik
layar2.print(grup_Jam);
break; //keluar dari blok instruktsi switch
case 1: //jika i=2, tampilkan hari tgl-bln-thn
layar2.print(grup_Tgl);
break; //keluar dari blok instruktsi switch
case 2: //jika i=3, tampilkan suhu
layar2.print(temp + " ^C");
break; //keluar dari blok instruktsi switch
}
//------------ Menampilkan data pada grup atas (dengan animasi) -------------
switch(i) {
case 0: //jika i=1, tampilkan dg animasi "Jam hari ini :"
layar1.displayText("Jam hari ini :", layar1.getTextAlignment(), 30, 8000, animasi[j], animasi[j]);
break;
case 1: //jika i=2, tampilkan dg animasi "Tanggal hari ini"
layar1.displayText("Tanggal hari ini", layar1.getTextAlignment(), layar1.getSpeed(), 3000, animasi[j], animasi[j]);
break;
case 2: //jika i=3, tampilkan dg animasi "Suhu hari ini"
layar1.displayText("Suhu hari ini :", layar1.getTextAlignment(), layar1.getSpeed(), 3000, animasi[j], animasi[j]);
i=0; //clearkan penghitung i
if (j==8) {j=0;} //clearkan penghitung j jika j=8
goto keluar;
}
i++; //naikkan penghitung 3 jenis display data
j++; //naikkan penghitung mode animasi
}
keluar: ;
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5