Автоматический дозатор корма для домашних животных с регу...

Источник:

Этот дозатор корма для домашних животных был создан для решения проблемы неравномерности порций при подаче сухого корма для домашних животных. Это проблема, связанная с несколькими домашними животными, и важно обеспечить, чтобы все они получали одинаковую порцию. В дозаторе имеется датчик, который определяет наличие миски и затем выдает корм для домашних животных. Выдаваемое количество можно изменить в соответствии с потребностями ваших питомцев. Этот дозатор очень прост в использовании — просто поставьте под него миску, и через несколько секунд в нем будет необходимое количество еды.

Демонстрация:
Как пополнить:

Функции:
Сервопривод перемещает заслонку вверх, чтобы заблокировать путь корма, или вниз, чтобы позволить корму пройти и быстро раздать корм для домашних животных.
Сервопривод вращается и позволяет пополнять зону раздачи кормом для домашних животных из бункера.
WS2812 (светодиод RGB) показывает пользователю, когда раздается корм для домашних животных, чтобы показать, что миска обнаружена.
Датчик расстояния определяет наличие чаши и выдает еду только один раз, пока чаша не будет снята.

Используемое оборудование:
Ардуино Уно Р3
2x сервопривода MG995
ВЛ6180
WS2812 5 мм светодиод
Разъем USB-C
Все детали, напечатанные на 3D-принтере, прикреплены (7 деталей).
Используемое программное обеспечение:
Автодеск Фьюжн
Ардуино IDE
Фрицинг
Бамбу Студия
Схема подключения:

Ниже приведены две схемы подключения: одна без проводов 5 В и заземления (чтобы упростить ее и вам было легче следить за проводами), на одной есть все. Обратите внимание, что компоненты WS2812 и VL6180 не присутствовали в используемом программном обеспечении (Fritzing), поэтому мне пришлось использовать аналогичные компоненты, но разводка правильная.

В качестве источника питания я подключил разъем USB-C к VIN и GND на Arduino.

Код

Убедитесь, что установлены следующие библиотеки, чтобы код работал правильно:

Адафрут_VL6180X
Адафрут_НеоПиксель

Код был разработан таким образом, чтобы его можно было легко настроить. Такие переменные, как порог обнаружения чаши, углы сервопривода, цвет светодиода и время регулировки (для регулировки порции), можно легко изменить.

#include
#include
#include

#define PIN 6 // Контакт данных светодиода WS2812
#define NUMPIXELS 1 // Количество используемых светодиодов WS2812
#define THRESHOLD 38 // Порог расстояния для обнаружения чаши (мм)

Adafruit_VL6180X vl = Adafruit_VL6180X();
Пиксели Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

СервораспределениеСервопривод;
Заправка сервоприводаСерво;

INT DispensPin = 9;
int refillPin = 10;

INT DispensClosed = 180;
INT DispensOpen = 95;
int refillClosed = 35;
интервал пополненияOpen = 0;

внутренняя яркость = 255;
беззнаковый longlastBowlTime = 0;
выдача bool = ложь;
boolowlDetected = ложь;

недействительная настройка() {
Серийный.начало(9600);
пикселей.begin();
пикселей.setBrightness(яркость);
пикселей.шоу();

DispenseServo.attach(dispensePin);
refillServo.attach(refillPin);

DispenseServo.write(dispenseClosed);
refillServo.write(refillClosed);

если (!vl.begin()) {
Serial.println(«Не удалось инициализировать датчик VL6180X.»);
пока (1); // Остановка, есл�� настройка датчика не удалась
}

Serial.println(«Система готова.»);
}

недействительный цикл() {
int distance = vl.readRange();

если (расстояние <0) {
Serial.println(«Не удалось прочитать расстояние.»);
возвращаться;
}

Serial.print(«Расстояние: „);
Serial.println(расстояние);

if (расстояние < ПОРОГ &&! распределение && !bowlDetected) {
Serial.println(“Обнаружена чаша! Выдача...»);
чашаОбнаружена = Истина;
выдать еду();
}

if (расстояние > ПОРОГ && дозирование) {
Serial.println(«Дема снята. Дозатор закрывается.»);
закрытьДиспенсер();
}

if (расстояние > ПОРОГ && чашаобнаружена) {
чашаОбнаружена = ложь;
Serial.println(«Ожидание повторного обнаружения миски.»);
}

if (bowlDetected && расстояние <ПОРОГОВОЕ) {
возврат; // Пауза, пока чаша не будет удалена
}
}

недействительный DispensFood () {
выдача = правда;

// Затухание светодиода
for (int я = 0; я <= 255; я++) {
пикселей.setPixelColor(0, пикселей.Цвет(0, 0, i));
пиксели.шоу

08:15
18
Нет комментариев. Ваш будет первым!

Ссылка появится после регистрации

Похожие модели

Посещая этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.