#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS1307RTC.h> // Include DS1307 library
#define I2C_ADDR 0x27, 16, 2 // Add your I2C address here.
#define Rs_pin 0
#define Rw_pin 1
#define En_pin 2
#define BACKLIGHT_PIN 3
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
int d, dg, cnt;
DS1307 rtc; // Initialize DS1307 object
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
// Initialize Time-data structure
Time t;
int hh = 0, mm = 0, ss = 0;
#define buzzerPin 8
// the 8 arrays that form each segment of the custom numbers
byte bar1[8] =
{
B11100,
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
B11100
};
byte bar2[8] =
{
B00111,
B01111,
B01111,
B01111,
B01111,
B01111,
B01111,
B00111
};
byte bar3[8] =
{
B11111,
B11111,
B00000,
B00000,
B00000,
B00000,
B11111,
B11111
};
byte bar4[8] =
{
B11110,
B11100,
B00000,
B00000,
B00000,
B00000,
B11000,
B11100
};
byte bar5[8] =
{
B01111,
B00111,
B00000,
B00000,
B00000,
B00000,
B00011,
B00111
};
byte bar6[8] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111,
B11111
};
byte bar7[8] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00111,
B01111
};
byte bar8[8] =
{
B11111,
B11111,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000
};
void setup() {
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE); // LCD Backlight ON
lcd.setBacklight(HIGH);
pinMode(buzzerPin, OUTPUT);
rtc.begin(); // Initialize DS1307
lcd.begin(16, 2);
// Assigns each segment a write number
lcd.createChar(1, bar1);
lcd.createChar(2, bar2);
lcd.createChar(3, bar3);
lcd.createChar(4, bar4);
lcd.createChar(5, bar5);
lcd.createChar(6, bar6);
lcd.createChar(7, bar7);
lcd.createChar(8, bar8);
} //END OF VOID SETUP()
// DRAW THE NUMBERS
void custom0(int col) { // uses segments to build the number 0
lcd.setCursor(col, 0);
lcd.write(2);
lcd.write(8);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(2);
lcd.write(6);
lcd.write(1);
}
void custom1(int col) { // number 1
lcd.setCursor(col, 0);
lcd.write(32);
lcd.write(32);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(32);
lcd.write(32);
lcd.write(1);
}
void custom2(int col) { // number 2
lcd.setCursor(col, 0);
lcd.write(5);
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(2);
lcd.write(6);
lcd.write(6);
}
void custom3(int col) { // number 3
lcd.setCursor(col, 0);
lcd.write(5);
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(7);
lcd.write(6);
lcd.write(1);
}
void custom4(int col) { // number 4
lcd.setCursor(col, 0);
lcd.write(2);
lcd.write(6);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(32);
lcd.write(32);
lcd.write(1);
}
void custom5(int col) { // number 5
lcd.setCursor(col, 0);
lcd.write(2);
lcd.write(3);
lcd.write(4);
lcd.setCursor(col, 1);
lcd.write(7);
lcd.write(6);
lcd.write(1);
}
void custom6(int col) { // number 6
lcd.setCursor(col, 0);
lcd.write(2);
lcd.write(3);
lcd.write(4);
lcd.setCursor(col, 1);
lcd.write(2);
lcd.write(6);
lcd.write(1);
}
void custom7(int col) { // number 7
lcd.setCursor(col, 0);
lcd.write(2);
lcd.write(8);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(32);
lcd.write(32);
lcd.write(1);
}
void custom8(int col) { // number 8
lcd.setCursor(col, 0);
lcd.write(2);
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(2);
lcd.write(6);
lcd.write(1);
}
void custom9(int col) { // number 9
lcd.setCursor(col, 0);
lcd.write(2);
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(7);
lcd.write(6);
lcd.write(1);
}
//PRINT THE NUMBERS:
void printNumber(int value, int col) {
if (value == 0) {
custom0(col);
} if (value == 1) {
custom1(col);
} if (value == 2) {
custom2(col);
} if (value == 3) {
custom3(col);
} if (value == 4) {
custom4(col);
} if (value == 5) {
custom5(col);
} if (value == 6) {
custom6(col);
} if (value == 7) {
custom7(col);
} if (value == 8) {
custom8(col);
} if (value == 9) {
custom9(col);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
ss = 0;
while (ss <= 15) {
checkAlarm(); //CHECK ALARM
showBig();
ss++;
}
lcd.clear();
while (ss <= 25) {
showSmall();
ss++;
}
lcd.clear();
while (ss <= 45) {
showBig();
ss++;
}
lcd.clear();
while (ss <= 55) {
showSmall();
ss++;
}
lcd.clear();
while (ss <= 59) {
showBig();
ss++;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void showBig() {
rtc.updateTime(); // Update time from DS1307 RTC
hh = rtc.getHours();
mm = rtc.getMinutes();
ss = rtc.getSeconds();
switch (cnt) {
case 1:
mm = mm + dg;
dg = 0;
if (mm > 59) {
mm = 59;
}
if (mm < 0) {
mm = 0;
}
break;
case 2:
hh = hh + dg;
dg = 0;
if (hh > 12) { // ROLLOVER TO 1 AFTER 12
hh = 1;
}
if (hh < 0) {
hh = 0;
}
break;
}
if (hh >= 12) {
lcd.setCursor(14, 1);
lcd.print("PM");
hh = hh - 12;
if (hh == 0) {
hh = 12;
}
}
else {
if (hh == 0) {
hh = 12;
}
lcd.setCursor(14, 1);
lcd.print("AM");
}
/////////////////////
d = hh % 10;
printNumber(d, 3);
d = hh / 10;
printNumber(d, 0);
d = mm % 10;
printNumber(d, 10);
d = mm / 10;
printNumber(d, 7);
// show seconds at upper right
lcd.setCursor(14, 0);
lcd.print(ss / 10);
lcd.print(ss % 10);
if (cnt == 0) {
ss++;
lcd.setCursor(6, 0);
lcd.print(" ");
lcd.setCursor(6, 1);
lcd.print(" ");
delay(500);
lcd.setCursor(6, 0);
lcd.print(".");
lcd.setCursor(6, 1);
lcd.print(".");
delay(500);
}
} //END of showBig()
/////////////////////////////
int dd = 0, bb = 0, set_day;
int yy = 0;
String Day = " ";
/////////////////////////////
void showSmall() {
rtc.updateTime(); // Update time from DS1307 RTC
hh = rtc.getHours();
mm = rtc.getMinutes();
ss = rtc.getSeconds();
dd = rtc.getDate();
bb = rtc.getMonth();
yy = rtc.getYear();
lcd.setCursor(1, 0);
lcd.print((hh / 10) % 10);
lcd.print(hh % 10);
lcd.print(":");
lcd.print((mm / 10) % 10);
lcd.print(mm % 10);
lcd.print(":");
lcd.print((ss / 10) % 10);
lcd.print(ss % 10);
lcd.print(" ");
lcd.setCursor(11, 0);
lcd.print(rtc.getTemperature());
lcd.write(223); // symbol for degree
lcd.print("C");
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(rtc.getDayStr());
lcd.print(" ");
lcd.print(rtc.getMonthStr());
lcd.print(" ");
lcd.print((dd / 10) % 10);
lcd.print(dd % 10);
lcd.print(" ");
lcd.print(yy);
} //END of showSmall()
/////////////////////////////////////////
void checkAlarm() {
rtc.updateTime(); // Update time from DS1307 RTC
if (hh == 6 && mm == 30) {
digitalWrite(buzzerPin, HIGH); //active buzzer
delay(60);
digitalWrite(buzzerPin, LOW);
delay(60);
digitalWrite(buzzerPin, HIGH);
delay(60);
digitalWrite(buzzerPin, LOW);
delay(60);
digitalWrite(buzzerPin, HIGH);
delay(60);
digitalWrite(buzzerPin, LOW);
delay(60);
digitalWrite(buzzerPin, HIGH);
delay(60);
digitalWrite(buzzerPin, LOW);
delay(60);
}
else {
digitalWrite(buzzerPin, LOW);
}
delay(100);
}