#define PWR_PIN 3
#define BUTTON 2
#include <Wire.h>
#include <GyverOLED.h>
#include <DS1307RTC.h>
#include <TimeLib.h>
#include <TimerMs.h>
#include <EncButton.h>
#include <EEPROM.h>
GyverOLED<SSD1306_128x64, OLED_BUFFER> oled;
//GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;
TimerMs tmr(5000, 1, 1);
TimerMs tmr_2(15000);
Button bt(BUTTON, INPUT);
/*
const char *monthName[12] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
*/
tmElements_t tm;
int year_;
void setup() {
Serial.begin(9600);
pinMode(PWR_PIN, OUTPUT);
digitalWrite(PWR_PIN, HIGH);
pinMode(LED_BUILTIN, OUTPUT);
/*
if (getDate(__DATE__) && getTime(__TIME__)) {
digitalWrite(LED_BUILTIN, HIGH);
delay(100);
digitalWrite(LED_BUILTIN, LOW);
delay(100);
Serial.print(__TIME__);
Serial.print("/");
Serial.println(__DATE__);
if (RTC.write(tm)) {
Serial.print("write");
digitalWrite(LED_BUILTIN, HIGH);
delay(100);
digitalWrite(LED_BUILTIN, LOW);
delay(100);
}
}
*/
oled.init();
oled.clear();
oled.update();
}
void loop() {
bt.tick();
if (bt.click()) {
Serial.println("click");
tmr.start();
//digitalWrite(PWR_PIN, HIGH);
} else if (bt.hold()) {
Serial.println("hold");
tmr.start();
//set_time();
}
if (RTC.read(tm)) {
oled.setScale(2);
oled.setCursorXY(20, 15);
oled.print(tm.Hour);
oled.print(":");
oled.print(tm.Minute);
oled.print(":");
oled.print(tm.Second);
oled.print(" ");
//oled.setScale(2);
oled.setCursorXY(20, 40);
oled.print(tm.Day);
oled.print(".");
oled.print(tm.Month);
oled.print(".");
year_ = tmYearToCalendar(tm.Year) - 2000;
oled.print(year_);
oled.print(" ");
} else {
oled.clear();
oled.setCursorXY(20, 40);
oled.print("Ошибка.");
Serial.println("Ошибка.");
}
//oled.setCursorXY(0, 0);
if (tmr.elapsed()) digitalWrite(PWR_PIN, LOW);
oled.update();
if (Serial.available()) {
String str = Serial.readString();
str.trim();
int hour, minute, second, day, month, year;
int timeSplit1 = str.indexOf(':');
int timeSplit2 = str.indexOf(':', timeSplit1 + 1);
int dateSplit = str.indexOf('/');
int dateSplit1 = str.indexOf('.', dateSplit + 1);
int dateSplit2 = str.indexOf('.', dateSplit1 + 1);
if (timeSplit1 > 0 && timeSplit2 > 0 && dateSplit > 0 && dateSplit1 > 0 && dateSplit2 > 0) {
hour = str.substring(0, timeSplit1).toInt();
minute = str.substring(timeSplit1 + 1, timeSplit2).toInt();
second = str.substring(timeSplit2 + 1, dateSplit).toInt();
day = str.substring(dateSplit + 1, dateSplit1).toInt();
month = str.substring(dateSplit1 + 1, dateSplit2).toInt();
year = str.substring(dateSplit2 + 1).toInt();
tm.Hour = hour;
tm.Minute = minute;
tm.Second = second;
tm.Day = day;
tm.Month = month;
tm.Year = CalendarYrToTm(year);
if (RTC.write(tm)) {
Serial.print("Часы: ");
Serial.println(hour);
Serial.print("Минуты: ");
Serial.println(minute);
Serial.print("Секунды: ");
Serial.println(second);
Serial.print("День: ");
Serial.println(day);
Serial.print("Месяц: ");
Serial.println(month);
Serial.print("Год: ");
Serial.println(year);
}
} else {
Serial.println("Ошибка: неверный формат строки!");
}
}
}
/*
bool getTime(const char *str)
{
int Hour, Min, Sec;
if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
tm.Hour = Hour;
tm.Minute = Min;
tm.Second = Sec;
return true;
}
void set_time() {
tmr_2.start();
oled.clear();
int hour, minute, day, month, year = 2020;
while(true) {
bt.tick();
if (bt.hold()) break;
if (tmr_2.elapsed()) break;
oled.update();
}
tmr.start();
}
bool getDate(const char *str)
{
char Month[12];
int Day, Year;
uint8_t monthIndex;
if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
for (monthIndex = 0; monthIndex < 12; monthIndex++) {
if (strcmp(Month, monthName[monthIndex]) == 0) break;
}
if (monthIndex >= 12) return false;
tm.Day = Day;
tm.Month = monthIndex + 1;
tm.Year = CalendarYrToTm(Year);
return true;
}
*/