====== Автоматическая кормушка для рыб ====== ** [[slot-box:start#хочу_собрать|Проекты на Arduino и Slot Shield]] ** Аквариум с рыбками прекрасно успокаивает нервы после тяжёлого рабочего дня. За его обитателями можно наблюдать часами напролёт. Но что делать, если хочется уехать отпуск или на дачу. Везти аквариум с собой — нелепая идея. Конечно можно попросить кого-нибудь из знакомых регулярно кормить рыбок, но лучше воспользоваться инженерными навыками и собрать простую автоматическую кормушку на Arduino. {{ :automatic-fish-feeder:fish-feeder.jpg?nolink |}} Устройство будет трясти пакетиком с кормом точно по расписанию. За точность часов отвечает модуль [[amp>product/troyka-rtc?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|RTC]], а время кормления задаётся с помощью [[amp>product/troyka-quad-switch?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|четырёхкнопочной клавиатуры]] и [[amp>product/troyka-quad-display?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|цифрового дисплея]]. * Платформы: [[amp>product/arduino-uno?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|Arduino Uno]], [[amp>product/arduino-leonardo?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|Arduino Leonardo]], [[amp>product/iskra-neo?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|Iskra Neo]] * Язык программирования: Arduino (C++) ===== Что потребуется ===== [[amp>collection/automatic-fish-feeder?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki | Полный сет]] компонентов проекта. В сет входят: * [[amp>product/iskra-neo?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|Iskra Neo]] * [[amp>product/arduino-troyka-slot-shield?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|Troyka Slot Shield]] * [[amp>product/structor-slot-box?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|#Slot Box]] * [[amp>product/troyka-rtc?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|часы реального времени]] и [[amp>product/battery-cr1225?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|батарейка CR1225]] * четырёхразряный индикатор [[amp>product/troyka-quad-display?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|Quad Display]] * [[amp>product/troyka-quad-switch?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|четырёхкнопочная клавиатура]] * [[amp>product/servo-fs90?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|микросервопривод FS90]] и [[amp>product/structor-servo?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|#крепление для сервоприводов]] * длинные [[amp>product/pin-headers-long?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|штырьковые соединители]] ===== Видеоинструкция ===== {{youtube>z0s-J4KyV8g?large}} ===== Как собрать ===== Установите [[amp>product/arduino-troyka-slot-shield?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|Troyka Slot Shield]] на [[amp>product/iskra-neo?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|Iskra Neo]] {{ :automatic-fish-feeder:step01.png?nolink|}} Возьмите [[amp>product/troyka-rtc?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|часы реального времени]] и вставьте в средний верхний слот. Вставьте батарейку [[amp>product/battery-cr1225?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|CR1225]] в держатель на лицевой панели модуля. {{ :automatic-fish-feeder:step02.png?nolink|}} Переверните [[amp>product/troyka-quad-display?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|Quad Display]] на 180 градусов и вставьте в центральный и правый слоты нижнего ряда. {{ :automatic-fish-feeder:step03.png?nolink|}} Поверните [[amp>product/troyka-quad-switch?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|четырёхкнопочную клавиатуру]] на 90 градусов против часовой стрелки и вставьте в правый верхний слот. {{ :automatic-fish-feeder:step04.png?nolink|}} Подключите [[amp>product/servo-fs90?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|сервопривод]] трёхпроводным шлейфом через [[amp>product/pin-headers-long?utm_source=proj&utm_campaign=slot-proj-18&utm_medium=wiki|штырьковые соединители]] к пину ''11''. {{ :automatic-fish-feeder:step-05.png?nolink|}} ===== Скетч ===== Прошейте контроллер скетчем через [[../установка-и-настройка-arduino-ide|Arduino IDE]]. // библиотека для работы I²C #include // библиотека для работы с часами реального времени #include "TroykaRTC.h" // библиотека для работы с сервоприводами #include // библиотека для работы с дисплеем #include // библиотека для работы с кнопками #include "TroykaButton.h" // пин с сервоприводом #define SERVO_PIN 11 // пины к которым подключены кнопки #define BUTTON_PIN_1 0 #define BUTTON_PIN_2 1 #define BUTTON_PIN_3 4 #define BUTTON_PIN_4 5 // период блокировки включения подачи еды в мс #define TIME_BLOCK 60000 // создаём объект для работы с часами реального времени RTC clock; // создаём объект для управления сервоприводом Servo myservo; // создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(10); // создаём объект для работы с кнопкой TroykaButton button1(BUTTON_PIN_1); TroykaButton button2(BUTTON_PIN_2); TroykaButton button3(BUTTON_PIN_3); TroykaButton button4(BUTTON_PIN_4); // переменные для хранения времени кормления // по умолчанию время кормёжки «12:30» int hourAlarm = 12; int minuteAlarm = 30; // состояние кормушки (текущее время / установка времени кормления) bool state = true; // переменная для хранения текущего времени unsigned long ms = 0; void setup() { Serial.begin(9600); // инициализация дисплея qd.begin(); // инициализация часов clock.begin(); // метод установки времени и даты в модуль вручную // clock.set(10,25,45,27,07,2005,THURSDAY); // метод установки времени и даты автоматически при компиляции clock.set(__TIMESTAMP__); // инициализация кнопок button1.begin(); button2.begin(); button3.begin(); button4.begin(); // запоминаем текущее время ms = millis(); } void loop() { // считывание данных с кнопок button1.read(); button2.read(); button3.read(); button4.read(); // запрашиваем данные с часов clock.read(); // считываем показания часов и минут в переменные int hour = clock.getHour(); int minute = clock.getMinute(); // если кнопка «1» длительно зажата if (button1.isHold()) { // меняем состояние кормушки state = !state; // в зависимости от текущего состояние кормушки if (!state) { qd.displayDigits(QD_F, QD_O, QD_O, QD_d); } else { qd.displayDigits(QD_t, QD_I, QD_S, QD_H); } // ждём пару секунд delay(2000); } // в зависимости от текущего режима работы кормушки // «текущее время / время кормления» // если режим «текущее время» if (state) { // в зависимости от состояние кнопок // увеличиваем / уменьшаем часы и минуты if (button1.justReleased()) { Serial.println("1"); clock.setHour(hour + 1); } else if (button2.justReleased()) { Serial.println("2"); clock.setHour(hour - 1); } else if (button3.justReleased()) { Serial.println("3"); clock.setMinute(minute - 1); } else if (button4.justReleased()) { Serial.println("4"); clock.setMinute(minute + 1); } // выводим время на дисплей qd.displayScore(hour, minute, true); } else { // если режим «время кормления» // в зависимости от состояние кнопок // увеличиваем / уменьшаем часы и минуты if (button1.justReleased()) { Serial.println("5"); hourAlarm++; } else if (button2.justReleased()) { Serial.println("6"); hourAlarm--; } else if (button3.justReleased()) { Serial.println("7"); minuteAlarm--; } else if (button4.justReleased()) { Serial.println("8"); minuteAlarm++; } parsingFoodTime(); // выводим время кормления на дисплей qd.displayScore(hourAlarm, minuteAlarm); } // если пришло время кормёжки if (hour == hourAlarm && minute == minuteAlarm && millis() - ms > TIME_BLOCK) { Serial.println("Go Feed"); // включаем подачу еды goFeed(); // запоминаем текущее время ms = millis(); } } // функция включения сервопривода void goFeed() { // подключаем сервопривод myservo.attach(SERVO_PIN); for (int i = 0; i < 10; i++){ myservo.write(50); delay(200); myservo.write(80); delay(200); } } // функция парсинга времени void parsingFoodTime() { if (hourAlarm > 23) { hourAlarm = 0; } else if (hourAlarm < 0) { hourAlarm = 23; } if (minuteAlarm > 59) { minuteAlarm = 0; } else if (minuteAlarm < 0) { minuteAlarm = 59; } } ===== Что дальше? ===== Хотите собрать другой девайс? Выберите своё будущее устройство из [[slot-box:start#хочу_собрать|списка проектов на Slot Shield]]. ===== Часто задаваемые вопросы ===== > Где скачать необходимые библиотеки и как их установить? * [[https://github.com/amperka/QuadDisplay2|Библиотека для работы с дисплеем]] * [[https://github.com/amperka/TroykaRTC|Библиотека для работы с часами реального времени]] * [[программирование:библиотеки|Как установить библиотеку]] > У моего модуля QuadDisplay всего три ноги и расположены они слева. Можно ли использовать его в этом проекте? Да, модуль можно использовать, но скетч, библиотеки и схема сборки отличаются. Мы работаем над второй версией программы для старых дисплеев и скоро выложим её на этой странице.