Автоматическая кормушка для домашних животных
Конкретно эту кормушку мастер сделал для своей собаки, но использовать ее можно для раздачи корма в определенное время любых домашних животных, включая, например, кур.
Аппарат имеет дисплей и клавиатуру. С помощью, них можно запрограммировать любое количество раздачи корма и в любое время.
Давайте посмотрим, как происходит этот процесс.
Конечно, для изготовления именно такого аппарата нужен 3D-принтер, но, я думаю, несложно будет адаптировать для этих целей старую мясорубку.
Инструменты и материалы:
-Шаговый двигатель NEMA17 — 42HB34F08AB;
-Драйвер шагового двигателя A4988;
-Arduino UNO;
-Клавиатура Arduino 4×4;
-Часы RTC DS3231;
-ЖК-дисплей 16×2;
-Понижающий модуль LM2596S;
-Источник питания 12 В;
-Провода;
-Монтажная плата;
-Паяльные принадлежности;
-Разъем питания 12В;
-3D-принтер;
-Крепеж;
-Отвертка;
-Компьютер с ПО;
Шаг первый: печать деталей
Сначала мастер разработал детали в графическом редакторе, затем напечатал их на 3D-принтере. Печать деталей у него заняла около 5 дней. Файлы можно скачать ниже.
Показать / Скрыть текстmain pipe.stl
nema 17 mount.stl
pipe extension.stl
screw nema 17 5mm and nut.stl
support 1.stl
support 2.stl
tank crater (floor).stl
tank roof.stl
tank walls.stl
top part main pipe.stl
box roof.stl
box wall.stl
cap.stl
big box.stl
Самым сложным было напечатать шнек. Для его печати шнек мастер печатал в вертикальном положении с использованием опор.
Шаг второй: электроника
Вся электрическая часть монтируется согласно схеме. Если дисплей при работе слишком темный, то нужно изменить значение резистора.
Шаг третий: код Arduino
Код Arduino включает дополнительные библиотеки: DS3231 RTC, Arduino Keypad 4×4
Когда пользователь нажимает ‘A’ — программа запрашивает время первой подачи и ждет, пока он не введете ЧЧ: ММ: СС.
Когда пользователь нажимает ‘B’ — программа запрашивает время второй подачи и ждет, пока он не введете ЧЧ: ММ: СС
Когда пользователь нажимает ‘C’ — шаговый двигатель работает в течение одного цикла (одна подача)
При нажатии ‘D’ на ЖК-дисплее отображается текущая дата.
ЖК-дисплей обычно отображает текущее время, а также часы и минуты первого и второго времени подачи.
Все функции описаны в коде ниже:
Показать / Скрыть текст#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] = '