//Proyek #33:Jam Real Time dotmatrix
// Menggunakan Library arduino:
#include <RTClib.h>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
RTC_DS1307 RTC;
// Sesuaikan tipe hardware, ukuran, and output pin dari led dot matriks yang digunakan:
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 6   // jumlah modul dot matrix yang digunakan

// setup hardware SPI:
// MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
//Setup for software SPI:
#define CS_PIN 10 // sambungkan CS PIN dot matriks pada pin 10 arduino
#define DATA_PIN 11
#define CLK_PIN 13
#define SPEED_TIME 50 // kecepatan animasi teks/transisi berjalan
#define PAUSE_TIME  0
MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
//siapkan variabel untuk tampilan tanggal_sekarang dalam bentuk char array
char arrTgl[20]; //12 juli 2021
//siapkan variabel array untuk menampung nama-nama bulan
String bln [12] = {"Jan", "Feb", "Mar", "Apr","Mei", "Jun", "Jul", "Agst", "Sept", "Okt", "Nov", "Des"};
String hari [7] = {"Minggu,", "Senin,", "Selasa,", "Rabu,","Kamis,", "Jumat,", "Sabtu,"};

//sediakan variabel kontrol pergantian tampilan antara jam dan tanggal
int counter = 0;
//sediakan variabel untuk menentukan jam atau tanggal yang tampil
String posisi = "jam";
unsigned long previousMillis = 0;
void setup () {
  Serial.begin(115200);
RTC.begin();// buka komunikasi chip RTC
/*aktifkan instruksi ini untuk set tanggal dan waktu yang dinginkan saat compiler program */
//RTC.adjust(DateTime(__DATE__, __TIME__));
myDisplay.begin();   // Inisialisai  object MD_Parola:
  myDisplay.setIntensity(5); // Set intensitas kecerahan/brightness dari tampilan dot matrix (0-15):
  myDisplay.displayClear(); // Bersihkan Tampilan:
}

void loop(){
  //uji posisi jam yang ditampilkan
  if(posisi == "jam")
  baca_jam ();
  else
  if (posisi=="tanggal")
baca_tanggal();
//running text
}

void baca_jam(){
DateTime now = RTC.now();//dapatkan data jam & tanggal skrg
String jam, menit, detik, jam_sekarang;
jam = String (now.hour() );
menit = String (now.minute());
detik = String (now.second());
if (now.minute()<10 ){
  menit = "0" + menit;
}
if (now.second()<10 ){
  detik = "0" + detik;
}
jam_sekarang = jam + ":"+ menit +":" + detik;
Serial.println(jam_sekarang);
myDisplay.setTextAlignment(PA_CENTER);
myDisplay.print(jam_sekarang);

// gunakan instruksi delay tanpa delay agar waktu jam tidak terganggu
unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= 1000) //jeda 1 detik
    {
    previousMillis = currentMillis;
    counter++;
    }

if(counter ==10){
  posisi = "tanggal";
  counter = 0;
  myDisplay.displayClear();
}

}

void baca_tanggal(){
DateTime now = RTC.now();//dapatkan data jam & tanggal skrg
String tanggal, bulan, tahun, Tanggal_sekarang;

String Array_hari = now.dayOfTheWeek()[hari];
tanggal = String (now.day() );
//menambahkan karakter nol didepan tgl yang kurang dari 10
if(now.day() < 10){
tanggal = "0"+ tanggal;
}
//bulan = String (now.month());
String Array_bulan = now.month()[bln-1];
tahun = String (now.year());

Tanggal_sekarang = Array_hari + tanggal + " " + Array_bulan +" "+ tahun;
Serial.println(Tanggal_sekarang);
//ubah tipe string tanggal_sekarang menjadi char array, ditampung kedalam variabel arrtgl
Tanggal_sekarang.toCharArray (arrTgl,20) ;
//running text
if(myDisplay.displayAnimate())
{
myDisplay.displayText(arrTgl, PA_CENTER, SPEED_TIME, PAUSE_TIME, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
myDisplay.displayReset();
counter++;
if(counter > 1){
  posisi = "jam";
  counter = 0;
  myDisplay.displayClear();
}
}
// gunakan intruksi delay tanpa delay agar waktu jam tidak terganggu
unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= 100) //jeda 100 mili detik
    {
    previousMillis = currentMillis;
    }

}
GND5VSDASCLSQWRTCDS1307+