Как заставить мотор вращаться каждые 10 минут?

Я новичок в Arduino, пожалуйста, не будьте суровы. Я хочу, чтобы двигатель вращался каждые x промежутков времени (скажем, 10 минут). Как только программа запущена, я хочу, чтобы она запускала двигатель (останавливалась через 10 секунд) и каждые 10 минут продолжала процесс. Возможно ли это сделать?,

, 👍2

Обсуждение

Да, возможно и хорошее начало для новичка. Посмотрите на пример BlinkWithoutDelay. Попробуйте несколько руководств по millis (). Это даст вам представление о том, как вы можете выполнять временные действия с помощью Arduino. Если у вас возникнут какие-либо конкретные проблемы с этим, вы всегда можете вернуться сюда и спросить об этом :), @chrisl


2 ответа


0

Да, конечно, это возможно. Функция loop() может выглядеть примерно так:

loop(){
    turn_motor_on();
    wait_seconds(10);
    turn_motor_off();
    wait_minutes(10);
}

Теперь все, что вам нужно сделать, это написать свои функции turn_motor_on() и off, а также wait_seconds() и wait_minutes(). Я оставлю управление двигателем на ваше усмотрение, поскольку вы не предоставили никаких подробностей о том, как подключается двигатель.

Вы могли бы использовать функцию Arduino delay ():

void wait_seconds(int num_seconds){
    for(int i=0; i<num_seconds; i++){
        delay(1000);
    }
}

void wait_minutes(int num_minutes){
    for(int i=0; i<num_minutes; i++){
        delay_seconds(60);
    }
}

Конечно, есть много других способов сделать это, но этот метод прост и понятен, и вы легко начнете работу.

,

1

Самый простой вариант - использовать delay() для реализации ожидания:

void loop() {
    turn_motor_on();
    delay(10000);  // 10 секунд
    turn_motor_off();
    delay(600000);  // 10 минут
}

Поскольку эти длинные числа могут быть трудночитаемыми, вы можете сделать их более удобочитаемыми, определив некоторые единицы измерения:

const unsigned long second = 1000;
const unsigned long minute = 60000;

Затем вы можете, например, отложить (10 * минут);

Остерегайтесь ловушки, если вы попытаетесь выполнить арифметику с целочисленными литералами. Следующее:

delay(10 * 60 * 1000);  // BUG!

не будет работать на большинстве Arduino, так как умножение будет выполняться для типа данных int, который может содержать только числа до 32 767. Безопаснее использовать либо явно типизированные константы (unsigned long - подходящий тип для задержек), либо целочисленные литералы, набранные с суффиксом UL (что означает “unsigned long”).

Обратите внимание, что Arduino не будет выполнять никакой полезной работы во время задержки. Если вы хотите выполнить какую-либо работу во время задержки, см. раздел “Мигание без задержки”. Пример Arduino.

,

Чувак! Научить новичка использовать задержку? Этот путь быстро ведет к безумию! (Для ОП: все в порядке, пока вы не захотите проверить нажатие кнопки, считывание показаний датчика или сделать ** что-нибудь еще ** во время этой задержки. Arduino со скрежетом останавливается с задержкой.), @Duncan C

Я бы посоветовал научиться использовать millis (), чтобы сделать то же самое, прямо сейчас. Если вы используете delay (), то в конечном итоге вам придется переписывать свой код только позже., @Duncan C

@DuncanC: Да, когда новичок находится на уровне 0, я думаю, что лучше начать с самого простого возможного подхода. И delay () проще, чем millis (): вот почему Blink находится в разделе 1 примеров Arduino, а BlinkWithoutDelay - в разделе 2. Кроме того, “необходимость переписать свой код позже” на самом деле хороша для новичка. Вот как ты учишься! Но обратите внимание, что я предупредил оператора, что в какой-то момент ему, возможно, придется использовать подход BlinkWithoutDelay., @Edgar Bonet