#include <LiquidCrystal_I2C.h>
#include <TinyWireM.h>
#include <TinyRTClib.h>
int alm1, alhr=0;
int ho,ur,mi,te,se, conds, seconds, minutes, hours;
int da, ys, mon, ths, yea, rs, days, months, years, day_of_week;
int totalColumns = 16;
int totalRows = 2;
int counter0, counter, counter2, counter3, counter4, counter5, counter6, counter7, counter8 =0;
int al_on_off=0;
int num1, press=0;
LiquidCrystal_I2C lcd(0x27, totalColumns, totalRows);
#define DS1307_ADDR 0x68
RTC_DS1307 rtc;
void setup(){
pinMode(1, OUTPUT);
digitalWrite(1, LOW);
pinMode(4, INPUT);
pinMode(3, INPUT);
lcd.init();
lcd.backlight(); // use to turn on and turn off LCD back light
// Setup TinyWire I2C
TinyWireM.begin();
rtc.begin();
//rtc.adjust(DateTime(2014, 5, 4, 3, 0, 0));
}
void updateClock()
{
TinyWireM.beginTransmission(DS1307_ADDR); // Reset DS1307 register pointer
TinyWireM.send(0x00);
TinyWireM.endTransmission();
// Request 7 bytes from DS1307
TinyWireM.requestFrom(DS1307_ADDR, 7);
seconds = bcdToDec(TinyWireM.receive());
minutes = bcdToDec(TinyWireM.receive());
hours = bcdToDec(TinyWireM.receive());
day_of_week = TinyWireM.receive();
days = bcdToDec(TinyWireM.receive());
months = bcdToDec(TinyWireM.receive());
years = bcdToDec(TinyWireM.receive());
ho = hours / 10;
ur = hours % 10;
mi = minutes / 10;
te = minutes % 10;
se= seconds/10;
conds= seconds%10;
da = days / 10;
ys = days % 10;
mon= months/10;
ths=months%10;
yea=years/10;
rs=years%10;
}
// Convert binary coded decimal to normal decimal numbers
uint8_t bcdToDec(uint8_t value) {
return ((value / 16 * 10) + (value % 16));
}
void display()
{
counter0=1;
counter=0;
counter2=0;
counter3=0;
counter4=0;
counter5=0;
counter6=0;
updateClock();
lcd.setCursor(6,0);
lcd.print(String(ho)+ String(ur)+":"+ String(mi) + String(te)+":"+ String(se)+ String(conds)+ " ");
//lcd.setCursor(6,1);
//lcd.print(String(da)+ String(ys)+ "/" + String(mon) + String(ths)+ "/" + String(yea)+ String(rs));
//delay(900);
//lcd.clear();
}
void loop()
{
if(hours==alhr && minutes==alm1 && al_on_off==1)
{
digitalWrite(1, HIGH);
delay(100);
digitalWrite(1, LOW);
delay(100);
}else{
digitalWrite(1, LOW);
}
if (digitalRead(3)==1)
{
if(press==0)
{
num1++;
press=1;
delay(200);
//lcd.clear();
}
}
else
{
press=0;
}
if(num1==5 && al_on_off==0)
{
num1=0;
}
if(num1==7)
{
num1=0;
}
switch (num1)
{
case 0:
if(counter0<1){
lcd.clear();
}
display();
break;
case 1:
if(counter<1){
lcd.clear();
};
sHour();
break;
case 2:
if(counter2<1){
lcd.clear();
}
sMinute();
break;
case 3:
if(counter3<1){
lcd.clear();
}
sSec();
break;
case 4:
if(counter4<1){
lcd.clear();
}
Alrm();
break;
case 5:
SetAlrhr();
break;
case 6:
if(counter6<0)
{
lcd.clear();
}
SetAlrmi();
break;
}
}
//Set hours
void sHour(){
counter =1;
if(digitalRead(4)==1)
{
hours++;
delay(200);
}
if(hours>23)
{
hours=0;
}
lcd.setCursor(0,0);
lcd.print("Set hours " + String(hours/10)+ String(hours%10));
}
//Set minutes
void sMinute(){
counter2=1;
if(digitalRead(4)==1)
{
minutes++;
delay(200);
rtc.adjust(DateTime(years, months, days, hours , minutes , seconds));
}
if(minutes>59)
{
minutes=0;
}
lcd.setCursor(0,0);
lcd.print("Set minutes " + String(minutes/10)+String(minutes%10));
}
//Set seconds
void sSec(){
counter3 =1;
if(digitalRead(4)==1)
{
seconds++;
delay(200);
rtc.adjust(DateTime(years, months, days, hours , minutes, seconds));
}
if(seconds>59)
{
seconds=0;
}
lcd.setCursor(0,0);
lcd.print("Set seconds " + String(seconds/10)+String(seconds%10));
}
void Alrm()
{
counter4 =1;
if(digitalRead(4)==1)
{
al_on_off++;
delay(200);
}
if(al_on_off==2)
{
al_on_off=0;
}
lcd.setCursor(6,0);
lcd.print("Alarm");
lcd.setCursor(12,0);
if(al_on_off==0){
lcd.print("Off");
}else if(al_on_off==1){
lcd.print("On ");
}
}
void SetAlrhr()
{
if(al_on_off==1)
{
if(digitalRead(4)==1)
{
alhr++;
delay(200);
}
if(alhr>23)
{
alhr=0;
}
lcd.setCursor(0,0);
lcd.print("Set alarm hours ");
lcd.setCursor(6,1);
lcd.print (String(alhr/10)+ String(alhr%10));
}
}
void SetAlrmi()
{
counter0=0;
counter6 =1;
if(digitalRead(4)==1)
{
alm1++;
delay(200);
}
if(alm1>59)
{
alm1=0;
}
lcd.setCursor(0,0);
lcd.print("Set alarm minutes ");
lcd.setCursor(6,1);
lcd.print(String(alm1/10)+String(alm1%10));
}