#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BUTTON_MENU 2
#define BUTTON_UP 3
#define BUTTON_DOWN 4
#define BUTTON_LEFT 5
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte second_final, minute_final, hour_final;
byte alarm1[3] = {2, 4 ,5};
byte alarm2[3] = {1, 1, 1};
byte change1[3] = {0, 0, 0};
byte menu = 0;
byte readSecond(){
byte second, second1, second10;
Wire.beginTransmission(0x68);
Wire.write(0x00);
Wire.endTransmission(1);
Wire.requestFrom(0x68, 1, 1);
second = Wire.read();
second1 = second << 4;
second1 = second1 >> 4;
second10 = second << 1;
second10 = second10 >> 5;
second10 *= 10;
return (second10 + second1);
}
byte readMinute(){
byte minute, minute1, minute10;
Wire.beginTransmission(0x68);
Wire.write(0x01);
Wire.endTransmission(1);
Wire.requestFrom(0x68, 1, 1);
minute = Wire.read();
minute1 = minute << 4;
minute1 = minute1 >> 4;
minute10 = minute >> 4;
minute10 *= 10;
return (minute10 + minute1);
}
byte readHour(){
byte hour, hour1, hour10;
Wire.beginTransmission(0x68);
Wire.write(0x02);
Wire.endTransmission(1);
Wire.requestFrom(0x68, 1, 1);
hour = Wire.read();
hour1 = hour << 4;
hour1 = hour1 >> 4;
hour10 = hour << 1;
hour10 = hour10 >> 5;
hour10 *= 10;
return (hour10 + hour1);
}
void printClock(byte second, byte minute, byte hour){
lcd.setCursor(4,0);
(hour >= 10) ? lcd.print(hour) : lcd.print("0") && lcd.print(hour);
lcd.print(":");
(minute >= 10) ? lcd.print(minute) : lcd.print("0") && lcd.print(minute);
lcd.print(":");
(second >= 10) ? lcd.print(second) : lcd.print("0") && lcd.print(second);
}
void buttonRecognizing(){
for(int i = 2; i <= 5; i++){
pinMode(i, INPUT);
}
}
void setup() {
Wire.begin();
lcd.init();
lcd.backlight();
Serial.begin(9600);
buttonRecognizing();
}
void loop(){
if(digitalRead(BUTTON_MENU)){
Serial.print(":");
while(digitalRead(BUTTON_MENU));
(menu < 3) ? menu++ : menu = 0;
Serial.println(menu);
}
switch(menu){
case 0 :
second_final = readSecond();
minute_final = readMinute();
hour_final = readHour();
printClock(second_final, minute_final, hour_final);
break;
case 1 :
printClock(alarm1[0], alarm1[1], alarm1[2]);
break;
case 2 :
printClock(alarm2[0], alarm2[1], alarm2[2]);
break;
case 3 :
change1[0] = readSecond();
change1[1] = readMinute();
change1[2] = readHour();
printClock(change1[0], change1[1], change1[2]);
break;
default :
break;
}
delay(100);
}