Iam a first time user of Arduino, and I actually made this project to learn programming of micro controllers. Though several digital clocks projects are seen online most of them are not having all features like seconds display, hour chime, alarm etc. Also in most of the clock projects the Alarm set time goes off when disconnected from the supply. I have incorporated all these features in my project, and I think its worth to share it with the community. Apart from Arduino Nano and DS 3231 RTC, all the other components were taken from scrap circuit boards. The success of this project, make me explore more complex projects using micro controllers.
int aset;
int dtt2;
int newdtt1;
int digit1 = 11;
int digit2 = 10;
int digit3 = 9;
int digit4 = 6;
int digit5 = A3;
int digit6 = A2;
int Dot = 1;
int Hrchime = 0;
int segA = 2;
int segB = 3;
int segC = 4;
int segD = 5;
int segE = 12;
int segF = 7;
int segG = 8;
int SW0 =A0;
int SW1 =A1;
int almout =13;
int aset1 = 3; // set value as 3 for first time retrival of alarm set
int alringt =1; // required alarm ring time in minute
int hrchringt = 6;// required time for hour chime in seconds
static unsigned int altim;
//#include <Wire.h>
#include "RTClib.h"
#include <EEPROM.h>
#define EEADDR 166 // Start location to write EEPROM data.
RTC_DS3231 RTC;
// =====================setup()=================================
void setup() {
//Serial.begin(9600);
RTC.begin();
DateTime now = RTC.now();
//RTC.adjust(DateTime(__DATE__, __TIME__));// for setting clock remove // from this line and upload sketch
//after setting clock again put // on the line and upload once more
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(Dot, OUTPUT);
pinMode(Hrchime, OUTPUT);
pinMode(digit1, OUTPUT);
pinMode(digit2, OUTPUT);
pinMode(digit3, OUTPUT);
pinMode(digit4, OUTPUT);
pinMode(digit5, OUTPUT);
pinMode(digit6, OUTPUT);
pinMode(almout, OUTPUT);
pinMode(SW0, INPUT); // Alarm setting SPST switch
pinMode(SW1, INPUT); //Alarm setting PUSH switch
digitalWrite(SW0, LOW);
digitalWrite(SW1, LOW);
digitalWrite(almout, LOW);
digitalWrite(Hrchime, LOW);
// retrieving alarm set time from flash on first time power_on
int EEAddr = EEADDR;
if (aset1 == 3 ) {
EEPROM.get(EEAddr , altim); EEAddr += sizeof(altim);
newdtt1 = altim;
dtt2 = altim;
aset1 = 6;
aset = 7;
//Serial.print ("Flash first Read ");
//Serial.print (dtt2);
}
else{}
// end of alrm set time retrieving from flash memory
}//==================end of setup ()====================================
//******************** STARTING MAIN PROGRAM*****************************
void loop() {
//digitalWrite(segDP, HIGH);
int mt;
int dt;
int dtt;
int almsethr;
int almsetmn;
int chm;
while ( digitalRead(SW0) == HIGH && digitalRead(SW1) == LOW ){
dt = almsethr;
mt = almsetmn;
for (int i = 20 ; i > 0 ; i--) {
Light_HR_MIN(dtt2);
Light_HR_MIN(dtt2);
}
} //end of while loop
while ( digitalRead(SW0) == HIGH && digitalRead(SW1) == HIGH){
digitalWrite(Dot, HIGH);
digitalWrite(digit5, HIGH);
digitalWrite(digit6, HIGH);
dtt2++;
int a;
int b;
a = dtt2 / 100;
b = dtt2 % 100;
if (b >= 60)
{ b = 0;
a++;
}
else {}
if (a >= 24) a = 0;
else {}
dtt2 = a * 100 + b;
for (int i = 20 ; i > 0 ; i--) {
Light_HR_MIN(dtt2);
Light_HR_MIN(dtt2);
}
almsethr = dt;
almsetmn = mt;
aset =1;
} //end of while loop
while ( digitalRead(SW0) == LOW ){
DateTime now = RTC.now();
int rr= (now.hour());
int gt=(now.minute());
int timp5 = rr*100 + gt;
//----------- Writing Alarm set_time to Flash memory------
if (aset == 1){
ALARMSTORE(dtt2 ,1 , newdtt1);
aset = 6;
}
else{}
//---------------------------------Alarm ringing------
if (timp5 == dtt2 ) {
digitalWrite(almout, HIGH);
}
else{}
if (timp5 == dtt2+alringt) {
digitalWrite(almout, LOW);
}
else{}
//-----------------------------Hour chime setting----------=----
if ( timp5 % 100 == 00 && now.second() <= hrchringt )
{ digitalWrite(Hrchime, HIGH);
}
else{
digitalWrite(Hrchime , LOW); }
//------------STARTS LINES FOR DISPLAYING CURRENT TIME-----------
if ( digitalRead(SW0) == LOW ) {
DateTime now = RTC.now();
int tim = (now.hour());
if (tim > 12) {
tim = tim - 12;
}
else;
if (tim == 0) {
tim = 12; }
else;
int timp = (tim * 100 + now.minute());
int timp1 = now.second();
// For Digits display
for (int i = 8 ; i > 0 ; i--) {
Light_HR_MIN(timp);
displaysecond(timp1); }
}
else {}
} //end of WHILE loop
} // ==================END OF MAIN PROGRAM======================
// ***************SUB PROGRAMS************************************
//======================for display of Hour and Minute============
void Light_HR_MIN(int toDisplay) {
#define BRIGHTNESS 1000
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
int hrr =toDisplay/100;
if (digitalRead(SW1) == HIGH)
{ digitalWrite(digit5, LOW);
digitalWrite(digit6, LOW);
}
else{}
for (int digit = 4 ; digit > 0 ; digit--) {
switch (digit) {
case 1:
if (hrr < 10 && hrr != 0 )
{digitalWrite(digit1, DIGIT_OFF);
}
else{
digitalWrite(digit1, DIGIT_ON);
}
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
break;
}
ShowNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(BRIGHTNESS);
ShowNumber(10);
//Turn off all digits
digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
}
}
//====================for display of Second and dots============
void displaysecond(int sec) {
#define BRIGHTNESS 1000
#define BRIGHTNESS1 400
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
int yy = sec / 10;
int aa = sec % 10;
digitalWrite(digit5, DIGIT_ON);
digitalWrite(digit6, DIGIT_OFF);
if (sec % 2 == 0 ) {
digitalWrite(Dot, LOW);
delayMicroseconds(BRIGHTNESS);
}
else;
digitalWrite(Dot, HIGH);
delayMicroseconds(BRIGHTNESS1);
digitalWrite(digit6, DIGIT_ON);
digitalWrite(digit5, DIGIT_OFF);
ShowNumber(yy);
delayMicroseconds(BRIGHTNESS);
digitalWrite(digit5, DIGIT_ON);
digitalWrite(digit6, DIGIT_OFF);
ShowNumber(aa );
delayMicroseconds(BRIGHTNESS);
ShowNumber(10);
digitalWrite(digit6, DIGIT_OFF);
digitalWrite(digit5, DIGIT_OFF);
}
//================for diplay of each of the six digits=============
void ShowNumber(int numberToDisplay) {
#define SEGMENT_ON LOW
#define SEGMENT_OFF HIGH
switch (numberToDisplay) {
case 0:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_OFF);
break;
case 1:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
case 2:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
break;
case 3:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
break;
case 4:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 5:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 6:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 7:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
case 8:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 9:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 10:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
}}
//====================For storing alarnm data in flash memory===========
void ALARMSTORE(int alrmtim , int rw , int newdtt1) {
static unsigned int altim;
int EEAddr = EEADDR;
altim = alrmtim;
if (rw == 1){
EEPROM.update(EEAddr , altim); EEAddr += sizeof(altim);
// Serial.print("EEPROM Written");
// Serial.print(altim);
newdtt1 = altim;
dtt2 = altim;
}
else{}
if (rw == 0){
EEPROM.get(EEAddr , altim); EEAddr += sizeof(altim);
// Serial.print("EEPROMread");
// Serial.print(altim);
newdtt1 = altim;
dtt2 = altim;
}
else{}
} // end of ALRMSTORE
Comments