/*
* Для прошивки Arduino nano нужно выбрать в Arduino IDE 1.8.12:
* Плата: Arduino Uno !!!
*/
/*
Скетч к проекту "Автокормушка 2.1"
- Страница проекта (схемы, описания): https://alexgyver.ru/gyverfeed2/
- Исходники на GitHub: https://github.com/AlexGyver/GyverFeed2/
Проблемы с загрузкой? Читай гайд для новичков: https://alexgyver.ru/arduino-first/
AlexGyver, AlexGyver Technologies, 2020
*/
// Клик - внеочередная кормёжка
// Удержание - задаём размер порции
const byte feedTime[][2] = {
{8, 0}, // часы, минуты. НЕ НАЧИНАТЬ ЧИСЛО С НУЛЯ
{20, 0}
};
#define EE_RESET 3 // любое число 0-255. Измени, чтобы сбросить настройки и обновить время
#define FEED_SPEED 200*3 // задержка между шагами мотора (мкс)
#define BTN_PIN 2 // кнопка
#define STEPS_FRW 111 // шаги вперёд small 74 big 111
#define STEPS_BKW 72 // шаги назад small 48 big 72
#define STEPS_180g round(800 / (STEPS_FRW - STEPS_BKW)) //Определение 180 градусов
/*целочисленная константа, хранящая номер цифрового контакта Arduino, который подаёт сигнал Step на драйвер. Каждый импульс от этого контакта — это перемещение мотора на один шаг*/
const int pinStep = 4;
/*целочисленная константа, хранящая номер цифрового контакта Arduino, который подаёт сигнал Direction на драйвер. Наличие импульса - мотор вращается в одну сторону, отсутствие - в другую*/
const int pinDir = 3;
/*включение отключение питания на мотор*/
const int pinEn = 5;
// =========================================================
#include <EEPROM.h>
#include <microDS3231.h>
MicroDS3231 rtc;
#include "EncButton.h"
EncButton<EB_TICK, BTN_PIN> btn;
int feedAmount = 5;
void setup() {
rtc.begin();
if (EEPROM.read(0) != EE_RESET) { // первый запуск
EEPROM.write(0, EE_RESET);
EEPROM.put(1, feedAmount);
//rtc.setTime(COMPILE_TIME); // Установка текущего времени
rtc.setTime(BUILD_SEC, BUILD_MIN, BUILD_HOUR, BUILD_DAY, BUILD_MONTH, BUILD_YEAR);
}
EEPROM.get(1, feedAmount);
/*задаём контактам Step и Direction режим вывода, то есть они выдают напряжение*/
pinMode(pinStep, OUTPUT);
pinMode(pinDir, OUTPUT);
pinMode(pinEn, OUTPUT);
//устанавливаем начальный режим
disableMotor();
Serial.begin(9600); // включить COM для вывода времени
printTime(); //вывод текущего времени
}
void loop() {
//Serial.print(rtc.getTime());
static uint32_t tmr = 0;
if (millis() - tmr > 500) { // два раза в секунду
static byte prevMin = 0;
tmr = millis();
DateTime now = rtc.getTime();
if (prevMin != now.minute) {
prevMin = now.minute;
for (byte i = 0; i < sizeof(feedTime) / 2; i++) { // для всего расписания
if (feedTime[i][0] == now.hour && feedTime[i][1] == now.minute && now.second == 0) {
feed();
}
}
}
}
btn.tick();
if (btn.click()) feed();
if (btn.hold()) {
int newAmount = 0;
digitalWrite(pinEn, LOW); //включение мотора
while (btn.isHold()) {
btn.tick();
oneRev();
newAmount++;
}
//for (int j = 0; j < STEPS_180g; j++) oneRet();
//for (int i = 0; i < STEPS_180g; i++) oneRev();
disableMotor();
feedAmount = newAmount;
EEPROM.put(1, feedAmount);
}
}
void feed() {
printTime(); //вывод текущего времени
digitalWrite(pinEn, LOW); //включение мотора
for (int i = 0; i < feedAmount; i++) oneRev();
//for (int j = 0; j < STEPS_180g; j++) oneRet();
//for (int i = 0; i < STEPS_180g; i++) oneRev();
disableMotor();
}
// выключаем ток на мотор
void disableMotor() {
digitalWrite(pinDir, 0);
digitalWrite(pinStep, 0);
digitalWrite(pinEn, HIGH); // выключение мотора
}
void oneRev() {
digitalWrite(pinDir, LOW);
for (int i = 0; i < STEPS_BKW; i++) runMotor(LOW);
digitalWrite(pinDir, HIGH);
for (int i = 0; i < STEPS_FRW; i++) runMotor(HIGH);
}
void oneRet() {
digitalWrite(pinDir, LOW);
for (int i = 0; i < STEPS_FRW; i++) runMotor(LOW);
digitalWrite(pinDir, HIGH);
for (int i = 0; i < STEPS_BKW; i++) runMotor(HIGH);
}
void runMotor(int8_t dir) {
digitalWrite(pinDir, dir);
digitalWrite(pinStep, HIGH);
delayMicroseconds(FEED_SPEED);
digitalWrite(pinStep, LOW);
delayMicroseconds(FEED_SPEED);
}
void printTime() {
Serial.print(rtc.getTimeString());
Serial.print(" ");
Serial.print(rtc.getDateString());
Serial.print(" ");
Serial.println(feedAmount);
}