
Интернет-магазин «Неглупый Дом»
В других проектах на сайте мотор на L298N управляется потенциометром или веб-страницей без ограничения по времени. Здесь добавлена простая защита: если мотор включён и работает дольше заданного времени без остановки, срабатывает зуммер и мотор отключается сам — страховка на случай, если забыли выключить его вручную или команда "стоп" не дошла.
Сам L298N управляется так же, как и в других проектах — через IN1/IN2/ENA. Разница в этом проекте — отдельный таймер, который запускается в момент включения мотора (запоминается `millis()` на этот момент) и в каждом цикле `loop()` проверяет, не прошло ли с этого момента больше заданного максимального времени работы. Если прошло — мотор принудительно останавливается, и зуммер подаёт сигнал, независимо от того, что в этот момент "просит" включённая логика управления.
Важная деталь — таймер должен сбрасываться каждый раз, когда мотор переключается из выключенного состояния во включённое заново, а не копить время с самого первого включения Arduino навечно. Поэтому код отдельно отслеживает именно момент перехода "было выключено → стало включено", а не просто общее время работы программы.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.
const int IN1 = 1, IN2 = 2, ENA = 3;
const int BUZZER_PIN = 8;
const int BUTTON_PIN = 4;
const unsigned long MAX_RUN_TIME = 10000; // максимум 10 секунд непрерывной работы, подберите под задачу
bool motorRunning = false;
unsigned long motorStartTime = 0;
void stopMotor() {
analogWrite(ENA, 0);
motorRunning = false;
}
void setup() {
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
bool buttonPressed = (digitalRead(BUTTON_PIN) == LOW);
if (buttonPressed && !motorRunning) {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, 200);
motorRunning = true;
motorStartTime = millis(); // таймер запускается именно в момент включения
}
if (!buttonPressed && motorRunning) {
stopMotor(); // обычная ручная остановка
}
if (motorRunning && (millis() - motorStartTime > MAX_RUN_TIME)) {
stopMotor();
tone(BUZZER_PIN, 2500, 500);
Serial.println("АВАРИЙНАЯ ОСТАНОВКА: превышено максимальное время работы!");
}
}
Дополнительных библиотек не требуется — только встроенные `millis()` и `tone()`. Подберите `MAX_RUN_TIME` с запасом под реальную длительность нормальной работы вашего механизма, а не впритык к ожидаемому времени.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 262 ₽ 236 ₽ (экономия 26 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.