//Request required packages
#include <Servo.h>
#include "ClickButton.h"
//Define input variables
int PowerSwitch = 2;
bool Started = false;
//Define servo names
Servo Sec1;
Servo Sec2;
Servo Min1;
Servo Min2;
Servo Hour1;
Servo Hour2;
//Define servo angle variables
int Sec1ANGLE = 0;
int Sec2ANGLE = 0;
int Min1ANGLE = 0;
int Min2ANGLE = 0;
int Hour1ANGLE = 0;
int Hour2ANGLE = 0;
//Define clock system variables
int Secs = 0;
int Mins = 0;
int Hours = 0;
//Define clock type, 24 Hour or 12 Hour
int MaxHours = 24;
//Time keeping variables
int StartTime;
int EndTime;
int CycleTime;
int DelayStart;
int DelayEnd;
int TotalTime;
int TimeChange;
//Initialise system
void setup()
{
Serial.begin(9600);
pinMode(PowerSwitch, INPUT);
//Link servos to pins
Sec1.attach(3);
Sec2.attach(5);
Min1.attach(6);
Min2.attach(9);
Hour1.attach(10);
Hour2.attach(11);
}
//Main code loop
void loop()
{
DelayStart = millis();
StartTime = micros();
if (digitalRead(PowerSwitch) == HIGH){
Started = true;
Secs = Secs + 1;
//Time denomination overflow
if (Secs > 59){
Secs -= 60;
Mins += 1;
}
if (Mins > 59){
Mins -= 60;
Hours += 1;
}
if (Hours > MaxHours){
Hours -= MaxHours;
}
//Servo angle setup
if (Secs < 10){
Sec1ANGLE = Secs;
Sec2ANGLE = 0;
}else{
Sec1ANGLE = Secs % 10;
Sec2ANGLE = Secs / 10;
}
if (Mins < 10){
Min1ANGLE = Mins;
Min2ANGLE = 0;
}else{
Min1ANGLE = Mins % 10;
Min2ANGLE = Mins / 10;
}
if (Hours < 0){
Hour1ANGLE = Hours;
Hour2ANGLE = 0;
}else{
Hour1ANGLE = Hours % 10;
Hour2ANGLE = Hours / 10;
}
//Servo angle translation
Sec1ANGLE = map(Sec1ANGLE, 0, 9, 0, 180);
Sec2ANGLE = map(Sec2ANGLE, 0, 9, 0, 180);
Min1ANGLE = map(Min1ANGLE, 0, 9, 0, 180);
Min2ANGLE = map(Min2ANGLE, 0, 9, 0, 180);
Hour1ANGLE = map(Hour1ANGLE, 0, 9, 0, 180);
Hour2ANGLE = map(Hour2ANGLE, 0, 9, 0, 180);
//Servo angle write
Sec1.write(Sec1ANGLE);
Sec2.write(Sec2ANGLE);
Min1.write(Min1ANGLE);
Min2.write(Min2ANGLE);
Hour1.write(Hour1ANGLE);
Hour2.write(Hour2ANGLE);
//Print to serial digital time
//Serial.println("Current Time: "+String(Hours)+":"+String(Mins)+":"+String(Secs));
EndTime = micros();
CycleTime = EndTime - StartTime;
//Loop tickrate of 1 second
delay(999);
delayMicroseconds(1000 - CycleTime);
DelayEnd = millis();
TotalTime = DelayEnd - DelayStart;
Serial.println(String(TotalTime));
}
}