Умная кормушка для кота на ESP32: кормим питомца по расписанию

Пошаговый проект умной кормушки для кота на ESP32 с Wi-Fi и веб-интерфейсом. Собираем своими руками: схема, код, сборка. Автоматическое кормление по расписанию.
Всем привет! Сегодня мы соберём проект, который лежит на стыке DIY-электроники и заботы о домашних любимцах — автоматическую кормушку для кота на базе ESP32. Если вы, как и я, иногда задерживаетесь на работе или просто хотите обеспечить своему пушистому другу стабильный график питания, этот проект для вас. Мы не просто подключим мотор к таймеру, а создадим умное устройство с Wi-Fi, веб-интерфейсом и возможностью интеграции в экосистему умного дома. Всё это — на доступной и популярной платформе ESP32.
Зачем это нужно? Больше, чем просто «миска с таймером»
Поначалу идея может показаться простой: крути мотор в заданное время — и дело в шляпе. Но на практике автоматическая кормушка решает несколько важных задач:
- Стабильный график. Кошки — создания привычки. Кормление в одно и то же время улучшает их самочувствие и дисциплинирует.
- Контроль порций. Особенно актуально для котов на диете или склонных к перееданию. Дозатор выдаст ровно столько, сколько вы запрограммируете.
- Ваше спокойствие. Можно смело уехать на выходные, не прося соседей заглядывать для кормёжки (конечно, при условии наличия запаса корма и воды).
- Удалённое управление. Забыли выставить расписание? Дайте команду через телефон из любой точки мира.
- Фундамент для «умного» питомника. К кормушке можно добавить датчики веса, видеокамеру или датчик присутствия, создав полноценную экосистему.
В этом проекте мы пойдём дальше базового таймера и научим ESP32 работать как веб-сервер, чтобы настраивать расписание через браузер.
Что нам понадобится: железо и софт
Компоненты
- Плата ESP32 (любая, например, ESP32 DevKit V1). Сердце проекта, отвечает за логику и подключение к Wi-Fi.
- Сервопривод SG90 или MG90S. Он будет поворачивать дозатор. SG90 — самый популярный и бюджетный вариант.
- Пластиковый контейнер или готовая ёмкость для корма. Подойдёт любая герметичная банка с широким горлышком.
- Крышка от бутылки/пластиковый винт/3D-печатная деталь. Это будет наш «шнек» или заслонка, которую прикрепим к сервоприводу для дозирования.
- Макетная плата и провода «папа-папа». Для удобства монтажа на этапе прототипирования.
- Блок питания 5V 2A и кабель Micro-USB. Для питания ESP32 и сервопривода.
- Корпус. Можно использовать пластиковую коробку для электроники, чтобы спрятать «начинку».
Программное обеспечение
- Arduino IDE или PlatformIO. Я буду показывать код в Arduino IDE, как в более простом для начала варианте.
- Библиотеки для Arduino IDE:
ESPAsyncWebServer(для удобного веб-сервера)AsyncTCP(зависимость для предыдущей библиотеки)ESP32Servo(для работы с сервоприводом на ESP32)
Собираем схему: от прототипа к устройству
Схема очень проста. Главное — правильно подключить сервопривод. * Красный провод (VCC) сервопривода -> к контакту 5V на ESP32. * Коричневый/чёрный провод (GND) -> к любому контакту GND на ESP32. * Жёлтый/оранжевый провод (Signal) -> к GPIO 13 на ESP32 (этот пин можно изменить в коде, если нужно).
Важный момент по питанию: При работе сервопривод создаёт скачки напряжения. Если он у вас крупный (MG996R) или вы подключаете несколько, питайте его от отдельного источника 5В, соединив «земли» (GND) ESP32 и этого источника. Для нашего SG90, питающегося от ESP32, всё должно работать стабильно.
Пишем прошивку: логика, веб-сервер и расписание
Создаём новый скетч в Arduino IDE. Не забудьте в Инструменты > Плата выбрать свою модель ESP32 и указать правильный порт.
1. Подключаем библиотеки и задаём константы
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <ESP32Servo.h>
// Замените на данные вашей Wi-Fi сети
const char* ssid = "ВАШ_SSID";
const char* password = "ВАШ_ПАРОЛЬ";
// Создаём объекты сервопривода и веб-сервера
Servo myServo;
AsyncWebServer server(80); // Сервер будет слушать 80-й порт
// Пины и переменные
const int servoPin = 13;
int feedHour = 8; // Час кормления по умолчанию
int feedMinute = 0; // Минута кормления по умолчанию
int lastFeedDay = 0; // День последнего кормления (чтобы кормить 1 раз в сутки)
Комментарий: Мы используем асинхронный веб-сервер (AsyncWebServer), который не блокирует выполнение кода во время ожидания запросов. Это важно для стабильной работы таймера.
2. Функция кормления и HTML-интерфейс
Создадим функцию, которая будет вызываться для выдачи порции. Сервопривод повернётся на заданный угол, задержатся, и вернётся обратно.
void feedCat() {
Serial.println("Кормление...");
myServo.write(90); // Поворачиваем сервопривод на 90 градусов
delay(1000); // Ждём, пока корм высыплется
myServo.write(0); // Возвращаем в исходное положение
lastFeedDay = day(); // Запоминаем день последнего кормления
}
// Далее в коде объявим строку с HTML-кодом нашей веб-страницы.
// Она будет содержать форму для установки времени и кнопку ручного кормления.
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML>
<html>
<head>
<title>Умная кормушка</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>Управление кормушкой</h1>
<p>Текущее время на устройстве: %TIME%</p>
<p>Последнее кормление: %LASTFEED%</p>
<form action="/set">
<label>Установите время кормления (раз в сутки):</label><br>
Часы: <input type="number" name="hour" min="0" max="23" value="%FEEDHOUR%">
Минуты: <input type="number" name="minute" min="0" max="59" value="%FEEDMINUTE%">
<input type="submit" value="Сохранить">
</form>
<br>
<button onclick="manualFeed()">Накормить сейчас!</button>
<script>
function manualFeed() {
fetch('/manual');
alert('Команда на кормление отправлена!');
}
</script>
</body>
</html>
)rawliteral";
3. Настройка Wi-Fi, сервера и логики в setup()
void setup() {
Serial.begin(115200);
myServo.attach(servoPin);
// Подключаемся к Wi-Fi
WiFi.begin(ssid, password);
Serial.print("Подключение к WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("IP-адрес: ");
Serial.println(WiFi.localIP()); // Выводим IP-адрес в монитор порта
// Настраиваем маршруты веб-сервера
// Главная страница
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
// Динамически подставляем значения в HTML
String html = String(index_html);
html.replace("%TIME%", getTimeString());
html.replace("%LASTFEED%", String(lastFeedHour) + ":" + String(lastFeedMinute));
html.replace("%FEEDHOUR%", String(feedHour));
html.replace("%FEEDMINUTE%", String(feedMinute));
request->send(200, "text/html", html);
});
// Маршрут для установки нового времени
server.on("/set", HTTP_GET, [](AsyncWebServerRequest *request){
if (request->hasParam("hour") && request->hasParam("minute")) {
feedHour = request->getParam("hour")->value().toInt();
feedMinute = request->getParam("minute")->value().toInt();
request->send(200, "text/plain", "Время обновлено! Кормление в " + String(feedHour) + ":" + String(feedMinute));
}
});
// Маршрут для ручного кормления
server.on("/manual", HTTP_GET, [](AsyncWebServerRequest *request){
feedCat();
request->send(200, "text/plain", "Кормление...");
});
server.begin(); // Запускаем сервер
}
Комментарий: Обработчики маршрутов (server.on) — это функции, которые срабатывают, когда пользователь переходит по определённому адресу (например, http://192.168.1.100/set?hour=20&minute=30).
4. Проверка времени в главном цикле loop()
void loop() {
// Получаем текущее время с помощью встроенных функций
int currentHour = hour();
int currentMinute = minute();
int currentDay = day();
// Проверяем, наступило ли время кормления И не кормили ли мы сегодня
if (currentHour == feedHour && currentMinute == feedMinute && currentDay != lastFeedDay) {
feedCat();
}
delay(30000); // Проверяем время каждые 30 секунд (не нужно делать это слишком часто)
}
// Вспомогательная функция для форматирования времени в строку
String getTimeString() {
return String(hour()) + ":" + String(minute()) + ":" + String(second());
}
Типичная ошибка №1: Дребезг срабатывания. Если проверять условие в loop() без задержки (delay) или флага, функция feedCat() может выполниться несколько раз подряд за одну минуту. Мы избегаем этого, проверяя время раз в 30 секунд и сравнивая день последнего кормления.
Типичная ошибка №2: Сброс времени после перезагрузки. Встроенные функции hour() и minute() отсчитывают время с момента включения микроконтроллера. Для реального точного расписания нужно синхронизировать время по NTP (Network Time Protocol). Это отличное улучшение для вашего проекта! Добавьте библиотеку time.h и функцию configTime() в setup().
Сборка механической части: превращаем код в действие
Это самый творческий этап. Нужно прикрепить к валу сервопривода импровизированный дозатор. 1. Возьмите пластиковую крышку от бутылки. 2. Проделайте в её центре отверстие и насадите на вал сервопривода (часто в комплекте идут пластиковые «барашки» для крепления). 3. В боковой стенке крышки вырежьте сектор-отверстие. 4. Прикрепите эту крышку к горлышку банки с кормом так, чтобы при повороте отверстия совпадали, и корм высыпался в миску.
Совет: Перед окончательной сборкой протестируйте угол поворота и задержку, подобрав оптимальные значения в коде (myServo.write(angle) и delay()), чтобы порция была именно такой, как нужно вашему коту.
Тестирование и отладка
Прежде чем доверять устройство своему питомцу, проведите полный цикл проверок.
- Загрузка и подключение. Загрузите скетч, откройте Монитор порта. Убедитесь, что ESP32 подключилась к Wi-Fi и вывела свой IP-адрес.
- Веб-интерфейс. Введите этот IP-адрес в браузере. Должна открыться страница управления.
- Ручное кормление. Нажмите кнопку «Накормить сейчас!». Сервопривод должен отработать цикл поворота.
- Проверка расписания. Установите время на 1-2 минуты вперед от текущего. Дождитесь срабатывания. Помните о нашей проверке на
lastFeedDay— в течение одного дня повторного срабатывания не будет. - Стресс-тест. Отключите и снова подключите питание. Устройство должно переподключиться к Wi-Fi и продолжить работу. Время сбросится на отсчёт от включения, поэтому важно реализовать NTP для реального использования.
- Безопасность. Убедитесь, что все провода надёжно изолированы, сервопривод закреплён, а конструкция устойчива к «исследованиям» любопытного кота.
Куда развивать проект: идеи для улучшений
Наша кормушка уже функциональна, но предела совершенству нет!
- Точное время через NTP. Как уже говорилось, это must-have для финальной версии.
- Интеграция с Home Assistant. Через компонент ESPHome или собственную интеграцию по MQTT вы сможете видеть статус кормушки и управлять ею из общего интерфейса умного дома, создавать сложные сценарии (например, не кормить, если кот уже у миски).
- Датчик уровня корма. Ультразвуковой датчик HC-SR04, направленный в контейнер, сможет оповещать вас о необходимости дозаправки.
- Несколько кормлений в день. Достаточно усложнить логику, храня в памяти массив с несколькими парами «час-минута».
- Резервное питание. На случай отключения электрительства можно добавить Power Bank.
Если тема интеграции с Home Assistant вас заинтересовала, рекомендую почитать мои статьи про HACS: лучшие сторонние интеграции и Node-RED + Home Assistant: Визуальная автоматизация. А чтобы устройство работало от батарей, пригодится материал про ESP32 Deep Sleep.
Заключение
Мы с вами прошли весь путь: от идеи и пары электронных компонентов до работающего умного устройства. ESP32 в очередной раз доказала свою универсальность, позволив нам не только управлять железом, но и поднять полноценный веб-сервер для управления. Такая кормушка — это не просто гаджет, это реальная помощь, которая делает жизнь вашего питомца, а значит и вашу, немного комфортнее и предсказуемее.
Самое приятное в DIY-проектах — возможность их модифицировать. Начните с этой базы, а потом добавляйте именно те функции, которые нужны вам. Удачи в сборке, и пусть ваш кот будет сыт и доволен!
Понравилась статья?
Поставьте лайк и сохраните полезный материал в закладки.
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Мониторинг качества воздуха: CO2, PM2.5 и VOC своими руками на ESP32
DIY умный звонок с камерой на ESP32-CAM и Home Assistant
Умный аквариум своими руками: автодолив, контроль температуры и освещение по расписанию
Умная теплица на ESP32 и Raspberry Pi: автоматизация от А до Я
Как печатать резьбу на 3D-принтере: зазоры, допуски и настройки для болтов и гаек
Домашняя метеостанция с графиками: ESP32 + InfluxDB + Grafana