#include "RTClib.h"
#include <Wire.h>
// oled display
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
RTC_DS1307 rtc;
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(128, 64, &Wire, -1);
int ShiftYH;
int ShiftXH;
int shr;
int smin;
int ShiftYM;
int ShiftXM;
int ShiftYS;
int ShiftXS;
int ssec;
int stcount = 0;
int stmin = 0;
int sthr = 0;
int product = 3;
int activestopwatch = 0;
int stpause = 0;
long initialsec;
long finalsec;
void setup() {
Serial.begin(9600);
rtc.begin();
display.setTextSize(1);
display.setTextColor(WHITE);
display.begin(SSD1306_SWITCHCAPVCC, 0x3c);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
// asks for initial hour and minute
Serial.println("asking for hour (enter less then 13)");
while(Serial.available()==0){}
shr = Serial.parseInt();
Serial.end();
Serial.begin(9600);
Serial.println("asking for minute (enter less than 60)");
while(Serial.available()==0){}
smin = Serial.parseInt();
Serial.end();
Serial.begin(9600);
Serial.println("asking for seconds (enter less than 60)");
while(Serial.available()==0){}
ssec = Serial.parseInt();
Serial.println(shr);
Serial.println(smin);
Serial.println(ssec);
DateTime newTime = DateTime(2000, 10, 23, shr, smin, ssec);//(year,month,day,hour,min,sec)
rtc.adjust(newTime); //sets the new RTC adjust
pinMode(2, INPUT_PULLUP);
attachInterrupt(0,button,CHANGE);
}
void loop() {
DateTime now = rtc.now();
display.clearDisplay();
display.setCursor(0,0);
ssec = now.second();
smin = now.minute();
shr = now.hour();
int count = 330;
String digitaltime(unsigned int count){
unsigned int asecond=count%60;
unsigned int aminute=((count-second)%3600)/60;
unsigned int ahour=(count-(count%3600))/3600;
return String(ahour)+":"+String(aminute)+":"+String(asecond);
Serial.println(ahour);
Serial.println(aminute);
Serial.println(asecond);
delay(1000);
}
}
//------------------------------------------------------functions
void analogclk() {
//displaying numbers
display.setTextSize(1);
display.setTextColor(WHITE);
DateTime now = rtc.now();
display.setCursor(70,4);
display.print("12");
display.setCursor(98,27);
display.print("3");
display.setCursor(75,54);
display.print("6");
display.setCursor(50,27);
display.print("9");
//finding angle in radians of minute and hour
float hrAngle = (shr*0.5236) - 1.5708;
float minAngle = (smin*0.10472) - 1.5708;
float secAngle = (ssec*0.10472) - 1.5708;
//calculates the rectangular form of the hour minute and seconds handle
ShiftYH = 8*(sin(hrAngle)) + 32;
ShiftXH = 8*(cos(hrAngle)) + 75;
ShiftYM = 17*(sin(minAngle)) + 32;
ShiftXM = 17*(cos(minAngle)) + 75;
ShiftYS = 17*(sin(secAngle)) + 32;
ShiftXS = 17*(cos(secAngle)) + 75;
display.drawCircle(75, 32, 31, WHITE); //draws the circle and the hour minute and second handle
display.drawLine(75, 32, ShiftXH, ShiftYH, WHITE);
display.drawLine(75, 32, ShiftXM, ShiftYM, WHITE);
display.drawLine(75, 32, ShiftXS, ShiftYS, WHITE);
display.display();
}
void digitalclk() {
//display current time
display.setTextSize(2);
display.setTextColor(WHITE);
DateTime now = rtc.now();
display.print(now.hour());
display.print(":");
display.print(now.minute());
display.print(":");
display.print(now.second());
display.display();
}
void stopwatch() {
display.setTextSize(3);
display.setCursor(0,0);
display.print(sthr);
display.print(":");
display.print(stmin);
display.print(":");
display.print(stcount);
display.display();
}
void button() {
if(digitalRead(2)==0){
initialsec=millis();
finalsec=0;
}
else if(digitalRead(2)==1){
finalsec=millis();
long difference = finalsec-initialsec;
Serial.println(difference);
}
}