#include <Wire.h>
#include "LiquidCrystal_I2C.h"
#include <RTClib.h>
#include <Button.h>

RTC_DS1307 rtc;

LiquidCrystal_I2C lcd(0x27, 16, 2);

Button buttonJam(11);
Button buttonMenit(10);
int OnOffAlarm = 12;

// Button Toggle Variable
unsigned long debounceDelay = 50;
unsigned long lastTimeButtonStateChanged = 0;
byte lastButtonState = LOW;
bool isOn = false;
// End of Button Toggle Variable


//=================
int jam = 0;
int menit = 0;

int buzzer = 7;
// ==================


void print2digits(int number) {
  if (number >= 0 && number <10) {
  lcd.print('0');
  }
  lcd.print(number);
}

//====================
void jam23() {
  if(jam > 23){
    jam = 0;
  }
}

void menit59(){
  if(menit > 59){
    menit = 0;
  }
}
//===================


//===================
void tekanJam(){
  if(buttonJam.read() == Button::PRESSED){
      jam++;
      jam23();
  }
}

void tekanMenit(){
  if(buttonMenit.read() == Button::PRESSED){
      menit++;
      menit59();
  }
}
//=====================


//======================
void lcdJam() {
  if(jam > 9){
    lcd.setCursor(8,1);
    lcd.print(jam);
  } else if (jam <= 9){
    lcd.setCursor(8,1);
    lcd.print(0);
    lcd.print(jam);
  }
}

void lcdMenit(){
  if(menit > 9){
    lcd.setCursor(11,1);
    lcd.print(menit);
  } else if (menit <= 9){
    lcd.setCursor(11,1);
    lcd.print(0);
    lcd.print(menit);
  }
}
//=======================

void setup() {
  Serial.begin(9600);
  Wire.begin();
  buttonJam.begin();
  buttonMenit.begin();

  pinMode(OnOffAlarm, INPUT_PULLUP);
  pinMode(buzzer, OUTPUT);

  if (! rtc.begin()) 
  {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }

  lcd.init();
  lcd.backlight();
  lcd.print("yes");
}

void loop() {
  DateTime now = rtc.now();

  tekanJam();
  lcdJam();
  lcd.print(":");
  tekanMenit();
  lcdMenit();
  
  lcd.setCursor(0,0);
  print2digits(now.hour());
  lcd.print(":");
  print2digits(now.minute());
  lcd.print(":");
  print2digits(now.second());

  lcd.setCursor(0,1);
  lcd.print("Alarm : ");

  // On Off Alarm
 unsigned long timeNow = millis();
  if (timeNow - lastTimeButtonStateChanged > debounceDelay) {
    byte buttonState = digitalRead(OnOffAlarm);
    if (buttonState != lastButtonState) {
      lastTimeButtonStateChanged = timeNow;
      lastButtonState = buttonState;
      if (buttonState == LOW) { // button di tekan
        isOn = ! isOn;
    }
  }
}

  if(isOn) {
    lcd.setCursor(13,0);
    lcd.print(" ");
    lcd.setCursor(11,0);
    lcd.print("ON");
    

    if ( now.hour() == jam && now.minute() == menit) {
      tone(buzzer, 2100);
    } else if (now.hour() != jam || now.minute() != menit) {
      noTone(buzzer);
    }

  } else {
    lcd.setCursor(11,0);
    lcd.print("OFF");
    noTone(buzzer);
    
  }

  delay(500);
}
$abcdeabcde151015202530354045505560fghijfghij
GND5VSDASCLSQWRTCDS1307+