Как могу остановить цикл через 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);
}
Спасибо!
@Adri47, 👍0
Обсуждение3 ответа
Чтобы ответить на ваш вопрос, добавьте это в loop()
:
if (millis() >= 60000) exit(0);
Однако я бы посоветовал вам серьезно задуматься над комментарием Джота: просто
остановка выполнения loop()
в большинстве случаев не является тем, что вы можете
хочу сделать.
Как предложил Джот в комментарии, один из способов — просто делать то, что вы хотите (что занимает примерно две секунды на итерацию) в цикле, например:
#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
, потому что именно туда вы один раз помещаете все, что хотите.
Другой способ справиться с этой проблемой — использовать переменную 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
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Вы задаете неправильный вопрос. Функция цикла работает вечно. Сколько раз вы хотите, чтобы сервопривод перемещался между этими значениями? Если это, например, 30 раз, вы можете поместить оператор for в функцию настройки и использовать функцию пустого цикла., @Jot
что ты делаешь, если хочешь отварить яйца в течение одной минуты? ....делаем то же самое в программе, @jsotola
Большое спасибо!!!! это было именно то, что мне нужно!! Раньше я также пытался запустить сервопривод и шаговый двигатель одновременно, и именно это и произошло: шаговый двигатель блокировал сервопривод, и я не понимал, почему !! огромное спасибо за объяснение, действительно помогло!!, @Adri47
Чье объяснение вы благодарите? Поля для ответов не предназначены для комментариев. Я перенесу ваш ответ в комментарий под вашим вопросом. Я рад, что кто-то из нас помог тебе. :), @Nick Gammon