#include <RTClock.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // http://rcl-radio.ru/wp-content/uploads/2019/12/liquidcrystali2c-9.zip
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
RTClock rtclock (RTCSEL_LSE, 32700); // внешний кварц 32768 Гц (коррекция погрешности кварца)
time_t tt, tt1;
tm_t mtt;
const char * delim = " :";
char s[128];
const char * weekdays[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
const char * months[] = {"Dummy", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
byte sec_time;
void setup(){
Serial.begin(9600);
lcd.init();
lcd.backlight();// Включаем подсветку дисплея
ParseBuildTimestamp(mtt); // Unix время, отсчет от 00:00:00 1 января 1970
tt = rtclock.makeTime(mtt) + 25; // +25 сек ко времени, для коррекции времени загрузки скетча
rtclock.setTime(tt);
tt1 = tt;
}
void loop(){
tt1 = tt;
rtclock.breakTime(rtclock.now(), mtt);
if(mtt.second!=sec_time){
sprintf(s, "RTC timestamp: %s %u %u, %s, %02u:%02u:%02u\n",months[mtt.month], mtt.day, mtt.year+1970, weekdays[mtt.weekday], mtt.hour, mtt.minute, mtt.second);
Serial.println(s);
sec_time = mtt.second;
lcd.setCursor(4, 0);
lcd.print(mtt.hour/10);lcd.print(mtt.hour%10);lcd.print(":");lcd.print(mtt.minute/10);lcd.print(mtt.minute%10);lcd.print(":");lcd.print(mtt.second/10);lcd.print(mtt.second%10);
lcd.setCursor(0, 1);
if(mtt.day<10){lcd.print(" ");}lcd.print(mtt.day);lcd.print(" ");lcd.print(months[mtt.month]);lcd.print(" ");lcd.print(mtt.year+1970);lcd.print(" ");lcd.print(weekdays[mtt.weekday]);
}
}
uint8_t str2month(const char * d){uint8_t i = 13;while ( (--i) && strcmp(months[i], d)!=0 );return i;}
void ParseBuildTimestamp(tm_t & mt){
sprintf(s, "Timestamp: %s, %s\n", __DATE__, __TIME__);// Формат времени: "Dec 8 2017, 22:57:54"
Serial.print(s);
char * token = strtok(s, delim); // get first token
// walk through tokens
while( token != NULL ) {
uint8_t m = str2month((const char*)token);
if ( m>0 ) {
mt.month = m;
token = strtok(NULL, delim); // get next token
mt.day = atoi(token);
token = strtok(NULL, delim); // get next token
mt.year = atoi(token) - 1970;
token = strtok(NULL, delim); // get next token
mt.hour = atoi(token);
token = strtok(NULL, delim); // get next token
mt.minute = atoi(token);
token = strtok(NULL, delim); // get next token
mt.second = atoi(token);
}
token = strtok(NULL, delim);
}
}