//include LCD library
#include<LiquidCrystal_I2C.h>
//include servo motor library
#include<ESP32Servo.h>
LiquidCrystal_I2C lcd (0x27,16,2);//set pins for outputs of Arduino to LCD
int manualPin = 2;//set pin D2 of Arduino for manual feeding button
int buttonState = 0;//initial state of manual feeding button
int servoPin = 19;// set pin D19 of Arduino for the servo motor input
Servo Servo1;//call servo as Servo1
int S = 10; // count seconds
int M = 00; // count minutes
int H = 00; // count hours
void setup()
{
tone(5, 1000, 30);
lcd.init();
pinMode(manualPin, INPUT_PULLUP);//set manualPin as input with built in pull up resistor
Servo1.attach(servoPin,500,2400);//attach Servo1 to the servoPin cmd
pinMode(servoPin, OUTPUT);//set servoPin as output
Servo1.write(0);//turn servo motor at standby position at full power
lcd.begin(16,2);//initiate LCD panel
lcd.setCursor(0,0);//select first line of LCD
lcd.print(" Automatic Pet ");//print script
lcd.setCursor(0,1);//select second line of LCD
lcd.print(" Feeder ");//print script
delay(2000);//print scripts for 2 seconds
lcd.clear();//clear LCD display
lcd.print(" by: C. LIM ");
delay(2000);
lcd.setCursor(0,1);
lcd.print(" System Ready ");
delay(2000);
lcd.clear();
tone(5, 2000, 50);
}
void loop()
{
//set countdown counter
lcd.setCursor(0,0);
lcd.print("Feeding time in:");
lcd.setCursor(6,1);
lcd.print(":");
lcd.setCursor(9,1);
lcd.print(":");
S--;//countdown S
delay(1000);//count per second
if(S<0)
{
M--;
S=10;
}
if(M<0)
{
H--;
M=00;
}
if(H<0)
{
H=00;
M=00;
S=10;
}
if(M>9)
{
lcd.setCursor(7,1);
lcd.print(M);
}
else
{
lcd.setCursor(7,1);
lcd.print("0");
lcd.setCursor(8,1);
lcd.print(M);
lcd.setCursor(9,1);
lcd.print(":");
}
if(S>9)
{
lcd.setCursor(10,1);
lcd.print(S);
}
else
{
lcd.setCursor(10,1);
lcd.print("0");
lcd.setCursor(11,1);
lcd.print(S);
lcd.setCursor(12,1);
lcd.print(" ");
}
if(H>9)
{
lcd.setCursor(4,1);
lcd.print (H);
}
else
{
lcd.setCursor(4,1);
lcd.print("0");
lcd.setCursor(5,1);
lcd.print(H);
lcd.setCursor(6,1);
lcd.print(":");
}
if ((H==0)&&(M==0)&&(S==0))//if countdown comes to 0,
{
tone(5, 3000, 3000);
lcd.setCursor(0,0);
lcd.print(" I'ts ");
lcd.setCursor(0,1);
lcd.print("Feeding Time!!!");
Servo1.write(90);//turn servo 90 deg to dispense food
delay(3000);//adjust on the amout of food to be dispensed
Servo1.write(180);//turn servo to 180 deg to stop dispensing of food
lcd.clear();
}
buttonState = digitalRead(manualPin);//override / manual trigger
if (buttonState == LOW)
{
tone(5, 3000, 1000);
lcd.setCursor(0,0);
lcd.print(" OVERRIDE ");
lcd.setCursor(0,1);
lcd.print("(manual feeding)");
Servo1.write(200);//turn servo 90 deg to dispense food
delay(2000);//adjust on the amout of food to be dispensed
Servo1.write(0);//turn servo to 180 deg to stop dispensing of food
lcd.clear();
}
}