#include <TM1637Display.h>

#define PB 7
#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 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;
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("!Masukkan hanya angka desimal untuk setting jam & alarm !");
  Serial.println("!Masukkan karakter yang diminta yang muncul pada menu ! !");
  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 loop() {
  stat_PB=digitalRead(PB);
  if (stat_PB==0) {
    tone(Buz, 400); delay(50); noTone(Buz);
    stat_PB=1;
    menuSet();
  }
}

void menuSet() {
  while(Serial.available() == 0) {} // menunggu data serial masuk
    menuChoice = Serial.read() - 48;// baca data serial, koreksi dg -48
    switch (menuChoice) {
    case 1:
      // menu setting Jam
      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.end();      //matikan Serial komunikasi
          Serial.begin(9600);//aktifkan kembali
    break;

    case 2:
      Serial.println("! ------- menu setting Alarm --------  !");
      // 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.end();       //matikan Serial komunikasi
      Serial.begin(9600); //aktifkan kembali
    break;      

    case 3:
      // Menu Keluar (Exit)
      Serial.print("Keluar.... Terima kasih ");
      Serial.println();
      Serial.end();       //matikan Serial komunikasi
      Serial.begin(9600); //aktifkan kembali
    break;      
  }
}
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