Why I built it: my cat had a strong opinion that 5am is breakfast time. I have a strong opinion that it isn't. The feeder mediates.
Mechanical
- Started from a $15 plastic cereal dispenser from a kitchen store.
- Removed the manual crank and 3D-printed a coupling that fits over the dispenser shaft on one end and a continuous-rotation servo horn on the other.
- Mounted the servo to the side of the dispenser with a printed bracket.
- The whole assembly screws onto a wooden base so it doesn't tip over when the cat tries to 'help'.
Electronics
- ESP32 DevKit V1 (Wi-Fi for NTP, deep sleep between meals)
- MG996R continuous-rotation servo — high torque, can move stiff kibble
- 5V/2A power supply (the servo can briefly pull 1.5A under stall)
- A small OLED for status (optional but nice)
Why continuous-rotation: a standard servo only sweeps 180°. We need a complete revolution every meal, so it's either a CR servo or a small geared DC motor.
Schedule logic
1. ESP32 connects to Wi-Fi, syncs time with pool.ntp.org via configTime().
2. Computes seconds-until-next-meal (e.g. 7:30am and 6:00pm).
3. Goes into deep sleep using esp_sleep_enable_timer_wakeup().
4. On wake, runs the servo for the calibrated duration (mine = 1.4s, gives one full revolution = ~30g of kibble).
5. Re-computes and sleeps again.
Calibration: weigh 5 dispensing cycles, divide by 5, adjust servo run-time until you hit the desired grams-per-meal. Mine drifts by about ±2g/meal — fine for a cat.
Safety features
- Maximum servo run-time hard-coded to 3s, so if something jams it can't drain the hopper.
- A weekly self-test that runs the servo for 0.1s and verifies current draw — flags 'stuck' over MQTT if no current is seen.
Two meals a day, perfectly timed, no more 5am wake-ups. Cat is finally impressed (or at least resigned).