#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

// Глобальные переменные для хранения времени.
int hours = 0;    // Часы
int minutes = 0;  // Минуты
int a =0; //Время работы сигнала
int b =0; //Переход в режим настройки.
// Время срабатывания будильника.
int alarm_hours = 0;
int alarm_minutes = 0;

// Номера портов, куда подключены кнопки, в виде
// констант.
const int BUTTON_1 = 23;
const int BUTTON_2 = 25;
const int BUTTON_3 = 27; // Кнопка смены режима
const int BUTTON_4 = 29;

// Возможные состояния системы.
const int SETTING_STATE = 0;  // Часы
const int CLOCK_STATE = 1;
const int CONFIG_STATE = 2; // Настройка будильника

// Состояние системы.
int state = SETTING_STATE;

void setup() {
  pinMode(2, OUTPUT);

  // Настройка дисплея
  lcd.init();
  lcd.backlight();

  // Настройка кнопочек.
  pinMode(BUTTON_1, INPUT_PULLUP);
  pinMode(BUTTON_2, INPUT_PULLUP);
  pinMode(BUTTON_3, INPUT_PULLUP);
  pinMode(BUTTON_4, INPUT_PULLUP);

  pinMode(3, OUTPUT);
}
void loop() {
  lcd.clear(); // Очистка экрана.
  if (state == SETTING_STATE) {
    // Вывод текущего времени на экран:
    lcd.setCursor(0, 0);
    lcd.print(hours);
    lcd.setCursor(2, 0);
    lcd.print(":");
    lcd.print(minutes);
    lcd.setCursor(0, 1);
    lcd.print("CLOCK");

    if ( digitalRead(BUTTON_3) == LOW ) {
      state = CONFIG_STATE;
    }
    if ( digitalRead(BUTTON_4) == LOW ) {
      b+=1;
      state = CLOCK_STATE;
      
}
    if ( digitalRead(BUTTON_1) == LOW ) {
      hours = hours + 1;
      if (hours == 24) {
        hours = 0;
      }
    }

    if ( digitalRead(BUTTON_2) == LOW ) {
      minutes = minutes + 1;
      if (minutes == 60) {
        minutes = 0;
      }
    }

  } else if (state == CONFIG_STATE) {
    // Вывод текущего времени на экран:
    lcd.setCursor(0, 0);
    lcd.print(alarm_hours);
    lcd.setCursor(2, 0);
    lcd.print(":");
    lcd.print(alarm_minutes);
    lcd.setCursor(0, 1);
    lcd.print("ALARM");

    if ( digitalRead(BUTTON_3) == LOW ) {
      state = SETTING_STATE;
    }

    if ( digitalRead(BUTTON_1) == LOW ) {
      alarm_hours = alarm_hours + 1;
      if (alarm_hours == 24) {
        alarm_hours = 0;
      }
    }

    if ( digitalRead(BUTTON_2) == LOW ) {
      alarm_minutes = alarm_minutes + 1;
      if (alarm_minutes == 60) {
        alarm_minutes = 0;
      }
    }
  } else if(state==CLOCK_STATE){
      
        while(b==1){
          if ( digitalRead(BUTTON_4) == LOW ) {
        b--;
      state = SETTING_STATE;
    }
        lcd.setCursor(0, 0);
    lcd.print(hours);
    lcd.setCursor(2, 0);
    lcd.print(":");
    lcd.print(minutes);
    lcd.setCursor(0, 1);
    lcd.print("CLOCK");
         minutes = minutes + 1;
         delay(1000);
         if (hours == 24) {
          hours=0;
          lcd.clear();
      }
         if (minutes == 60) {
          hours=hours+1;

          lcd.clear();
        minutes = 0; 
      }
      if ( (hours == alarm_hours) && (minutes == alarm_minutes) ) {  
        while(a!=60){
          digitalWrite(2, HIGH);
    tone(3,730);
    delay(500);
    noTone(3);
    digitalWrite(2, LOW);
    delay(200);
    a++;
    if ( digitalRead(BUTTON_3) == LOW ) {
          a=60;
        noTone(3);
        state = CLOCK_STATE;
    }
        }
        noTone(3);
        state = CLOCK_STATE;
        
    }
    // if ( digitalRead(BUTTON_4) == LOW ) {
    //     b--;
    //   state = SETTING_STATE;
    // }
    }
  }
  delay(100);
}