//Кнопки вверх вниз
#define BTN_1 A2
#define BTN_2 A1
//Пины для драйвера
#define DRIVER_DIRECTION_CONTROL_PIN 2
#define DRIVER_STEP_PIN 3
//Пины для концевиков
#define SWITCH_UP_PIN A4
#define SWITCH_DOWN_PIN A3
// Время задержки(БЕТА)
#define SLEEP 5
// Класс для работы с мотором
class StepMotor
{
private:
int driver_step_pin;
int driver_direction_pin;
int delay_between_steps;
boolean spin_flag;
boolean directional; // 1 - Вверх, 0 - Вниз
public:
//Конструктор
StepMotor(int step_pin, int directional_pin, int step_delay)
{
spin_flag = false;
driver_step_pin = step_pin;
driver_direction_pin = directional_pin;
delay_between_steps = step_delay;
}
// Шаг
void step()
{
if (!spin_flag) return;
digitalWrite(driver_step_pin, HIGH);
delay(delay_between_steps);
digitalWrite(driver_step_pin, LOW);
}
// Установка направления вращения
void set_directional(String direct)
{
if (direct == "Up")
{
directional = true;
digitalWrite(driver_direction_pin, HIGH);
}
else if (direct == "Down")
{
directional = false;
digitalWrite(driver_direction_pin, LOW);
}
}
//Включение мотора
void activate()
{
spin_flag = true;
};
//Выключение мотора
void deactivate()
{
spin_flag = false;
};
// Получение статуса от двигателя, работает/нет
bool get_working_status()
{
return spin_flag;
};
// Получение направления вращения
String get_directional()
{
return directional? "Up" : "Down";
}
};
// Инициализация класса для управления мотором
StepMotor Motor(DRIVER_STEP_PIN, DRIVER_DIRECTION_CONTROL_PIN, SLEEP);
void setup() {
// Инициализация режима на пинах
pinMode(BTN_1, INPUT_PULLUP);
pinMode(BTN_2, INPUT_PULLUP);
pinMode(SWITCH_UP_PIN, INPUT_PULLUP);
pinMode(SWITCH_DOWN_PIN, INPUT_PULLUP);
pinMode(DRIVER_DIRECTION_CONTROL_PIN, OUTPUT);
pinMode(DRIVER_STEP_PIN, OUTPUT);
}
void loop() {
boolean btn_up_status = !digitalRead(BTN_1);
boolean btn_down_status = !digitalRead(BTN_2);
boolean switch_up_status = !digitalRead(SWITCH_UP_PIN);
boolean switch_down_status = !digitalRead(SWITCH_DOWN_PIN);
if (btn_up_status && !Motor.get_working_status())
{
Motor.set_directional("Up");
Motor.activate();
}
if (btn_down_status && !Motor.get_working_status())
{
Motor.set_directional("Down");
Motor.activate();
}
if (switch_up_status)
{
Motor.deactivate();
}
if (switch_down_status)
{
Motor.deactivate();
}
Motor.step();
}