Today we are building an Arduino based Automatic Pet Feeder which can automatically serve food to your pet timely. It has a DS3231 RTC (Real Time Clock) Module, which used to set time and date on which your pet should be given food. So, by setting up the time according to your pet’s eating schedule, the device drop or fill the food bowl automatically.
In this circuit, we are using a 16*2 LCD to display the time using DS3231 RTC Module with Arduino UNO. Also, a servo motor is used to rotate the containers to provide the food and 4*4 matrix keypad to manually set up the time for feeding the Pet. You can set the rotation angle and container opening duration according to the quantity of food you want to serve to your pet. The quantity of food may also depend upon your pet whether it’s a dog, cat or bird.
Material Required
- Arduino UNO
- 4*4 Matrix Keypad
- 16*2 LCD
- Push Button
- Servo Motor
- Resistor
- Connecting Wires
- Breadboard
Circuit Diagram
In this Arduino based Cat Feeder, for Getting Time and Date, we have used RTC (Real Time Clock) Module. We have used the 4*4 Matrix Keypad to set the Pet’s eating time manually with the help of 16x2 LCD. The Servo motor rotates the container and drop the food on the time set by the user. The LCD is used for displaying the Date and Time. Complete working can be found in the Video given at the end.
3D-Printed Pet Feeder Model
We have designed this Arduino Pet Feeder container using the 3D-printer. You can also print the same design by downloading the files from here. The material used for printing this model is PLA. It has four Parts as shown in the image below:
Assemble the four parts and connect the Servo Motor as shown in the picture below:
If you are new to 3D printing here is the starting guide. You can download the STL files for this pet feeder here.
DS3231 RTC Module
DS3231 is a RTC (Real Time Clock) module. It is used to maintain the date and time for most of the Electronics projects. This module has its own coin cell power supply using which it maintains the date and time even when the main power is removed or the MCU has gone through a hard reset. So once we set the date and time in this module it will keep track of it always. In our circuit, we are using DS3231 to feed the pet according to the time, set up by the Pet’s owner, like an alarm. As, clock reaches to the set time, it operates the servo motor to open the container gate and the food drops in the Pet’s food bowl.
Note: When using this module for the first time you have to set the date and time. You can also use RTC IC DS1307 for reading the time with Arduino.
Code and Explanation
Automatics Pet Feeder’s Complete Arduino Code is given at the end.
Arduino have default libraries for using the Servo motor and LCD 16*2 with it. But for using DS3231 RTC Module and 4*4 Matrix Keypad with the Arduino, you have to download and install the libraries. The download link for both the libraries is given below:
In the below code, we are defining libraries, “#include <DS3231.h>” for RTC module, “#include <Servo.h>” for Servo Motor, “#include <LiquidCrystal.h>” for 16*2 LCD, and “#include <Keypad.h>” for 4*4 Matrix Keypad.
#include <DS3231.h> #include <Servo.h> #include <LiquidCrystal.h> #include <Keypad.h>
In the below code, we are defining the keymap for the 4*4 matrix keypad and assigning the Arduino pins for the Row and Columns of keypad.
char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = { 2, 3, 4, 5 }; byte colPins[COLS] = { 6, 7, 8, 9 };
Here, we are creating the keypad by using the command below in the code.
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
Assigning A4 and A5 Arduino pins to connect with SCL and SDA pins of DS3231. Also, assigning pins to the LCD and initializing the Servo motor.
DS3231 rtc(A4, A5); Servo servo_test; //initialize a servo object for the connected servo LiquidCrystal lcd(A0, A1, A2, 11, 12, 13); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
In the below code, we are declaring the t1 to t6, key, and array r[6], and the feed.
int t1, t2, t3, t4, t5, t6; boolean feed = true; char key; int r[6];
In the below code, we are setting up all the components for the start. Like in this code “servo_test.attach(10);” Servo is attached to the 10th pin of the Arduino. Defining A0, A1 and A2 as the Output Pin and initializing LCD and RTC module.
void setup() { servo_test.attach(10); // attach the signal pin of servo to pin9 of arduino rtc.begin(); lcd.begin(16,2); servo_test.write(55); Serial.begin(9600); pinMode(A0, OUTPUT); pinMode(A1, OUTPUT); pinMode(A2, OUTPUT); }
Now, how the loop is working is the important part to understand. Whenever the Pushbutton is pressed, it goes high means 1, which can be read by “buttonPress = digitalRead(A3)”. Now it goes inside ‘if’ statement and calles the ‘setFeedingTime’ function. Then it compares the real time and the entered time by the user. If the condition is true which means the real time and the entered time is same, then the Servo motor rotates to and angle of 100 degree and after 0.4seconds of delay it comes back to its initial position.
void loop() { lcd.setCursor(0,0); int buttonPress; buttonPress = digitalRead(A3); if (buttonPress==1) setFeedingTime(); lcd.print("Time: "); String t = ""; t = rtc.getTimeStr(); t1 = t.charAt(0)-48; t2 = t.charAt(1)-48; t3 = t.charAt(3)-48; t4 = t.charAt(4)-48; t5 = t.charAt(6)-48; t6 = t.charAt(7)-48; lcd.print(rtc.getTimeStr()); lcd.setCursor(0,1); lcd.print("Date: "); lcd.print(rtc.getDateStr()); if (t1==r[0] && t2==r[1] && t3==r[2] && t4==r[3]&& t5<1 && t6<3 && feed==true) { servo_test.write(100); //command to rotate the servo to the specified angle delay(400); servo_test.write(55); feed=false; } }
In the void setFeedingTime() function code, After pressing the pushbutton we are able to enter the pet feeding time, then we have to Press ‘D’ to save that time. When the saved time matches with real time then servo start rotating.
void setFeedingTime() { feed = true; int i=0; lcd.clear(); lcd.setCursor(0,0); lcd.print("Set feeding Time"); lcd.clear(); lcd.print("HH:MM"); lcd.setCursor(0,1); while(1){ key = kpd.getKey(); char j; if(key!=NO_KEY){ lcd.setCursor(j,1); lcd.print(key); r[i] = key-48; i++; j++; if (j==2) { lcd.print(":"); j++; } delay(500); } if (key == 'D') {key=0; break; } } }
Working of the Automatic Pet Feeder
After uploading the code to the Arduino Uno, the time and date will be displayed on the 16*2 LCD. When you pressed the pushbutton it asks for Pet’s feeding time and you have to enter the time using the 4*4 matrix Keypad. Display will show the entered time and as you press ‘D’ it saves the time. When the real time and the Entered time matches, it rotates the servo motor from its initial position 55⁰ to 100⁰ and after a delay again return to its initial position. Therefore, Servo motor is connected to the Food Container gate, so as it moves, the gate will open and some amount of food falls in the bowl or plate. After a delay 0.4 seconds Servo motor rotates again and close the gate. The whole process completes within a few seconds. This is how your pet get the food automatically on the time you entered.
Change time and degree according to food
#include <DS3231.h>
#include <Servo.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Three columns
// Define the Keymap
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 2, 3, 4, 5 };
// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = { 6, 7, 8, 9 };
// Create the Keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
DS3231 rtc(A4, A5);
Servo servo_test; //initialize a servo object for the connected servo
LiquidCrystal lcd(A0, A1, A2, 11, 12, 13); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
//int angle = 0;
// int potentio = A0; // initialize the A0analog pin for potentiometer
int t1, t2, t3, t4, t5, t6;
boolean feed = true; // condition for alarm
char key;
int r[6];
void setup()
{
servo_test.attach(10); // attach the signal pin of servo to pin9 of arduino
rtc.begin();
lcd.begin(16,2);
servo_test.write(55);
Serial.begin(9600);
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
}
void loop()
{
lcd.setCursor(0,0);
int buttonPress;
buttonPress = digitalRead(A3);
if (buttonPress==1)
setFeedingTime();
//Serial.println(buttonPress);
lcd.print("Time: ");
String t = "";
t = rtc.getTimeStr();
t1 = t.charAt(0)-48;
t2 = t.charAt(1)-48;
t3 = t.charAt(3)-48;
t4 = t.charAt(4)-48;
t5 = t.charAt(6)-48;
t6 = t.charAt(7)-48;
lcd.print(rtc.getTimeStr());
lcd.setCursor(0,1);
lcd.print("Date: ");
lcd.print(rtc.getDateStr());
if (t1==r[0] && t2==r[1] && t3==r[2] && t4==r[3]&& t5<1 && t6<3 && feed==true)
{
servo_test.write(100); //command to rotate the servo to the specified angle
delay(400);
servo_test.write(55);
feed=false;
}
}
void setFeedingTime()
{
feed = true;
int i=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Set feeding Time");
lcd.clear();
lcd.print("HH:MM");
lcd.setCursor(0,1);
while(1){
key = kpd.getKey();
char j;
if(key!=NO_KEY){
lcd.setCursor(j,1);
lcd.print(key);
r[i] = key-48;
i++;
j++;
if (j==2)
{
lcd.print(":"); j++;
}
delay(500);
}
if (key == 'D')
{key=0; break; }
}
}
Comments
display error
gave all the connections properly and display still shows black box without any letters
Adjust the contrast of the
Adjust the contrast of the LCD. Also check if connections are made properly
is that code is right?? i try
is that code is right?? i try to install it in arduino but its fail.
some of the codes i'm trying
some of the codes i'm trying to upload but i get errors!!Pls help!!
You probably typed it in
You probably typed it in wrong. Check again.
Check if the contrast levels
Check if the contrast levels are all fine
What do I have to change in
What do I have to change in the code if I am using a I2C LCD Display instead of the normal 16 pin one like in this example?
Excuse me what meaning the
Excuse me what meaning the number 48 has in setting the time.
I'm sorry. We added a
I'm sorry. We added a potentiometer to adjust the contrast of the LCD, but the words are still very light/cannot be seen. In addition, we cannot change the date. How do we fix this problem? Our project is due soon so any help is appreciated!! Thank you! :)
breadboard
does anyone have a picture of their board and arduino with their wiring?
Follow the circuit digram
Follow the circuit digram guys, its the best way to get it done. Dont relay on wiring pictures.
Some of the codes I'm trying
Some of the codes I'm trying to upload but i get errors...Pls help!!
why your data can't verify on
why your data can't verify on arduino uno. have problem on your data please help me i need your help. i want to do this projek for my final year project
What problem are you having?
What problem are you having? only if you brief that people here might be able to help.
How could I put more "times"?
How could I put more "times"? like 2 meals
Not accessing the code
I need your help because when i write this code it has errors throught
People here can help you only
People here can help you only if you brief them with your problems
Can I program several feeding
Can I program several feeding times a day, or only once?
You can easily tweak the
You can easily tweak the Arduino code to feed several times a day
Please Guide Me...
Please guide me how can I tweak the Arduino code to feed several times. I made a tweak and it's not working. That's why I need the guide line. Please help me to feed my cat with this. Please.
value of required resistors
what are the values of required resistors
value of required resistors
i can not see the colors clearly. what is the value of the resistors?
thanks
These are just pull-up and
These are just pull-up and pull-down resistors use 4.7K for both and will work fine
HELP ERROR CODES
DS3231 rtc(A4, A5);
- I am having a trouble with this line in the code
The Error says:
WARNING: Category 'Real-time clock' in library DS3231 is not valid. Setting to 'Uncategorized'
PUSH_BUTTON_KEYPAD_LCD_RTC_SERVO:36: error: no matching function for call to 'DS3231::DS3231(const uint8_t&, const uint8_t&)'
DS3231 rtc(SDA, SCL);
^
C:\Users\Acaer\Documents\Arduino\PUSH_BUTTON_KEYPAD_LCD_RTC_SERVO\PUSH_BUTTON_KEYPAD_LCD_RTC_SERVO.ino:36:21: note: candidates are:
In file included from C:\Users\Acaer\Documents\Arduino\PUSH_BUTTON_KEYPAD_LCD_RTC_SERVO\PUSH_BUTTON_KEYPAD_LCD_RTC_SERVO.ino:1:0:
C:\Users\Acaer\Documents\Arduino\libraries\DS3231/DS3231.h:64:3: note: DS3231::DS3231()
DS3231();
^
C:\Users\Acaer\Documents\Arduino\libraries\DS3231/DS3231.h:64:3: note: candidate expects 0 arguments, 2 provided
C:\Users\Acaer\Documents\Arduino\libraries\DS3231/DS3231.h:60:7: note: constexpr DS3231::DS3231(const DS3231&)
class DS3231 {
^
C:\Users\Acaer\Documents\Arduino\libraries\DS3231/DS3231.h:60:7: note: candidate expects 1 argument, 2 provided
C:\Users\Acaer\Documents\Arduino\libraries\DS3231/DS3231.h:60:7: note: constexpr DS3231::DS3231(DS3231&&)
C:\Users\Acaer\Documents\Arduino\libraries\DS3231/DS3231.h:60:7: note: candidate expects 1 argument, 2 provided
C:\Users\Acaer\Documents\Arduino\PUSH_BUTTON_KEYPAD_LCD_RTC_SERVO\PUSH_BUTTON_KEYPAD_LCD_RTC_SERVO.ino: In function 'void setup()':
PUSH_BUTTON_KEYPAD_LCD_RTC_SERVO:55: error: 'class DS3231' has no member named 'begin'
rtc.begin();
^
C:\Users\Acaer\Documents\Arduino\PUSH_BUTTON_KEYPAD_LCD_RTC_SERVO\PUSH_BUTTON_KEYPAD_LCD_RTC_SERVO.ino: In function 'void loop()':
PUSH_BUTTON_KEYPAD_LCD_RTC_SERVO:80: error: 'class DS3231' has no member named 'getTimeStr'
t = rtc.getTimeStr();
^
PUSH_BUTTON_KEYPAD_LCD_RTC_SERVO:88: error: 'class DS3231' has no member named 'getTimeStr'
lcd.print(rtc.getTimeStr());
^
PUSH_BUTTON_KEYPAD_LCD_RTC_SERVO:91: error: 'class DS3231' has no member named 'getDateStr'
lcd.print(rtc.getDateStr());
^
Multiple libraries were found for "Servo.h"
Used: C:\Users\Acaer\Documents\Arduino\libraries\Servo
Not used: C:\Program Files (x86)\Arduino\libraries\Servo
exit status 1
no matching function for call to 'DS3231::DS3231(const uint8_t&, const uint8_t&)'
.
.
..
pls help me asap, badly need to solve this error
The problem is with your
The problem is with your library. You can the wrong or duplicate library, so uninstall all related libraries and use the one given in this article
I try it but it always shows
I try it but it always shows this error:
exit status 1
'DS3231' does not name a type
HELP
Can you help me?
What if I want to set 2x what can I do?
...
...
I try this code but after I set the time, it doesnt return to the time and date.
feed = true;
int i=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Set feeding Time");
lcd.clear();
lcd.print("HH:MM");
lcd.setCursor(0,1);
while(1){
key = kpd.getKey();
char j;
if(key!=NO_KEY){
lcd.setCursor(j,1);
lcd.print(key);
r[i] = key-48;
i++;
j++;
if (j==2)
{
lcd.print(":"); j++;
}
delay(500);
}
if (key == 'A')
{key=0; break; }
}
//............................
feed = true;
int u=0
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Set feeding Time");
lcd.clear();
lcd.print("HH:MM");
lcd.setCursor(0,1);
while(1){
key = kpd.getKey();
char j;
if(key!=NO_KEY){
lcd.setCursor(j,1);
lcd.print(key);
r[u] = key-48;
i++;
j++;
if (j==2)
{
lcd.print(":"); j++;
}
delay(500);
}
if (key == 'B')
{key=0; break; }
}
lcd showing black boxs how
lcd showing black boxs how can i solve it
If it is showing black boxes
If it is showing black boxes then it means the LCD is working, try adjusting the contrast value using potentiometer. Also check if the data pin connection are done properly
thanks it work, i had to make
thanks it work, i had to make some small changes,
How did you do the code to
How did you do the code to fix black boxes?
software to be use
what software application is using to apply the code?
Black boxes are not a problem
Black boxes are not a problem, it means that the LCD is initialized by did not receive any data to display.
If you are getting black boxes even after trying to display something on the LCD, then it means you have set the contrast level high, reduce it using the potentiometer
Can someone explain why there
Can someone explain why there is -48 when getting the time
how can i program it i want
how can i program it i want to set it up at once but multiple sched? like 3 meals
Query on the Code
Hi Sir!
After pressing the "setFeedingTime" button, during the 2nd press of # in the keypad, the 1st char seems to be replaced by the 2nd char. Supposedly, it will follow the (j,1) position so it will be printed right after the first char. The colon(:) sign will not be printed on lcd even if the condition "if (j==2)" is met.
And also, when i press the "setFeedingTime" button again, the starting position of char j seems to be moving to the right portion of (j,l) as the start point.
I've followed all the connections above.
Hope somebody could help me on this.
Thank you very much.
Liquid filling machine
Hello Sir,
Can you do liquid filling machine with keypad?
Thanks for sharing...
Thanks for sharing...
I'm new in this area and I bought the LCD with I2C and the circuit diagram must change, someone made this with type of configuration like this?.
Thanks a lot.
I have an error with the
I have an error with the coding. it keeps a display like below for the #include <keypad.h>
4:10: fatal error: DS3231.h: No such file or directory exit status 1
use #include <DS3231.h> this
use #include <DS3231.h> this library , i think you are missing this library or you dont have this library in you arduino IDE software. Download DS3231.h library and include library in sketch section of arduino IDE
how to set the time example i
how to set the time example i want my date in 20 august 2021 ??
DS3231 RTC sensor will
DS3231 RTC sensor will provide you real time and date
please help me with this…
please help me with this error i m really stuck with this error from 2 days
smart_pet_feeder:56:19: error: no matching function for call to 'DS3231::DS3231(const uint8_t&, const uint8_t&)'
DS3231 rtc(A4, A5);
^
In file included from C:\Users\admin\Desktop\SEM 5\IOT\ca2\smart_pet_feeder\smart_pet_feeder.ino:1:0:
C:\Users\admin\Downloads\arduino-1.8.19-windows\arduino-1.8.19\libraries\DS3231/DS3231.h:67:3: note: candidate: DS3231::DS3231(TwoWire&)
DS3231(TwoWire & w);
^~~~~~
C:\Users\admin\Downloads\arduino-1.8.19-windows\arduino-1.8.19\libraries\DS3231/DS3231.h:67:3: note: candidate expects 1 argument, 2 provided
C:\Users\admin\Downloads\arduino-1.8.19-windows\arduino-1.8.19\libraries\DS3231/DS3231.h:66:3: note: candidate: DS3231::DS3231()
DS3231();
^~~~~~
C:\Users\admin\Downloads\arduino-1.8.19-windows\arduino-1.8.19\libraries\DS3231/DS3231.h:66:3: note: candidate expects 0 arguments, 2 provided
C:\Users\admin\Downloads\arduino-1.8.19-windows\arduino-1.8.19\libraries\DS3231/DS3231.h:62:7: note: candidate: constexpr DS3231::DS3231(const DS3231&)
class DS3231 {
^~~~~~
C:\Users\admin\Downloads\arduino-1.8.19-windows\arduino-1.8.19\libraries\DS3231/DS3231.h:62:7: note: candidate expects 1 argument, 2 provided
C:\Users\admin\Downloads\arduino-1.8.19-windows\arduino-1.8.19\libraries\DS3231/DS3231.h:62:7: note: candidate: constexpr DS3231::DS3231(DS3231&&)
C:\Users\admin\Downloads\arduino-1.8.19-windows\arduino-1.8.19\libraries\DS3231/DS3231.h:62:7: note: candidate expects 1 argument, 2 provided
C:\Users\admin\Desktop\SEM 5\IOT\ca2\smart_pet_feeder\smart_pet_feeder.ino: In function 'void setup()':
smart_pet_feeder:87:7: error: 'class DS3231' has no member named 'begin'
rtc.begin();
^~~~~
Using library DS3231 at version 1.1.0 in folder: C:\Users\admin\Downloads\arduino-1.8.19-windows\arduino-1.8.19\libraries\DS3231
Using library Wire at version 1.0 in folder: C:\Users\admin\Downloads\arduino-1.8.19-windows\arduino-1.8.19\hardware\arduino\avr\libraries\Wire
Using library Servo at version 1.1.8 in folder: C:\Users\admin\Downloads\arduino-1.8.19-windows\arduino-1.8.19\libraries\Servo
Using library LiquidCrystal at version 1.0.7 in folder: C:\Users\admin\Downloads\arduino-1.8.19-windows\arduino-1.8.19\libraries\LiquidCrystal
Using library Keypad-3.1.1 at version 3.1.1 in folder: C:\Users\admin\Downloads\arduino-1.8.19-windows\arduino-1.8.19\libraries\Keypad-3.1.1
exit status 1
no matching function for call to 'DS3231::DS3231(const uint8_t&, const uint8_t&)'
i have used correct and…
i have used correct and dwonloaded with the same link you provided above
can i know once we set the…
can i know once we set the time feeding, we need to set another time or it will repeat the time that we set
Hello sir, please help.. Im…
Hello sir, please help.. Im doing this project except that I'm using i2c 16x2 lcd, and set feeding time using keypad only, I tried to modified the code, but failed.. Upom analyzing your code, what is the -48 in the code, can someone please explain? Thank you, I badly need help on this...
What an innovation. Salute your creativity :)