#include <Wire.h>
#include <Keypad.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
char key = "";
char key2 = "";
Servo myservo;
RTC_DS1307 rtc;
bool feed = false;
String feedTime = "14:36:00";
int screen_page = 1;
int feed_duration = 2000;
int pos = 0;
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
unsigned long previousTime1 = 0;
unsigned long previousTime2 = 0;
unsigned long previousTime3 = 0;
const unsigned long time1 = 1000;
const unsigned long time2 = 1000;
const unsigned long time3 = 500;
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);
Keypad customKeypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(3, 0);
lcd.print("AUTOMATIC");
lcd.setCursor(5, 1);
lcd.print("FEEDER");
myservo.attach(10);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
delay(1000);
lcd.clear();
}
void loop() {
if(key != NO_KEY){
lcd.clear();
}
DateTime time = rtc.now();
feeder();
lcd_display(time);
time_check(time);
key = keypad.getKey();
if (key == '#') {
feed = true;
screen_page = 1;
}
if (key == '*') {
if((screen_page >= 1) && (screen_page <= 2)){
screen_page++;
}else if(screen_page == 3){
screen_page = 1;
}
}
}
void feeder(){
unsigned long currentTime = millis();
if(currentTime - previousTime1 >= time1){
if(feed){
myservo.write(180);
Serial.println("Feeder is On");
delay(feed_duration);
feed = false;
myservo.write(90);
}
else{
Serial.println("Feeder is off");
feed = false;
}
previousTime1 = currentTime;
}
}
void lcd_display(DateTime time){
if(screen_page == 1){
lcd.setCursor(0, 0);
lcd.print(String("Time: "+time.timestamp(DateTime::TIMESTAMP_TIME)));
lcd.setCursor(0, 1);
lcd.print(String("Date: "+time.timestamp(DateTime::TIMESTAMP_DATE)));
}else if(screen_page == 2){
lcd.setCursor(0, 0);
lcd.print("A: Set Time");
lcd.setCursor(0, 1);
lcd.print("B: Set Feed Time");
if(key == 'A'){
screen_page = 4;
}else if(key == 'B'){
screen_page = 5;
}
}else if(screen_page == 3){
lcd.setCursor(0, 0);
lcd.print("C: Feed Duration");
// lcd.setCursor(0, 1);
// lcd.print("D: ");
}else if(screen_page == 4){
lcd.setCursor(0, 0);
lcd.print("Enter Hour: ");
}else if(screen_page == 5){
lcd.setCursor(0, 0);
lcd.print("B: Set Feed Time");
}
}
void time_check(DateTime time){
unsigned long currentTime = millis();
if(currentTime - previousTime3 >= time2){
if(feedTime == time.timestamp(DateTime::TIMESTAMP_TIME)){
feed = true;
delay(1000);
}
previousTime3 = currentTime;
}
}