Introduction: Automatic Arduino Pet Feeder - 3D Printed (With Stepper Motor)
Hi guys,
I made an automatic 3D Printed Pet Feeder (or just dispenser, but I use it to feed my dog). I 3D modelled all that project. U can print it by yourself. All parts are down there.
Basically how it works, is u type in two Feeding Times, for example 8:30 and 17:30, then when time is right stepper motor enables and feeds your little pet.
Electric Components:
- Stepper Motor NEMA17 - 42HB34F08AB
- Stepper Motor Driver A4988
- Arduino UNO
- Arduino Keypad 4x4
- RTC DS3231 Clock
- LCD Display 16x2
- Step Down Module (I used LM2596S DC/DC) 12V to 5V
- 12V Power Supply
- a lot of wires
Step 1: Printing All Parts
Printing all the parts took me about 5 days. To assemble everything together I used 3mm bolts (m3) and 3mm nuts.
Attachments
Step 2: Electronics
Wire everything like in the circuit. If your LCD screen is too dark or too bright try different values of resistors or play with the voltage regulator.
Step 3: Arduino Code
Arduino Code includes additional libraries: DS3231 RTC, Arduino Keypad 4x4
When you press 'A' - Program asks for first feed time and waits untill you type in HH:MM:SS
When you press 'B' - Program asks for second feed time and waits untill you type in HH:MM:SS
When you press 'C' - Stepper Motor runs for one cycle (one feed)
When you press 'D' - LCD displays current Date
LCD displays normally current Time and hour and minutes of first and second feed time.
All functions are described in code:
#include <DS3231.h> #include <LiquidCrystal.h> #include <Keypad.h> const byte ROWS = 4; const byte COLS = 4; const int stepPin = 10; const int dirPin = A3; 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 }; Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); DS3231 rtc(A4, A5); LiquidCrystal lcd(A0, A1, A2, 11, 12, 13); // (rs, enable, d4, d5, d6, d7) int feed_time = 2000; //define how fast stepper motor works int feed_length = 600; //define how much steps should your motor do (mine does 200 for full spin) String feed1; String feed2; char key[8]; int j = 0; char button; void setup() { rtc.begin(); lcd.begin(16,2); Serial.begin(9600); pinMode(A0, OUTPUT); pinMode(A1, OUTPUT); pinMode(A2, OUTPUT); pinMode(stepPin,OUTPUT); pinMode(dirPin,OUTPUT); } void loop() { lcd.setCursor(0,0); lcd.print("Time: "); lcd.print(rtc.getTimeStr()); lcd.setCursor(0,1); //lcd.print("Date: "); //Date to display //lcd.print(rtc.getDateStr()); lcd.print("1)"); lcd.print(feed1); lcd.setCursor(7,1); lcd.print(" 2)"); lcd.print(feed2); lcd.setCursor(15,1); lcd.print(" "); button = keypad.getKey(); if(button == 'A'){ lcd.clear(); lcd.setCursor(0,0); lcd.print("HH:MM:SS 1st"); delay(500); j = 0; lcd.setCursor(j,1); key[0] = keypad.waitForKey(); lcd.print(key[0]);j++; lcd.setCursor(j,1); key[1] = keypad.waitForKey(); lcd.print(key[1]);j++; lcd.setCursor(j,1); key[2] = ':'; lcd.print(key[2]);j++; lcd.setCursor(j,1); key[3] = keypad.waitForKey(); lcd.print(key[3]);j++; lcd.setCursor(j,1); key[4] = keypad.waitForKey(); lcd.print(key[4]);j++; lcd.setCursor(j,1); key[5] = ':'; lcd.print(key[5]);j++; lcd.setCursor(j,1); key[6] = keypad.waitForKey(); lcd.print(key[6]);j++; lcd.setCursor(j,1); key[7] = keypad.waitForKey(); lcd.print(key[7]); key[8] = '\0'; feed1 = String(key); delay(1000); lcd.clear(); } if(button == 'B'){ lcd.clear(); lcd.setCursor(0,0); lcd.print("HH:MM:SS 2nd"); delay(500); j = 0; lcd.setCursor(j,1); key[0] = keypad.waitForKey(); lcd.print(key[0]);j++; lcd.setCursor(j,1); key[1] = keypad.waitForKey(); lcd.print(key[1]);j++; lcd.setCursor(j,1); key[2] = ':'; lcd.print(key[2]);j++; lcd.setCursor(j,1); key[3] = keypad.waitForKey(); lcd.print(key[3]);j++; lcd.setCursor(j,1); key[4] = keypad.waitForKey(); lcd.print(key[4]);j++; lcd.setCursor(j,1); key[5] = ':'; lcd.print(key[5]);j++; lcd.setCursor(j,1); key[6] = keypad.waitForKey(); lcd.print(key[6]);j++; lcd.setCursor(j,1); key[7] = keypad.waitForKey(); lcd.print(key[7]); key[8] = '\0'; feed2 = String(key); delay(1000); lcd.clear(); } if(button == 'D'){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Time: "); lcd.print(rtc.getTimeStr()); lcd.setCursor(0,1); lcd.print("Date: "); //Date to display lcd.print(rtc.getDateStr()); delay(5000); lcd.clear(); } if(button == 'C'){ digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction for(int x = 0; x < feed_length; x++) { // Makes 200 pulses for making one full cycle rotation digitalWrite(stepPin,HIGH); delayMicroseconds(feed_time); digitalWrite(stepPin,LOW); delayMicroseconds(feed_time); } delay(1000); } if (feed1==rtc.getTimeStr()) { digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction for(int x = 0; x < feed_length; x++) { // Makes 200 pulses for making one full cycle rotation digitalWrite(stepPin,HIGH); delayMicroseconds(feed_time); digitalWrite(stepPin,LOW); delayMicroseconds(feed_time); } delay(1000); } if (feed2==rtc.getTimeStr()) { digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction for(int x = 0; x < feed_length; x++) { // Makes 200 pulses for making one full cycle rotation digitalWrite(stepPin,HIGH); delayMicroseconds(feed_time); digitalWrite(stepPin,LOW); delayMicroseconds(feed_time); } delay(1000); } }
Step 4: Set the Time and Date for DS3231 RTC Module
Here is code for setting the Time and Date in your DS3231 (it includes library like in the previous step) - DS3231 library
The DS3231 SDA ---> A4 in Arduino
The DS3231 SCL ---> A5 in Arduino
When u write that code into arduino, u have to open the serial monitor (115200) and just check if your time and date match.
#include <DS3231.h> // Init the DS3231 using the hardware interface DS3231 rtc(A4, A5); void setup() { // Setup Serial connection Serial.begin(115200); // Initialize the rtc object rtc.begin(); // Write your current time and date to this following lines rtc.setDOW(MONDAY); // Set Day-of-Week to Monday rtc.setTime(12, 0, 0); // Set the time to 12:00:00 (24hr format) rtc.setDate(01, 01, 2014); // Set the date to January 1st, 2014 } void loop() { // Send Day-of-Week Serial.print(rtc.getDOWStr()); Serial.print(" "); // Send date Serial.print(rtc.getDateStr()); Serial.print(" -- "); // Send time Serial.println(rtc.getTimeStr()); // Wait one second before repeating :) delay (1000); }<br>
Attachments
Step 5: Screw Mechanism
U just put a nut in hole and screw it with all your force. It keeps screw and motor shaft together and tight.
3D printing that screw was a little harder than I thought. I'm using Ender 3 and I couldn't print it standing (vertically). Model was just collapsing. The only way, that was working for me, was printing it horizontally with support blocks like on photos.