//#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);
}