#include <TM1637Display.h>

#define CLK 8   // deklarasi pin CLK terhubung ke pin 8 Arduino
#define DIO 9   // deklarasi pin DIO terhubung ke pin 9 Arduino
//Inisialisasi library TM1637Display dengan nama display
TM1637Display display(CLK, DIO); 

#define PB 7
#define Buz 4 //deklarasi pin 4 terkonek ke Buz
uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };  //deklarasi var array data[], nyalakan semua
uint8_t blank[] = { 0x00, 0x00, 0x00, 0x00 }; //deklarasi var array blank[], matikan semua
int det, m1, m2, h1, h2; //deklarasi variabel detik, menit dan jam
int jam;   //deklarasi variabel jam menyatukan h2 dan h1
int menit; //deklarasi variabel jam menyatukan m2 dan m1
int menuChoice;         //deklarasi variabel pemilihan menu
bool colonFlag = false; // deklarasi variabel tipe boolean
int stat_PB=1;

void setup() {
  display.setBrightness(0x0f);    //set kecerahan display
  display.setSegments(data);     //nyalakan semua segmen
  delay(500);
  display.clear();
  Serial.begin(9600);
  m1=0; m2=3; h1=1, h2=2; jam=0; //set jam 21:30;
  pinMode(PB, INPUT); //set pin PB sbg input
  pinMode(PB, INPUT_PULLUP);

  tone(Buz, 400);
  Serial.println("!-------------------------------------------------------!");
  Serial.println("!                Menu Setting Jam & Alarm               !");
  Serial.println("!                       versi 1.0                       !");
  Serial.println("!-------------------------------------------------------!");
  Serial.println("!Petunjuk :                                             !");
  Serial.println("!Tekan tombol PB untuk setting jam & alarm              !");
  Serial.println("!Masukkan hanya angka desimal untuk setting jam & alarm !");
  Serial.println("!-------------------------------------------------------!");
  Serial.println("!Pilih 1 untuk menu setting jam                         !");
  Serial.println("!Pilih 2 untuk menu setting alarm                       !");
  Serial.println("!Pilih 3 untuk keluar                                   !");
  Serial.println("!-------------------------------------------------------!");
  noTone(Buz);
}

