//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();
   
 }
 
}
$abcdeabcde151015202530fghijfghij
ATTINY8520PU