Arduino

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

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

Аппарат имеет дисплей и клавиатуру. С помощью, них можно запрограммировать любое количество раздачи корма и в любое время.
Давайте посмотрим, как происходит этот процесс.

Конечно, для изготовления именно такого аппарата нужен 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] = '';
feed1 = String(key);
delay(1000);
lcd.clear();
}

if(button == 'B'){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("HH:MM:SS 2nd");
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] = '';
feed2 = String(key);
delay(1000);
lcd.clear();
}
if(button == 'D'){
lcd.clear();
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());
delay(5000);
lcd.clear();
}
if(button == 'C'){
digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction

for(int x = 0; x < feed_length; x++) { // Makes 200 pulses for making one full cycle rotation
digitalWrite(stepPin,HIGH);
delayMicroseconds(feed_time);
digitalWrite(stepPin,LOW);
delayMicroseconds(feed_time);
}
delay(1000);
}
if (feed1==rtc.getTimeStr())
{
digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction

for(int x = 0; x < feed_length; x++) { // Makes 200 pulses for making one full cycle rotation
digitalWrite(stepPin,HIGH);
delayMicroseconds(feed_time);
digitalWrite(stepPin,LOW);
delayMicroseconds(feed_time);
}
delay(1000);
}
if (feed2==rtc.getTimeStr())
{
digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction

for(int x = 0; x < feed_length; x++) { // Makes 200 pulses for making one full cycle rotation
digitalWrite(stepPin,HIGH);
delayMicroseconds(feed_time);
digitalWrite(stepPin,LOW);
delayMicroseconds(feed_time);
}
delay(1000);
}
}
dog_feeder_keypad_lcd_stepper_motor.ino
Шаг четвертый: установка времени и даты на модуле RTC
Ниже можно скачать код для установки времени и даты в DS3231. Перед прошивкой нужно установить библиотеку DS3231.
Подключение модуля к Ардуино следующее:
DS3231 SDA — A4 в Arduino
DS3231 SCL — A5 в Arduino

 Показать / Скрыть текст#include <DS3231.h>

// Init the DS3231 using the hardware interface
DS3231 rtc(A4, A5);

void setup()
{
// Setup Serial connection
Serial.begin(115200);

// Initialize the rtc object
rtc.begin();

// Write your current time and date to this following lines
rtc.setDOW(MONDAY); // Set Day-of-Week to Monday
rtc.setTime(12, 0, 0); // Set the time to 12:00:00 (24hr format)
rtc.setDate(01, 01, 2014); // Set the date to January 1st, 2014
}

void loop()
{
// Send Day-of-Week
Serial.print(rtc.getDOWStr());
Serial.print(" ");

// Send date
Serial.print(rtc.getDateStr());
Serial.print(" — ");

// Send time
Serial.println(rtc.getTimeStr());

// Wait one second before repeating :)
delay (1000);
}<br>
DS3231_Set_Time.ino

Шаг пятый: сборка
Сборка простая и интуитивно понятная. Для крепежа деталей аппарата мастер использует винты. Шнек просто насаживается на вал двигателя и фиксируется винтом.

Все готово, теперь ваши животные не останутся голодными, даже если вы несколько дней будет отсутствовать дома.

Источник

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть
Закрыть