void menuSet()
{
  tone(Buz, 400); delay(100); noTone(Buz);
  while(Serial.available() == 0) {} // menunggu data serial masuk
  menuChoice = Serial.read() - 48;// baca data serial, koreksi dg -48
  switch (menuChoice) {
  case 1:
    Serial.println("! ------- menu setting Jam --------  !");
    Serial.print("Masukkan angka Puluhan Jam : ");
    Serial.end();       //matikan Serial komunikasi
    Serial.begin(9600); //aktifkan kembali
    while(Serial.available() ==0 ) {} //tunggu hingga ada data serial masuk
      h2 = Serial.read() - 48;        //h2 = angka puluhan jam
      Serial.println(h2);             //cetak ke Serial Monitor
      Serial.print("Masukkan angka Satuan Jam : ");
      Serial.end();        //matikan Serial komunikasi
      Serial.begin(9600);  //aktifkan kembali
    while(Serial.available()==0) {} //tunggu hingga ada data serial masuk
      h1 = Serial.read() - 48;      //h1 = angka satuan jam
      Serial.println(h1);           //cetak ke Serial Monitor

    // menu setting Menit
    Serial.print("Masukkan angka Puluhan Menit : ");
    Serial.end();       //matikan Serial komunikasi
    Serial.begin(9600); //aktifkan kembali
    while(Serial.available() ==0 ) {} //tunggu hingga ada data serial masuk
      m2 = Serial.read() - 48;        //m2 = angka puluhan menit
      Serial.println(m2);             //cetak ke Serial Monitor
      Serial.print("Masukkan angka Satuan Menit : ");
      Serial.end();      //matikan Serial komunikasi
      Serial.begin(9600);//aktifkan kembali
    while(Serial.available()==0) {} //tunggu hingga ada data serial masuk
      m1 = Serial.read() - 48;      //m1 = angka satuan menit
      Serial.println(m1);           //cetak ke Serial Monitor
    jam =  (h2*10) + (h1);        //salin h2 dan h1 ke variabel jam
    menit = (m2*10) + (m1);       //salin m2 dan m1 ke variabel menit
    Serial.print(jam); Serial.print(":"); //cetak h2h1 : m2m1
    Serial.println(menit);
    Serial.println();
    Serial.println("Tekan kembali PB untuk masuk ke dalam menu");
    Serial.end();      //matikan Serial komunikasi
    Serial.begin(9600);//aktifkan kembali
  break;

  case 2:
    Serial.println("! ------- menu setting Alarm --------  !");
    Serial.println("Masukkan angka Puluhan Jam : ");
    Serial.println("Masukkan angka Satuan Jam : ");
    Serial.println("Masukkan angka Puluhan Menit : ");
    Serial.println("Masukkan angka Satuan Menit : ");    
    Serial.println();
    Serial.println("Belum diimplementasikan");
    Serial.println("Tekan kembali PB untuk masuk ke dalam menu");
    Serial.end();       //matikan Serial komunikasi
    Serial.begin(9600); //aktifkan kembali
  break;      

  case 3:
    // Menu Keluar (Exit)
    Serial.print("Keluar.... Terima kasih ");
    Serial.println();
    Serial.println("Tekan kembali PB untuk masuk ke dalam menu");
    Serial.end();       //matikan Serial komunikasi
    Serial.begin(9600); //aktifkan kembali
  break;       
  }
}

void loop() { 
  //Serial.println("Loop detik");
  for(det = 0; det <= 60; det++) {
    //display.showNumberDec(det); // tampilkan detik
    delay(100);// untuk mengatur kecepatan kenaikan variabel det
    //Serial.print(det);
    //-----------------------------------------------
    stat_PB=digitalRead(PB);
    if (stat_PB==0) {
      menuSet();
    }

    jam =  (h2*1000) + (h1*100) + (m2*10) + (m1);
    if(colonFlag) {
      colonFlag =! colonFlag; //merubah true ke flase atau sebaliknya
      display.showNumberDecEx(jam, 0x40);//tampilkan jam dan nyalakan colon
    }
    else {
      colonFlag =! colonFlag; //merubah true ke flase atau sebaliknya
      display.showNumberDecEx(jam, 0x00);//tampilkan jam dan matikan colon
    }
    //-----------------------------------------------
    if(det==60) {    // jika det=60 maka
      det=0; m1++;   // det=0 dan m1=m1+1

      if(m1==10) {  // jika m1=10 (satuan menit), maka
        m1=0; m2++; // m1=0 dan m2=m2+1(naikkan puluhan menit)
        
        if(m2==6) {           // jika m2=6 (puluhan menit)
          m2=0; m1=0; h1++;   // m2=0, m1=0 dan h1=h1+1 (satuan jam)
          if(h2==2 && h1==4) {// jika h2=2 dan h1=4 (jam 24), maka
              h2=0; h1=0; m1=0; m2=0; //h2=0, h1=0, m1=0, m2=0
              //Serial.print(" puluhan jam: ");
              //Serial.println(h2);
          }
          if(h1==10) {        // jika h1=10 (satuan jam), maka
            h2++;             // h2=h2+1 (puluhan jam)
            h1=0; m2=0; m1=0; // h1=0, m2=0, m1=0
            //Serial.print(" puluhan jam: ");
            //Serial.println(h2);            
          }
        }
      }
    }
  }
}
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
4-Digit Display
sevseg1:CLK
sevseg1:DIO
sevseg1:VCC
sevseg1:GND
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
bz1:1
bz1:2
gnd1:GND
vcc2:VCC