#define pinButton 1 // Пин кнопки управления
#define pinClosedSwitch 3 // Пин концевика "закрыто"
#define pinOpenedSwitch 4 // Пин концевика "открыто"
#define pin_ENA 5 // Пин драйвера ENA+
#define pin_DIR 6 // Пин драйвера DIR+
#define pin_PUL 7 // Пин драйвера PUL+
uint32_t f = 1000; // Базовая частота следования шагов в Гц
uint32_t t = 1000000 / (f * 10) / 2; // Увеличение скорости в 10 раз
unsigned long lastStatusLogTime = 0; // Время последнего вывода статуса
void setup() {
// Инициализация пинов
pinMode(pin_ENA, OUTPUT);
pinMode(pin_DIR, OUTPUT);
pinMode(pin_PUL, OUTPUT);
pinMode(pinButton, INPUT_PULLUP); // Подтягивающий резистор для кнопки
pinMode(pinClosedSwitch, INPUT_PULLUP); // Включаем внутренний подтягивающий резистор для концевика "закрыто"
pinMode(pinOpenedSwitch, INPUT_PULLUP); // Включаем внутренний подтягивающий резистор для концевика "открыто"
// Включение драйвера
digitalWrite(pin_ENA, LOW); // Разрешить работу драйвера
// Настройка Serial для логов
Serial.begin(115200);
Serial.println("Система запущена. Проверка концевиков...");
// Проверяем состояние концевиков на старте
if (digitalRead(pinClosedSwitch) == HIGH && digitalRead(pinOpenedSwitch) == HIGH) {
Serial.println("Оба концевика разомкнуты. Закрываем крышку...");
closeCover();
} else {
Serial.println("Крышка уже находится в корректной позиции.");
}
}
void loop() {
// Читаем кнопку (инверсия логики для режима INPUT_PULLUP)
if (digitalRead(pinButton) == LOW) {
Serial.println("Кнопка нажата. Запуск цикла открытия-закрытия...");
openCover(); // Открываем крышку
delay(20000); // Пауза 20 секунд
closeCover(); // Закрываем крышку
}
// Вывод состояния концевиков каждые 3 секунды
if (millis() - lastStatusLogTime >= 3000) {
logSwitchStatus();
lastStatusLogTime = millis();
}
}
void openCover() {
Serial.println("Открытие крышки...");
moveMotor(true); // Движение в сторону открытия
}
void closeCover() {
Serial.println("Закрытие крышки...");
moveMotor(false); // Движение в сторону закрытия
}
void moveMotor(bool isOpening) {
// Устанавливаем направление (исправлено направление вращения)
digitalWrite(pin_DIR, isOpening ? LOW : HIGH); // Инверсия направления
delayMicroseconds(5); // Задержка для стабилизации
Serial.print("Начало движения в направлении: ");
Serial.println(isOpening ? "Открытие" : "Закрытие");
while (true) {
// Подаем шаговый импульс
digitalWrite(pin_PUL, HIGH);
delayMicroseconds(t);
digitalWrite(pin_PUL, LOW);
delayMicroseconds(t);
// Проверяем состояние концевиков
if (isOpening && digitalRead(pinOpenedSwitch) == LOW) { // Концевик открыт сработал (LOW)
Serial.println("Достигнут концевик открытия. Остановка.");
break;
}
if (!isOpening && digitalRead(pinClosedSwitch) == LOW) { // Концевик закрыт сработал (LOW)
Serial.println("Достигнут концевик закрытия. Остановка.");
break;
}
}
// Остановка двигателя
Serial.println("Двигатель остановлен.");
}
// Функция для логирования состояния концевиков
void logSwitchStatus() {
Serial.print("Статус концевиков: ");
Serial.print("Закрыто: ");
Serial.print(digitalRead(pinClosedSwitch) == HIGH ? "Не активен" : "Активен"); // Если HIGH, то не активен
Serial.print(", Открыто: ");
Serial.println(digitalRead(pinOpenedSwitch) == HIGH ? "Не активен" : "Активен"); // Если HIGH, то не активен
}