#include <TimeLib.h>
#include <DS1307RTC.h>
#define off 1
#define on 0
#define don 1
#define doff 0
int a = 12, b = 13, c = 7, d = 8, e = 9, f = 11, g = 10, dp = 6; //pins to activate segment
int dis1 = 5, dis2 = 4, dis3 = 3, dis4 = 2; //enable pins for display(anode type display used
int button_1 = A0; //for updating hour
int button_2 = A1; //for updating second
int button_3 = A2; //for updating minute
int Hour_T = 0, Hour_O = 0, minute_T = 0, minute_O = 0;
int A_hour = 0, A_minute = 0, A_second = 0, psec = 0;
unsigned long current_time, previous_time;
int interval = 1000;
//refresh rate of display and button
int button_R = 150;
int display_R = 2; //adjust display refresh according to your need
unsigned long c_time = 0, p_time = 0, cc_time = 0, p_button_time = 0;
void setup() {
Serial.begin(115200);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(dp, OUTPUT);
pinMode(dis1, OUTPUT);
pinMode(dis2, OUTPUT);
pinMode(dis3, OUTPUT);
pinMode(dis4, OUTPUT);
pinMode(button_1, INPUT_PULLUP);
pinMode(button_2, INPUT_PULLUP);
pinMode(button_3, INPUT_PULLUP);
}
void loop() {
run_clock();
}
void time_count()
{ current_time = millis();
if (current_time - previous_time >= interval)
{ previous_time = current_time;
++A_second;
}
if (A_second == 60)
{ A_second = 0;
++A_minute;
}
if (A_minute == 60)
{ A_minute = 0;
++A_hour;
}
if (A_hour == 24)
{ A_hour = 0;
}
if (psec != A_second)
{ psec = A_second;
if (digitalRead(dp) == 0)
{
digitalWrite(dp, 1);
}
else
{
digitalWrite(dp, 0);
}
}
}
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
void run_clock()
{
// time_count();
button_p();
tmElements_t tm;
if (RTC.read(tm))
{
A_hour = tm.Hour;
A_minute = tm.Minute;
A_second=tm.Second;
} else {
A_hour = 12;
A_minute = 00;
A_second = 00;
}
convert_time(A_hour, A_minute);
displayd();
}
/////////////////////////////////////////////////////
void button_p()
{
cc_time = millis();
tmElements_t tm;
(RTC.read(tm));
if (cc_time - p_button_time >= button_R)
{ p_button_time = cc_time;
if (digitalRead(button_1) == 0) {
tm.Hour++;
RTC.write(tm);
}
if (digitalRead(button_2) == 0) {
// A_second = 0;
tm.Second = 0;
RTC.write(tm);
}
if (digitalRead(button_3) == 0) {
// A_minute++;
tm.Minute++;
RTC.write(tm);
}
}
}
/////////////////////////////////////////////////////
void convert_time(int h, int m)
{
Hour_T = h / 10;
Hour_O = h % 10;
minute_T = m / 10;
minute_O = m % 10;
}
/////////////////////////////////////////////////////
void displayd()
{
c_time = millis();
if (c_time - p_time >= display_R * 1 && c_time - p_time < display_R * 2)
{
display_hourT();
}
else if (c_time - p_time >= display_R * 2 && c_time - p_time < display_R * 3)
{
display_hourO();
}
else if (c_time - p_time >= display_R * 3 && c_time - p_time < display_R * 4)
{
display_minuteT();
}
else if (c_time - p_time >= display_R * 4 && c_time - p_time < display_R * 5)
{
display_minuteO();
}
else if (c_time - p_time >= display_R * 5)
{ c_time = millis();
p_time = c_time;
all_off();
}
}
///////////////////////////////////////////////////////////////
void display_hourT()
{ all_off();
digitalWrite(dis1, don);
digitalWrite(dis2, doff);
digitalWrite(dis3, doff);
digitalWrite(dis4, doff);
switch (Hour_T)
{
case 0:
N0();
break;
case 1:
N1();
break;
case 2:
N2();
break;
case 3:
N3();
break;
case 4:
N4();
break;
case 5:
N5();
break;
case 6:
N6();
break;
case 7:
N7();
break;
case 8:
N8();
break;
case 9:
N9();
break;
default:;
}
}
//////////////////////////////////////////////////////////////////
void display_hourO()
{ all_off();
digitalWrite(dis1, doff);
digitalWrite(dis2, don);
digitalWrite(dis3, doff);
digitalWrite(dis4, doff);
switch (Hour_O)
{
case 0:
N0();
break;
case 1:
N1();
break;
case 2:
N2();
break;
case 3:
N3();
break;
case 4:
N4();
break;
case 5:
N5();
break;
case 6:
N6();
break;
case 7:
N7();
break;
case 8:
N8();
break;
case 9:
N9();
break;
default:;
}
}
//////////////////////////////////////////////////////////////////
void display_minuteT()
{ all_off();
digitalWrite(dis1, doff);
digitalWrite(dis2, doff);
digitalWrite(dis3, don);
digitalWrite(dis4, doff);
switch (minute_T)
{
case 0:
N0();
break;
case 1:
N1();
break;
case 2:
N2();
break;
case 3:
N3();
break;
case 4:
N4();
break;
case 5:
N5();
break;
case 6:
N6();
break;
case 7:
N7();
break;
case 8:
N8();
break;
case 9:
N9();
break;
default:;
}
}
//////////////////////////////////////////////////////////////////
void display_minuteO()
{ all_off();
digitalWrite(dis1, doff);
digitalWrite(dis2, doff);
digitalWrite(dis3, doff);
digitalWrite(dis4, don);
switch (minute_O)
{
case 0:
N0();
break;
case 1:
N1();
break;
case 2:
N2();
break;
case 3:
N3();
break;
case 4:
N4();
break;
case 5:
N5();
break;
case 6:
N6();
break;
case 7:
N7();
break;
case 8:
N8();
break;
case 9:
N9();
break;
default:;
}
}
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
void all_off()
{
digitalWrite(a, off);
digitalWrite(b, off);
digitalWrite(c, off);
digitalWrite(d, off);
digitalWrite(e, off);
digitalWrite(f, off);
digitalWrite(g, off);
digitalWrite(dis1, doff);
digitalWrite(dis2, doff);
digitalWrite(dis3, doff);
digitalWrite(dis4, doff);
}
//////////////////////////////////////////////////////////////////
void all_segment_on()
{
digitalWrite(a, on);
digitalWrite(b, on);
digitalWrite(c, on);
digitalWrite(d, on);
digitalWrite(e, on);
digitalWrite(f, on);
digitalWrite(g, on);
}
///////////////////////////////////////////////////
void N0()
{
digitalWrite(a, on);
digitalWrite(b, on);
digitalWrite(c, on);
digitalWrite(d, on);
digitalWrite(e, on);
digitalWrite(f, on);
digitalWrite(g, off);
}
///////////////////////////////////////////////////
void N1()
{
digitalWrite(a, off);
digitalWrite(b, on);
digitalWrite(c, on);
digitalWrite(d, off);
digitalWrite(e, off);
digitalWrite(f, off);
digitalWrite(g, off);
}
///////////////////////////////////////////////////
void N2()
{
digitalWrite(a, on);
digitalWrite(b, on);
digitalWrite(c, off);
digitalWrite(d, on);
digitalWrite(e, on);
digitalWrite(f, off);
digitalWrite(g, on);
}
///////////////////////////////////////////////////
void N3()
{
digitalWrite(a, on);
digitalWrite(b, on);
digitalWrite(c, on);
digitalWrite(d, on);
digitalWrite(e, off);
digitalWrite(f, off);
digitalWrite(g, on);
}
///////////////////////////////////////////////////
void N4()
{
digitalWrite(a, off);
digitalWrite(b, on);
digitalWrite(c, on);
digitalWrite(d, off);
digitalWrite(e, off);
digitalWrite(f, on);
digitalWrite(g, on);
}
///////////////////////////////////////////////////
void N5()
{
digitalWrite(a, on);
digitalWrite(b, off);
digitalWrite(c, on);
digitalWrite(d, on);
digitalWrite(e, off);
digitalWrite(f, on);
digitalWrite(g, on);
}
///////////////////////////////////////////////////
void N6()
{
digitalWrite(a, on);
digitalWrite(b, off);
digitalWrite(c, on);
digitalWrite(d, on);
digitalWrite(e, on);
digitalWrite(f, on);
digitalWrite(g, on);
}
///////////////////////////////////////////////////
void N7()
{
digitalWrite(a, on);
digitalWrite(b, on);
digitalWrite(c, on);
digitalWrite(d, off);
digitalWrite(e, off);
digitalWrite(f, off);
digitalWrite(g, off);
}
///////////////////////////////////////////////////
void N8()
{
digitalWrite(a, on);
digitalWrite(b, on);
digitalWrite(c, on);
digitalWrite(d, on);
digitalWrite(e, on);
digitalWrite(f, on);
digitalWrite(g, on);
}
///////////////////////////////////////////////////
void N9()
{
digitalWrite(a, on);
digitalWrite(b, on);
digitalWrite(c, on);
digitalWrite(d, on);
digitalWrite(e, off);
digitalWrite(f, on);
digitalWrite(g, on);
}