Как могу остановить цикл через 1 минуту?

Это мой первый проект Arduino, и я хотел бы остановить цикл сервопривода через 1 минуту. Может ли кто-нибудь мне помочь?

#include <Servo.h>
Servo myservo;

void setup()
{
  myservo.attach(5);
}

void loop()
{ 
  myservo.write(45);
  delay(1000);
  myservo.write(125);
  delay(1000); 
}

Спасибо!

, 👍0

Обсуждение

Вы задаете неправильный вопрос. Функция цикла работает вечно. Сколько раз вы хотите, чтобы сервопривод перемещался между этими значениями? Если это, например, 30 раз, вы можете поместить оператор for в функцию настройки и использовать функцию пустого цикла., @Jot

что ты делаешь, если хочешь отварить яйца в течение одной минуты? ....делаем то же самое в программе, @jsotola

Большое спасибо!!!! это было именно то, что мне нужно!! Раньше я также пытался запустить сервопривод и шаговый двигатель одновременно, и именно это и произошло: шаговый двигатель блокировал сервопривод, и я не понимал, почему !! огромное спасибо за объяснение, действительно помогло!!, @Adri47

Чье объяснение вы благодарите? Поля для ответов не предназначены для комментариев. Я перенесу ваш ответ в комментарий под вашим вопросом. Я рад, что кто-то из нас помог тебе. :), @Nick Gammon


3 ответа


1

Чтобы ответить на ваш вопрос, добавьте это в loop():

if (millis() >= 60000) exit(0);

Однако я бы посоветовал вам серьезно задуматься над комментарием Джота: просто остановка выполнения loop() в большинстве случаев не является тем, что вы можете хочу сделать.

,

3

Как предложил Джот в комментарии, один из способов — просто делать то, что вы хотите (что занимает примерно две секунды на итерацию) в цикле, например:

#include <Servo.h>
Servo myservo;

void setup()
{
  myservo.attach(5);

  for (int i = 0; i < 30; i++)
    {
    myservo.write(45);
    delay(1000);
    myservo.write(125);
    delay(1000); 
    }
}

void loop()
{ 
}

Проблема в том, что он основан на знании продолжительности ваших задержек и предполагает, что функции myservo.write() не требуют времени. Лучший метод:

#include <Servo.h>
Servo myservo;

void setup()
{
  myservo.attach(5);

  unsigned long start = millis ();

  while (millis () - start <= 60000)  // на 60 секунд
    {
    myservo.write(45);
    delay(1000);
    myservo.write(125);
    delay(1000); 
    }
}

void loop()
{ 
}

При этом используется вызов функции millis(), чтобы узнать, сколько времени прошло, и подождать 60 000 миллисекунд (60 секунд).


Я поместил код в setup, потому что именно туда вы один раз помещаете все, что хотите.

,

0

Другой способ справиться с этой проблемой — использовать переменную endTime, чтобы сообщить циклу, когда следует прекратить перемещение сервопривода:

unsigned long endTime;

void setup()
{
  myservo.attach(5);
  endTime = millis() + 60000;
}

void loop()
{ 
  if (millis() <= endTime) {
    myservo.write(45);
    delay(1000);
    myservo.write(125);
    delay(1000); 
  } else {
    //код для запуска после завершения работы сервопривода
  }
}

Этот код будет перемещать сервопривод взад и вперед примерно на 1 минуту, а затем остановится. Он настроен так, что после завершения цикла вы можете сделать что-то еще.

Обратите внимание, что, используя переменную endTime и оставив свой сервокод в функции цикла(), вы можете заставить вашу программу начать делать что-то еще после завершения движения двигателя. Вы также можете добавить код для установки нового значения в EndTime, после чего сервопривод снова начнет двигаться вперед и назад.

Также обратите внимание, что использование задержки — плохая практика. Когда вы это сделаете, вы полностью остановите Arduino, пока работает код задержки. Ты не можешь заниматься чем-то другим. Скажем, например, вы хотите переместить два разных сервопривода через разные промежутки времени.

Вместо использования задержек вам следует отслеживать время окончания каждой фазы цикла и выполнять код по истечении этого времени.

,

Этот код будет перемещать сервопривод на одну минуту каждые 49,7 дней., @Edgar Bonet

Да, я полагаю, это правда, если вы подключили Arduino так долго. (Сейчас я в основном работаю на 64-битных платформах, где беззнаковый длинный размер составляет 64 бита, достаточно длинный, чтобы приведенный выше код запускался только один раз в жизни меня или моих внуков.) Было бы довольно легко добавить логическое значение к приведенному выше коду, чтобы полностью выключайте его, когда он не используется., @Duncan C