#include <GyverOLED.h>
#include "RTClib.h"
#include <EncButton.h>
// Установка пинов
const int8_t MinPIN = 10;
const int8_t HourPIN = 11;
const int8_t SetPIN = 12;
const int8_t LightPIN = 2;
// Позиции и масштабы текста на дисплее
const int8_t TimeCursorX = 7;
const int8_t TimeCursorY = 30;
const int8_t LightModeCursorX = 90;
const int8_t LightModeCursorY = 0;
const int8_t SetModeCursorX = 0;
const int8_t SetModeCursorY = 0;
const int8_t TimeScale = 4;
const int8_t LightModeScale = 1;
const int8_t SetModeScale = 1;
// Период моргания
const int16_t FlashDalay = 500;
//Количество пунктов меню Set
const int8_t NumOfSetModeStatus = 7;
unsigned long LastMillis = 0;
bool VisibleFlash = 0;
int8_t LightMode = 0;
bool SetMode = false;
int8_t SetModeStatus = 1;
int16_t Year;
int8_t Month;
int8_t Day;
int8_t Hour;
int8_t Minute;
int8_t Second;
RTC_DS1307 rtc;
GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;
EncButton<EB_TICK, MinPIN> MinBtn;
EncButton<EB_TICK, HourPIN> HourBtn;
EncButton<EB_TICK, SetPIN> SetBtn;
void setup() {
rtc.begin();
Serial.begin(9600);
oled.init();
pinMode(MinPIN, INPUT_PULLUP);
pinMode(HourPIN, INPUT_PULLUP);
pinMode(SetPIN, INPUT_PULLUP);
pinMode(LightPIN, OUTPUT);
HourBtn.setStepTimeout(FlashDalay*2);
Show_LightMode();
}
void loop() {
if(SetMode) SetModeMenu();
else {
SetBtn.tick();
if (SetBtn.held()) SetMode = true;
if (SetBtn.click()) {
LightMode++;
if (LightMode>2) LightMode = 0;
Show_LightMode();
};
Show_Time();
}
digitalWrite(LightPIN, LightMode);
}
void Show_SetModeStatus(char* SetModeStatusText) {
oled.setScale(SetModeScale);
oled.setCursorXY(SetModeCursorX, SetModeCursorY);
oled.print(SetModeStatusText);
}
void SetModeMenu() {
switch (SetModeStatus) {
case 1: Set_Time(); break;
case 2: Show_SetModeStatus("date"); break;
case 3: Show_SetModeStatus("year"); break;
case 4: Show_SetModeStatus("rise del"); break;
case 5: Show_SetModeStatus("down del"); break;
case 6: Show_SetModeStatus("night off"); break;
case 7: Show_SetModeStatus("night on "); break;
};
SetBtn.tick();
if (SetBtn.click()) {
SetModeStatus++;
if (SetModeStatus > NumOfSetModeStatus) {
SetModeStatus = 1;
SetMode = false;
Show_SetModeStatus(" ");
};
};
}
void Show_Time() {
if (PassFlashDelay()) {
VisibleFlash = !VisibleFlash;
GetDateTime();
oled.setScale(TimeScale);
oled.setCursorXY(TimeCursorX,TimeCursorY);
if (Hour < 10) oled.print("0");
oled.print(Hour);
if (VisibleFlash) oled.print(":");
else oled.print(" ");
if (Minute < 10) oled.print("0");
oled.print(Minute);
}
}
void Show_LightMode() {
oled.setScale(LightModeScale);
oled.setCursorXY(LightModeCursorX, LightModeCursorY);
oled.print(" ");
oled.setCursorXY(LightModeCursorX, LightModeCursorY);
switch (LightMode) {
case 0: oled.print("* off");
break;
case 1: oled.print("*auto");
break;
case 2: oled.print("* on");
break;
}
}
void Set_Time() {
Show_SetModeStatus("time");
GetDateTime();
if (PassFlashDelay()) {
VisibleFlash = !VisibleFlash;
oled.setScale(TimeScale);
oled.setCursorXY(TimeCursorX,TimeCursorY);
if (VisibleFlash) {
if (Hour < 10) oled.print("0");
oled.print(Hour);
oled.print(":");
if (Minute < 10) oled.print("0");
oled.print(Minute);
}
else oled.print(F(" : "));
};
HourBtn.tick();
if (HourBtn.click()) {
Hour++;
if (Hour > 23) Hour = 0;
rtc.adjust(DateTime(Year, Month, Day, Hour, Minute, Second));
};
if (HourBtn.step()) {
Hour++;
if (Hour > 23) Hour = 0;
rtc.adjust(DateTime(Year, Month, Day, Hour, Minute, Second));
};
}
void GetDateTime() {
DateTime now = rtc.now();
Year = now.year();
Month = now.month();
Day = now.day();
Hour = now.hour();
Minute = now.minute();
Second = now.second();
}
bool PassFlashDelay() {
bool r;
if ((millis() - LastMillis) > FlashDalay) {
r = true;
LastMillis = millis();
}
else r = false;
return r;
};