//#include <OLED_I2C.h>
#include <OneWire.h>
#include <DS3231.h>                                     //Підключення бібліотеки DS3231
OLED  myOLED(SDA, SCL, 8);                              //Підключення OLED дисплею                             
DS3231  rtc(SDA, SCL);                                  //Підключення Real Time Clock (RTC)
// Підключення шрифтів                         
extern uint8_t MegaNumbers[]; 
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];
extern uint8_t TinyFont[];
extern uint8_t SmallFont[];
extern uint8_t UkrFont[];
//режим введення
uint8_t VAR_mode_SET = 0;  
Time t;
String ukr[] = {"","GJYTLSKJR","DSDNJHJR","CTHTLF","XTNDTH","G'ZNYBWZ","CE<JNF","YTLSKKZ"};
String eng[] = {"","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","SUNDAY"}; 
const int buttonPin1 = 2;//
const int buttonPin2 = 3;//
const int buttonPin3 = 4;//
int i=0;
int s=0;
int m=0;
int h=0;
int z=1;
int dd,mm,yy;
void setup() 
{
  pinMode(buttonPin1, INPUT);                          //ініціалізація кнопки SET
  pinMode(buttonPin2, INPUT);                          //ініціалізація кнопки UP
  pinMode(buttonPin3, INPUT);                          //ініціалізація кнопки DOWN
  myOLED.begin();                                      // Ініціалізація Oled дисплею.
  rtc.begin();                                         // Ініціалізація RS3231 
}
void loop(){
  myOLED.clrScr();                                     // Очищуємо екран
  i=0;                                                 //очищуємо лічильник
  t = rtc.getTime();                                   //отримуємо значення з RTC
  h=t.hour;                                            //відділяємо години
  m=t.min;                                             //відділяємо хвилини
  s=t.sec;                                             //відділяємо секунди
  dd=t.date;                                           //відділяємо день
  mm=t.mon;                                            //відділяємо місяць
  yy=t.year;                                           //відділяємо рік
  z=t.dow;                                             //відділяємо день тижня (текст)
  if(!VAR_mode_SET){                                   //якщо не вибраний режим введення, відображається вся інформація на екран
    myOLED.setFont(UkrFont);  
    myOLED.print(ukr[z], CENTER, 0);
    // Отображение часов
    myOLED.setFont(BigNumbers);                        // Використовуємо великий шрифт
    myOLED.print(zeropad(h), 5, 15);      
    myOLED.setFont(SmallFont);
    myOLED.print(":", 38, 23);                         //відображення двокрапки
    myOLED.setFont(BigNumbers);                        //Використовуємо великий шрифт
    myOLED.print(zeropad(m), 50, 15);
    myOLED.setFont(SmallFont);
    myOLED.print(":", 83, 23);                         //відображення двокрапки
    myOLED.setFont(BigNumbers);                        //Використовуємо великий шрифт
    myOLED.print(zeropad(s), 95, 15);    
    myOLED.setFont(SmallFont);
    myOLED.print(zeropad(dd), 30, 57);
    myOLED.print(".", 45, 57); 
    myOLED.print(zeropad(mm), 50, 57);
    myOLED.print(".", 63, 57);
    myOLED.print(zeropad(yy), 70, 57);    
    myOLED.update();
  }

 switch (VAR_mode_SET){                                    
      /* д.н. */ case 1: myOLED.setFont(UkrFont); myOLED.print(ukr[z], CENTER, 0);myOLED.update(); break;
      /* сек */ case 2: myOLED.setFont(BigNumbers); myOLED.print(zeropad(s), 95, 15);myOLED.update(); break;
      /* мин */ case 3: myOLED.setFont(BigNumbers); myOLED.print(zeropad(m), 50, 15);myOLED.update(); break;
      /* год */ case 4: myOLED.setFont(BigNumbers);myOLED.print(zeropad(h), 5, 15);myOLED.update(); break;
      /* дні */ case 5: myOLED.setFont(SmallFont);myOLED.print(zeropad(dd), 30, 57);myOLED.update(); break;
      /* міс */ case 6: myOLED.setFont(SmallFont);myOLED.print(zeropad(mm), 50, 57);myOLED.update(); break;
      /* рік */ case 7: myOLED.setFont(SmallFont);myOLED.print(zeropad(yy), 70, 57);myOLED.update(); break;
      }
 
 if(VAR_mode_SET){
//  Якщо натиснута кнопка UP
    if(digitalRead(buttonPin2)){
      while(digitalRead(buttonPin2)){delay(50);}              // ждём пока мы не отпустим кнопку UP
      switch (VAR_mode_SET){                                     // инкремент (увеличение) устанавливаемого значения
        case 1: rtc.setDOW(z==8?1:z+1);myOLED.setFont(UkrFont);myOLED.print(ukr[z], CENTER, 0); myOLED.update(); break;
        case 2: rtc.setTime(h, m,(s==59?0:s+1));myOLED.setFont(BigNumbers);myOLED.print(zeropad(s), 95, 15);myOLED.update(); break;
        case 3: rtc.setTime(h, (m==59?0:m+1), s);myOLED.setFont(BigNumbers);myOLED.print(zeropad(m), 50, 15);myOLED.update(); break;
        case 4: rtc.setTime((h==23?0:h+1), m, s);myOLED.setFont(BigNumbers);myOLED.print(zeropad(h), 5, 15);myOLED.update(); break;
        case 5: rtc.setDate((dd==31?0:dd+1), mm,yy); myOLED.setFont(SmallFont);myOLED.print(zeropad(dd), 30, 57);myOLED.update(); break;
        case 6: rtc.setDate(dd, (mm==12?0:mm+1),yy); myOLED.setFont(SmallFont);myOLED.print(zeropad(mm), 50, 57);myOLED.update(); break;
        case 7: rtc.setDate(dd, mm,(yy==2100?1900:yy+1)); myOLED.setFont(SmallFont);myOLED.print(zeropad(yy), 70, 57);myOLED.update();break;
      }
    }
 }
//  Якщо натиснута кнопка DOWN
    if(digitalRead(buttonPin3)){
      while(digitalRead(buttonPin3)){delay(50);}            // ждём пока мы её не отпустим
      
      switch (VAR_mode_SET){ // декремент (уменьшение) устанавливаемого значения
        case 1: rtc.setDOW(z==8?1:z-1);myOLED.setFont(UkrFont);myOLED.print(ukr[z], CENTER, 0); myOLED.update(); break;
        case 2: rtc.setTime(h, m,(s==59?0:s-1));myOLED.setFont(BigNumbers);myOLED.print(zeropad(s), 95, 15);myOLED.update(); break;
        case 3: rtc.setTime(h, (m==59?0:m-1), s);myOLED.setFont(BigNumbers);myOLED.print(zeropad(m), 50, 15);myOLED.update(); break;
        case 4: rtc.setTime((h==23?0:h-1), m, s);myOLED.setFont(BigNumbers);myOLED.print(zeropad(h), 5, 15);myOLED.update(); break;
        case 5: rtc.setDate((dd==0?31:dd-1), mm,yy); myOLED.setFont(SmallFont);myOLED.print(zeropad(dd), 30, 57);myOLED.update(); break;
        case 6: rtc.setDate(dd, (mm==0?12:mm-1),yy); myOLED.setFont(SmallFont);myOLED.print(zeropad(mm), 50, 57);myOLED.update(); break;
        case 7: rtc.setDate(dd, mm,(yy==2100?1900:yy-1)); myOLED.setFont(SmallFont);myOLED.print(zeropad(yy), 70, 57);myOLED.update();break;
      }
    }
 if(digitalRead(buttonPin1)){
  while(digitalRead(buttonPin1)){
        delay(10);
        if(i<200){i++;}else{
          myOLED.clrScr();
          myOLED.update();
          }
      }
      
  if(i<200){                                                 // Якщо кнопка SET утримувалась менше 2 секунд
        VAR_mode_SET++;                                          // переходимо до наступного параметру
      if(VAR_mode_SET>7){VAR_mode_SET=1;}  // повертаємось до першого параметру
      }else{                                                     // если кнопка SET удерживалась дольше 2 секунд, то требуется выйти из режима установки даты/времени
        VAR_mode_SET=0;                                          // выходим из режима установки даты/времени
      }
      
}
}
String zeropad(int num){
  String str;
  if ((num>=0)&&(num<10)) {
    str="0"+String(num,DEC);
    return str;
  }
  else return String(num,DEC); 
}
GND5VSDASCLSQWRTCDS1307+