#include <Stepper.h> //подключение библиотеки
#include "potentiometer_reader.h"
#include "button_reader.h"
Potentiometer speed_meter(A0, DEFAULT);
const int steps_per_revolution = 200; //количество шагов на оборот
Stepper stepper(steps_per_revolution, 8, 9, 10, 11); //управление выводами 8 - 11
volatile bool is_work = false;
volatile bool is_right_rotation = true;
int motor_speed = 0;
void setup() {
Serial.begin(9600);
speed_meter.set_map(0, 100);
pinMode(2, INPUT_PULLUP); // подтягивающий резистор на входе прерывания
attachInterrupt(0, IinterruptStartStop, FALLING); //разрешение внешнего прерывания (вывод 2 Arduino UNO)
pinMode(3, INPUT_PULLUP); // подтягивающий резистор на входе прерывания
attachInterrupt(1, InterruptChangeDirection, FALLING); //разрешение внешнего прерывания (вывод 3 Arduino UNO)
}
void InterruptChangeDirection() {
static unsigned long prev_millis;
if (prev_millis + 200 < millis()) {
is_right_rotation = !is_right_rotation;
}
prev_millis = millis();
}
void IinterruptStartStop() {
static unsigned long prev_millis;
if (prev_millis + 200 < millis()) {
is_work = !is_work;
}
prev_millis = millis();
}
void ReadSpeed() {
motor_speed = speed_meter.read();
}
void PrintLog(int delay_ms) {
static unsigned long prev_millis = millis();
if (prev_millis + delay_ms < millis()) {
Serial.print("is_work = ");
Serial.print(is_work);
Serial.print(", is_right_rotation = ");
Serial.println(is_right_rotation);
prev_millis = millis();
}
}
void MotorOperation() {
stepper.setSpeed(motor_speed); //установка нового значения скорости
PrintLog(500);
if (is_work && motor_speed != 0) {
if (is_right_rotation) {
stepper.step(steps_per_revolution / 100);
} else {
stepper.step(-steps_per_revolution / 100);
}
}
}
void loop() {
ReadSpeed();
MotorOperation();
}