//========   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