IKEA 365+ Automatic Kibble Feeder for Pet
Obliczymy ostateczną cenę na podstawie wybranego pliku. Sprawdzisz ją i zaakceptujesz przed płatnością.
Zapisane na tym urządzeniu.
A repairable, feature rich pet feeder using IKEA containers, ESP32 and arduino IOT remote app for scheduled feeding.
- Ocena
- 0 / 5
- Polubienia
- 11
- Pobrania
- 25
- Wydruki
- 0
- Wyświetlenia
- 407
- Oceny
- 0
Aktualizacja u źródła:
Informacje o modelu
- Źródło
- Printables
- Kategoria
- Pets
- Licencja
- Creative Commons — Attribution — Noncommercial — Share Alike
This project originally started out as a fun weekend activity to make something for my cat. I wanted to take on the challenge of building a auto feeder myself—something that could perform just as well as commercial options but at a lower cost.
After more than 10 design iterations and many weekends of tinkering, I shifted my focus toward adding more quality-of-life features to the feeder! There's still room for improvement as with every design, but this is the version I'm finally comfortable sharing with others to try out. I'm also submitting it for the Smart Pet Gadget Contest on Printables—so here’s the first published version of the IKEA 365+ Automatic Kibble Feeder!
Key Features:
Uses IKEA 365+ containers for food storage and bowl.
Lasts about two weeks feeding 80grams/day.
Built-in strap holder to prevent pets from toppling it over.
Small dispensing opening to stop pets from digging for extra food.
Consistent feeding: food is pre-portioned for reliability.
Upcoming Features (Instructions Coming Soon):
Built-in scheduling for feeding times and portions.
Arduino IoT Remote App integration for remote feeding.
Food Storage
I chose the IKEA 365+ 4.2L container for storage and the 750ml container for the bowl to keep the design easy and accessible. They're widely available, affordable, and save time and material compared to printing large bins.
The refilling process is slightly more tedious (you need to unstrap and unlatch), but the feeder is secure—perfect if you have sneaky pets!
I also designed it this way so that you don’t need any power tools to build it—no drilling into containers—making it more accessible to build. Also shoutout to Matereo on Printables for your model on the draw latch! I took inspiration from that design to integrate it into this build.
Strap Holder
Knowing how determined my cats are, I designed a few strap holes at the back of the machine to secure it to other furniture. I use velcro in the strap holder to tie the machine to table or chair legs, but I made the holes larger to accommodate other types of ropes or straps.
Feeder Design
The feeder uses an ESP32 to control an MG996R 360° servo running at 7v to utilise it's maaximum torque for food dispensing. Instead of an auger, food is directed into a portioning chamber rotated into the bowl. A microswitch tells the servo when to stop, ensuring consistent portioning.
Currently, it uses a physical button to trigger feeding. Remote control via the Arduino IoT App is built in but instructions will come later.
Component List:
ESP32
MG996R 360° Servo
19mm Metal Push Button
Micro Limit Switch (approx. 19.7mm x 6.6mm x 17.7mm including lever)
DC005 Power Jack Socket Connector (5.5mm x 2.1mm)
XL4015 Step Down Buck Converter
12V 6A Power Supply (though 12V 3A–4A should be sufficient)
Hardware:
23x M3 x 8mm SHCS
2x M3 x 50mm SHCS
2x M3 x 40mm SHCS
2x M2 x 7mm SHCS
4x self-tapping screws (comes with the MG996R servo)
EVA foam tape 10mm by 2mm - 6mm thick (Depends how tight you want your latch to be)
(If you’ve built a Voron printer before, you’ll probably have most these!)
Printing Specifications:
3 layers wall/bottom
4 layers top
20% cubic infill
Some parts need support (marked "Requires Support" on STLs)
Please print the “blade” out of TPU while the rest can be printed in PLA. This is to help prevent the kibble from jamming the machine.
Design for Assembly
Each prototype brought improvements—new features, simplified assembly steps, and a focus on repairability and printability. Truth to be told, I feel really bad about all the failed prototype and broken parts lying around the house, so it was a deliberate choice to use screws as the method of assembly to make parts easier to replace.
Instead of reprinting an entire large assembly, I can simply swap out a small section, saving both time and materials.
Most of the screw holes that you see in the design uses the brass inserts to ensure that it can be dissasembled without stripping the threading except for the following parts:
- The entire draw latch assembly and its attachment to the main body
- Attachment of Midplate and Divider Chamber to Hopper
- The entire blade and clicker assembly to the Servo
Those parts are either too small or rarely taken apart, so I've decided to save some brass inserts there.
Some soldering is required to connect the power socket and microswitch. You’ll notice in my photos that I was still using prototype boards and crocodile clips, but for a proper build, I recommend soldering the connections.
Assembly Guide
First align and screw in the midplate to the hopper unit (the side with the indentation faces away from the IKEA food container) using four M3 * 8mm screws. Then align and attach the main body onto the hopper and midplate using four M3 * 8mm screws.
Below where the food container sits, should be a step to attach EVA foam tape. I use 2mm EVA foam but you may use thicker ones for tighten fit. Screw in the hook and latch using the M3 * 40mm and 50mm screws to the latch holder (LH) before using the M3 * 8mm screws to attach it to the main body. Repeat for both left and right side.
Your MG996R servo should come with some self tapping screws, rubber spacer and plastic attachments for the gear. We'll be using the circle attachment and sandwich the coupler clicker and blader holder between it. The M2 screws should be able to go in with some gentle force. Push the attachment into the servo gear before using the self tapping screws to attach onto the chamber cover.
Attach the chamber using four M3 * 8mm screws to the hopper unit. Insert the blade holder into the blade and put it into the chamber before putting on the chamber cover. Attach the push button onto the front plate with the given nut.
Since the bowl retention tabs are adjusted, feel free to position it along the pill shaped slots to find the best position before attaching the front plate to the main housing using two M3 * 8mm screws. Remeber to use the printable spacer! Otherwise there would be too much space between the retention tab and front plate
Finally, the power socket should be able to fit onto the bottom plate with friction. I'll just be using some tape to prevent it from coming up for now. There should be plenty of room to place your electronics in the housing. Fasten the four final M3 * 8mm screws to the bottom to complete the build.
Optionally, you put more EVA foam on the bottom of the machine to get some grip.
Wiring Guide
To make things easier, I used a breadboard to connect all the ground and enable all components to receive power from the XL4015 output.

