#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
unsigned int time=0.00;
unsigned int alarmtime=0.00;
int count;
int clockx=90;
int clocky=32;
byte runstopwatch=0;
byte openstopwatch=0;
byte openalarm=0;
byte plusone=0;
byte next=0;
byte alarminc=0;
long start;
long stop;
const float BETA = 3950;
float temp;
byte showtemp;
int analogValue;
float celsius;
bool stopwatchreset=0;
void setup() {
set(); // set start time
//enable oled display
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
Serial.begin(9600);
//enable pins
pinMode(2, INPUT_PULLUP);
pinMode(0,OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
//external interupt
attachInterrupt(0,buttonpress,CHANGE);
//timer interupt
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 62499;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS12);
TIMSK1 |= (1 << OCIE1A);
sei();
}
ISR(TIMER1_COMPA_vect) {
//tick function progresses the clock by 1 second every second
tick();
analogValue = analogRead(A0);
celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
//change rgb led colour depending on tempreture
if (celsius>30){
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
}
else if(celsius>15){
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
}
else{
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
}
}
//main code is all handled in seperate functions so the loop function just takes care of which function to trigger at any given time.
void loop() {
if(openstopwatch!=0){
stopwatch();
}
else if(openalarm!=0){
alarm();
}
else if(openstopwatch==0){
clock();
}
if(alarmtime==time+1){
analogWrite(7,245);
}
else if(alarmtime==time-5){
analogWrite(7,0);
}
//display to screen
display.display();
display.clearDisplay();
}
void set(){
//set start time
Serial.begin(9600);
Serial.println("Please Enter Hour: ");
while(Serial.available()==0){}
time+=Serial.parseInt()*3600;
Serial.end();
Serial.begin(9600);
Serial.println("Please Enter Minute: ");
while(Serial.available()==0){}
time+=Serial.parseInt()*60;
Serial.end();
Serial.begin(9600);
Serial.println("Please Enter Second: ");
while(Serial.available()==0){}
time+=Serial.parseInt();
}
//progresses time by 1 second
void tick(){
//add to second value every second
time+=1;
if(time>=46800){
time=3600;
}
}
//converts a time in only seconds to hours min and sec
String digitaltime(unsigned int count){
unsigned int second=count%60;
unsigned int minute=((count-second)%3600)/60;
unsigned int hour=(count-(count%3600))/3600;
return String(hour)+":"+String(minute)+":"+String(second);
}
//interupt function
void buttonpress(){
//find button press duration
int presstime;
if(digitalRead(2)==0){
start=millis();
stop=0;
}
else if(digitalRead(2)==1){
stop=millis();
presstime=stop-start;
Serial.println(presstime);
//enable different menues depending on how long button is pressed
if(presstime>3000){
showtemp+=128;
}
else if(presstime>300 & openalarm==0){
openstopwatch+=128;
}
else if(presstime>25 & openstopwatch==128){
runstopwatch+=128;
}
else if(presstime>25 & openstopwatch==0 & openalarm==0){
openalarm+=128;
}
else if(presstime>300 & openalarm==128){
next+=128;
}
else if(presstime>25 & openalarm==128){
plusone+=128;
}
}
}
//handle all clock menu display and functionality
void clock(){
//display diital clock text and clock text
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print(digitaltime(time));
display.setCursor(clockx-5,clocky-25);
display.print("12");
display.setCursor(clockx+20,clocky-3);
display.print("3");
display.setCursor(clockx-2,clocky+20);
display.print("6");
display.setCursor(clockx-25,clocky-3);
display.print("9");
display.drawCircle(clockx,clocky,30,WHITE);
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,50);
if(showtemp==128){
display.print("T:");
display.print(celsius);
}
//calculate clock hand angle
float angle=(2*PI*((time)/43200.00));
//draw hour min and sec hands
display.drawLine(clockx,clocky,clockx-10*cos(angle+(PI/2)),clocky-10*sin(angle+(PI/2)),WHITE);
display.drawLine(clockx,clocky,clockx-15*cos(12*angle+(PI/2)),clocky-15*sin(12*angle+(PI/2)),WHITE);
display.drawLine(clockx,clocky,clockx-20*cos(720*angle+(PI/2)),clocky-20*sin(720*angle+(PI/2)),WHITE);
}
//handle all stopwatch display and functionality
void stopwatch(){
//print timer
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Stop Watch");
display.setTextSize(3);
//start and stop stopwatch
if(runstopwatch==0){
//count=0;
stopwatchreset=0;
display.print(digitaltime(count));
}
else if(runstopwatch!=0){
if(stopwatchreset==0){
stopwatchreset=1;
count=0;
}
count++;
display.print(digitaltime(count));
delay(1000);
}
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,50);
if(showtemp==128){
display.print("T:");
display.print(celsius);
}
}
void alarm(){
//print numbers
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Alarm");
display.println(digitaltime(alarmtime));
//change between hours min and sec
//add incrament the hour min and sec time for alarm
if(next==128){
next=0;
alarminc++;
}
if(plusone!=0 & alarminc==0){
alarmtime+=3600;
plusone=0;
}
else if(plusone!=0 & alarminc==1){
alarmtime+=60;
plusone=0;
}
else if(plusone!=0 & alarminc==2){
alarmtime+=1;
plusone=0;
}
if(alarminc==3){
alarminc=0;
openalarm+=128;
}
if(alarmtime>=46800){
alarmtime=alarmtime-43200;
}
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,50);
if(showtemp==128){
display.print("T:");
display.print(celsius);
}
}