#include <RTClib.h>
#include <LiquidCrystal.h>
RTC_DS1307 rtc;
// rs e d4 d5 d6 d7
LiquidCrystal lcd(12, 10, 6, 5, 4, 3);
#define KEY_MINUS 2
#define KEY_SET 7
#define KEY_PLUS 8
int param = 0; // номер параметра який міняємо або 0
unsigned long timeKEY=1;
#define intervalKEY 100 // інтервал опитування кнопок
int blink=0;
unsigned long timeBlink;
#define intervalBlink 100
DateTime now;
void setup() {
/*
Serial.begin(9600);
if ( rtc.begin() ) {
Serial.println("Timer is present!");
}
else Serial.println("Timer not found!");
*/
rtc.begin();
lcd.begin(16, 2);
//lcd.print("Hi!");
//delay(1000);
lcd.clear();
pinMode(KEY_PLUS, INPUT_PULLUP);
pinMode(KEY_MINUS, INPUT_PULLUP);
pinMode(KEY_SET, INPUT_PULLUP);
//DateTime tm = DateTime( 2021, 03, 22, 17, 40, 0 );
//rtc.adjust( tm );
//rtc.adjust( DateTime( 2021, 04, 29, 17, 40, 15 ) );
}
void print0( int data, int num ) {
if ( param == num ) { // моргаючий параметр
if (blink == 1) {
lcd.print(" ");
if (param == 6) lcd.print(" ");
}
else {
if (data < 10) {
lcd.print( "0" );
}
lcd.print( data );
}
}
else {
if (data < 10) {
lcd.print( "0" );
}
lcd.print( data );
}
}
void plus(){
int h = now.hour();
int m = now.minute();
int s = now.second();
int d = now.day();
int month = now.month();
int y = now.year();
switch (param) {
case 1: // години
h = h+1;
if (h > 23) h = 0;
break;
case 2:
m = m+1;
if (m > 59) m = 0;
break;
case 3:
s = s + 1;
if (s > 59) s = 0;
break;
case 4:
d = d + 1;
break;
case 5:
month = month + 1;
if (month > 12) month = 0;
break;
case 6:
y = y + 1;
break;
}
if (param > 0) rtc.adjust( DateTime( y, month, d, h, m, s ) );
}
void minus(){
int h = now.hour();
int m = now.minute();
int s = now.second();
int d = now.day();
int month = now.month();
int y = now.year();
switch (param) {
case 1: // години
h = h-1;
if (h < 0) h = 23;
break;
case 2:
m = m-1;
if (m < 0) m = 59;
break;
case 3:
s = s - 1;
if (s < 0) s = 59;
break;
case 4:
d = d - 1;
if (d < 1) d = 1;
break;
case 5:
month = month - 1;
if (month < 1) month = 1;
break;
case 6:
y = y - 1;
break;
}
if (param > 0) rtc.adjust( DateTime( y, month, d, h, m, s ) );
}
void loop() {
now = rtc.now();
/*
Serial.print("Current time: ");
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
*/
//lcd.clear();
lcd.setCursor(4, 0);
print0( now.hour(), 1 );
if ( now.second() % 2 == 1 ) {
lcd.print( ":" );
}
else {
lcd.print( " " );
}
print0( now.minute(), 2 );
if ( now.second() % 2 == 1 ) {
lcd.print( ":" );
}
else {
lcd.print( " " );
}
print0( now.second(), 3 );
lcd.setCursor(3, 1);
print0( now.day(), 4 );
lcd.print( "/" );
print0( now.month(), 5 );
lcd.print( "/" );
print0( now.year(), 6 );
if ( timeKEY > 0 && millis() > timeKEY) {
timeKEY = millis() + intervalKEY;
if ( digitalRead(KEY_SET) == 0 ) {
param++;
if (param > 6) {
param = 0;
}
}
if ( digitalRead(KEY_MINUS) == 0 ) {
minus();
}
if ( digitalRead(KEY_PLUS) == 0 ) {
plus();
}
}
if ( millis() > timeBlink ) {
timeBlink = millis() + intervalBlink;
if (blink == 0) blink = 1;
else blink = 0;
}
}