Software & Coding
As for the software, I've included the basic code that uses the physical button to run the servo at the moment. Arduino IOT remote app requires more codes which I'm still working out on how to share effectively. I’m not an expert coder—in fact, I had zero coding background when I started. I relied heavily on ChatGPT and online tutorials to put the code together. If you spot areas where the code can be improved, feel free to modify and share!
Code is included at the bottom of the page!
Development Note
Over the course of more than half a year, the biggest challenges were selecting the right motor and power supply, and refining the design to ensure consistent, reliable kibble dispensing.
Earlier in development, I also experimented with using an ESP32-CAM module to monitor the feeder remotely, but due to its poor image quality and complexity, I decided to just buy a separate TP-Link CCTV camera, which worked much better for keeping an eye on my pet.
For power, I initially tried a 5V 3A supply, but it wasn’t strong enough to drive the MG996R under load reliably. I later switched to a 12V 6A supply, which in hindsight may have been overkill—I did not test it myself but I believe 12V 3A or 12V 4A would likely be sufficient with enough headroom for stalling. According to chatgpt, the MG996R can draw up to 2.5A and the ESP32 needs about 500mA. Since I use the XL4015 to step down and run everything at 7V, the PSU is able to provide around 9A. Again, little to no background in electrical. Most of this came from chatgpt, so please take it with a grain of salt and stay safe!
Thank you for checking out my project!
I hope you enjoy building it as much as I did and feel free to drop any questions you may have!🐾
I'm considering making a video to show the build and process better. Coming soon!
If you like what I'm doing and want to support future projects, click here to buy me a coffee!☕ Thank you! 🙏
#include <ESP32Servo.h>const int buttonStartPin = 14;
const int buttonStopPin = 12;
const int servoPin = 13;
Servo myServo;
bool servoRunning = false;
unsigned long startTime = 0;
const unsigned long failSafeTime = 8000; // Fail-safe: max run time 8 sec
volatile bool stopButtonPressed = false;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 200;
int servoSpeed = 85;
int stopCount = 4; // Example default value
volatile int stopTriggerCount = 0;
void IRAM_ATTR stopServoISR() {
stopButtonPressed = true;
}
void setup() {
Serial.begin(9600);
pinMode(buttonStartPin, INPUT_PULLUP);
pinMode(buttonStopPin, INPUT_PULLUP);
myServo.setPeriodHertz(50); // Set servo PWM frequency
myServo.attach(servoPin);
myServo.write(90); // Neutral position (stop)
attachInterrupt(digitalPinToInterrupt(buttonStopPin), stopServoISR, FALLING);
Serial.println("System Initialized (No WiFi, No Cloud)");
}
void loop() {
handleButtonControls();
}
void handleButtonControls() {
bool startButtonPressed = (digitalRead(buttonStartPin) == LOW);
if (stopButtonPressed && (millis() - lastDebounceTime > debounceDelay)) {
stopButtonPressed = false;
lastDebounceTime = millis();
stopTriggerCount++;
Serial.println("[Stop Button] Trigger Count: " + String(stopTriggerCount));
if (stopTriggerCount >= stopCount) {
stopServo();
}
}
if (startButtonPressed && !servoRunning) {
stopTriggerCount = 0;
startServo();
}
if (servoRunning && (millis() - startTime >= failSafeTime)) {
stopServo();
}
}
void startServo() {
stopTriggerCount = 0;
myServo.write(servoSpeed); // Move servo
servoRunning = true;
startTime = millis();
Serial.println("[Servo] Dispensing started");
}
void stopServo() {
myServo.write(90); // Stop servo
servoRunning = false;
Serial.println("[Servo] Dispensing stopped");
}