#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Servo.h>
Servo servo1;
int PinServo1=10;
RTC_DS1307 rtc;
const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] =
{
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
uint8_t colPins[COLS] = { 5, 4, 3, 2 }; // Pins connected to C1, C2, C3, C4
uint8_t rowPins[ROWS] = { 9, 8, 7, 6 }; // Pins connected to R1, R2, R3, R4
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 16, 2);
int PrevHH = 0;
int PrevMI = 0;
int PrevSS = 0;
boolean AlarmStatus = false;
String Mode = "CLOCK";
int AlarmH1 = 0;
int AlarmH2 = 0;
int AlarmM1 = 0;
int AlarmM2 = 0;
int AlarmH3 = 0;
int AlarmH4 = 0;
int AlarmM3 = 0;
int AlarmM4 = 0;
boolean Blinkletter = false;
void setup() {
Serial.begin(9600); //Turn on serial monitor
servo1.attach(PinServo1);
lcd.init();
lcd.backlight();
lcd.begin(16, 2); // set the lcd dimension
lcd.clear();
rtc.begin();
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
String print2digits(int number)
{
String f = "";
if (number >= 0 && number < 10)
{
f = "0";
}
f = f + String(number);
return f;
}
void Displaytime()
{
lcd.setCursor(2,0);
DateTime now = rtc.now();
PrevHH=now.hour();
PrevMI=now.minute();
PrevSS=now.second();
lcd.print(String(print2digits(PrevHH)));
lcd.print(':');
lcd.print(String(print2digits(PrevMI)));
lcd.print(':');
lcd.print(String(print2digits(PrevSS)));
}
void DisplayStatus()
{
if (AlarmStatus)
{
lcd.setCursor(0,1);
lcd.print("A " + String(AlarmH1) + String(AlarmH2) + ":" + String(AlarmM1) + String(AlarmM2) + " B " + String(AlarmH3) + String(AlarmH4) + ":" + String(AlarmM3) + String(AlarmM4));
}
else
{
lcd.setCursor(0,1);
lcd.print("A " + String(AlarmH1) + String(AlarmH2) + ":" + String(AlarmM1) + String(AlarmM2) + " B " + String(AlarmH3) + String(AlarmH4) + ":" + String(AlarmM3) + String(AlarmM4));
}
}
void BlinkA()
{
if(Mode=="CLOCK")
{
Displaytime();
}
if(Mode == "SET H1" )
{
lcd.setCursor(0,1);
if(Blinkletter)
{
lcd.print("PET FEED A " + String(AlarmH1) + String(AlarmH2) + ":" + String(AlarmM1) + String(AlarmM2));
Blinkletter = !Blinkletter;
}
else
{
lcd.print("PET FEED A " + String(AlarmH2) + ":" + String(AlarmM1) + String(AlarmM2));
Blinkletter = !Blinkletter;
}
}
if(Mode == "SET H2")
{
lcd.setCursor(0,1);
if(Blinkletter)
{
lcd.print("PET FEED A " + String(AlarmH1) + String(AlarmH2) + ":" + String(AlarmM1) + String(AlarmM2));
Blinkletter = !Blinkletter;
}
else
{
lcd.print("PET FEED A " + String(AlarmH1) + " :" + String(AlarmM1) + String(AlarmM2));
Blinkletter = !Blinkletter;
}
}
if(Mode == "SET M1")
{
lcd.setCursor(0,1);
if(Blinkletter)
{
lcd.print("PET FEED A " + String(AlarmH1) + String(AlarmH2) + ":" + String(AlarmM1) + String(AlarmM2));
Blinkletter = !Blinkletter;
}
else
{
lcd.print("PET FEED A " + String(AlarmH1) + String(AlarmH2) + ": " + String(AlarmM2));
Blinkletter = !Blinkletter;
}
}
if(Mode == "SET M2")
{
lcd.setCursor(0,1);
if(Blinkletter)
{
lcd.print("PET FEED A " + String(AlarmH1) + String(AlarmH2) + ":" + String(AlarmM1) + String(AlarmM2));
Blinkletter = !Blinkletter;
}
else
{
lcd.print("PET FEED A " + String(AlarmH1) + String(AlarmH2) + ":" + String(AlarmM1) + " ");
Blinkletter = !Blinkletter;
}
}
}
void BlinkB()
{
if(Mode=="CLOCK")
{
Displaytime();
}
if(Mode == "SET H3" )
{
lcd.setCursor(0,1);
if(Blinkletter)
{
lcd.print("PET FEED B " + String(AlarmH3) + String(AlarmH4) + ":" + String(AlarmM3) + String(AlarmM4));
Blinkletter = !Blinkletter;
}
else
{
lcd.print("PET FEED B " + String(AlarmH4) + ":" + String(AlarmM3) + String(AlarmM4));
Blinkletter = !Blinkletter;
}
}
if(Mode == "SET H4")
{
lcd.setCursor(0,1);
if(Blinkletter)
{
lcd.print("PET FEED B " + String(AlarmH3) + String(AlarmH4) + ":" + String(AlarmM3) + String(AlarmM4));
Blinkletter = !Blinkletter;
}
else
{
lcd.print("PET FEED B " + String(AlarmH3) + " :" + String(AlarmM3) + String(AlarmM4));
Blinkletter = !Blinkletter;
}
}
if(Mode == "SET M3")
{
lcd.setCursor(0,1);
if(Blinkletter)
{
lcd.print("PET FEED B " + String(AlarmH3) + String(AlarmH4) + ":" + String(AlarmM3) + String(AlarmM4));
Blinkletter = !Blinkletter;
}
else
{
lcd.print("PET FEED B " + String(AlarmH3) + String(AlarmH4) + ": " + String(AlarmM4));
Blinkletter = !Blinkletter;
}
}
if(Mode == "SET M4")
{
lcd.setCursor(0,1);
if(Blinkletter)
{
lcd.print("PET FEED B " + String(AlarmH3) + String(AlarmH4) + ":" + String(AlarmM3) + String(AlarmM4));
Blinkletter = !Blinkletter;
}
else
{
lcd.print("PET FEED B " + String(AlarmH3) + String(AlarmH4) + ":" + String(AlarmM3) + " ");
Blinkletter = !Blinkletter;
}
}
}
void loop()
{
String PressedKey;
Displaytime();
char key = keypad.getKey();
if (key)
{
PressedKey = String(key);
if ((Mode == "CLOCK") && (PressedKey == "*"))
{
AlarmStatus = !AlarmStatus;
}
if ((Mode == "CLOCK") && (PressedKey == "A"))
{
Mode = "SET H1";
}
if ((Mode == "CLOCK") && (PressedKey == "B"))
{
Mode = "SET H3";
}
if ((Mode == "CLOCK") && (PressedKey == "C"))
{
servo1.write(90);
}
if ((PressedKey == "#") && (Mode == "SET H1" || Mode == "SET H2" || Mode == "SET M1" || Mode == "SET M2"))
{
Mode = "CLOCK";
DisplayStatus();
goto EnA;
}
if (Mode == "SET H1")
{
if ((PressedKey == "0" || PressedKey == "1" || PressedKey == "2"))
{
AlarmH1 = PressedKey.toInt();
Mode = "SET H2";
goto EnA;
}
}
if (Mode == "SET H2")
{
if (((AlarmH1 * 10) + PressedKey.toInt()) < 24)
{
AlarmH2 = PressedKey.toInt();
Mode = "SET M1";
goto EnA;
}
}
if (Mode == "SET M1")
{
if (PressedKey == "0" || PressedKey == "1" || PressedKey == "2" || PressedKey == "3" || PressedKey == "4" || PressedKey == "5")
{
AlarmM1 = PressedKey.toInt();
Mode = "SET M2";
goto EnA;
}
}
if (Mode == "SET M2")
{
if (((AlarmM1 * 10) + PressedKey.toInt()) < 60)
{
AlarmM2 = PressedKey.toInt();
Mode = "SET H1";
goto EnA;
}
}
if ((PressedKey == "#") && (Mode == "SET H3" || Mode == "SET H4" || Mode == "SET M3" || Mode == "SET M4"))
{
Mode = "CLOCK";
DisplayStatus();
goto EnB;
}
if (Mode == "SET H3")
{
if ((PressedKey == "0" || PressedKey == "1" || PressedKey == "2"))
{
AlarmH3 = PressedKey.toInt();
Mode = "SET H4";
goto EnB;
}
}
if (Mode == "SET H4")
{
if (((AlarmH3 * 10) + PressedKey.toInt()) < 24)
{
AlarmH4 = PressedKey.toInt();
Mode = "SET M3";
goto EnB;
}
}
if (Mode == "SET M3")
{
if (PressedKey == "0" || PressedKey == "1" || PressedKey == "2" || PressedKey == "3" || PressedKey == "4" || PressedKey == "5")
{
AlarmM3 = PressedKey.toInt();
Mode = "SET M4";
goto EnB;
}
}
if (Mode == "SET M4")
{
if (((AlarmM3 * 10) + PressedKey.toInt()) < 60)
{
AlarmM4 = PressedKey.toInt();
Mode = "SET H3";
goto EnB;
}
}
}
EnA:
{
if (AlarmStatus)
{
lcd.setCursor(11,0);
lcd.print("ON ");
}
else
{
lcd.setCursor(11,0);
lcd.print("OFF");
}
BlinkA();
AlarmTrigger();
}
EnB:
{
if (AlarmStatus)
{
lcd.setCursor(11,0);
lcd.print("ON ");
}
else
{
lcd.setCursor(11,0);
lcd.print("OFF");
}
BlinkB();
AlarmTrigger();
}
}
void AlarmTrigger()
{
if (AlarmStatus)
{
if ((((AlarmH1 * 10) + AlarmH2) == PrevHH && (((AlarmM1 * 10) + AlarmM2) == PrevMI)))
{
if (PrevSS >= 0 && PrevSS < 1)
{
servo1.write(0);
}
}
if ((((AlarmH3 * 10) + AlarmH4) == PrevHH) && (((AlarmM3 * 10) + AlarmM4) == PrevMI))
{
if (PrevSS >= 0 && PrevSS < 1)
{
servo1.write(180);
}
}
}
}