Как запустить цикл на определенное время?

В настоящее время у меня есть цикл for, который повторяется 300 раз, а затем движется дальше.

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

Вот текущий цикл для справки.

for(int i = 1; i<300; i++){
  if (kill() == true){ break; }

  strip.setPixelColor(1, strip.Color(random(100,255),random(100,255),random(100,255)));
  strip.show();

  tone(TONE, notes[random(0,3)]);
  delay(100);
}

Кроме того, у меня есть RTC, который используется где-то в приложении, поэтому реальное время доступно для использования, если это имеет смысл... хотя я хотел бы узнать, как сделать это без RTC. модуль для будущих проектов.

, 👍5

3 ответа


Лучший ответ:

9

Вот пример, который будет работать в течение 5 минут. Обратите внимание, что выполнение цикла начнется в любое время до истечения лимита времени, в том числе за 1 мс; он не может отрезать что-то, происходящее на 5-минутной отметке, а это означает, что точность синхронизации будет ограничена длительностью кода в цикле.

Обновление: в моем первом предложении была ошибка, связанная с периодом пролонгации часов millis() в 50 с лишним дней. Этот более надежен:

uint32_t period = 5 * 60000L;       // 5 минут

for( uint32_t tStart = millis();  (millis()-tStart) < period;  ){
   doStuff();
   moreStuff();
}
,

2

Вы можете использовать переменную, которая увеличивается при каждом выполнении цикла, тогда вам нужно только изменить цикл с использования for на while.

Например:

   int incremented_variable = 0;
   int incremented_value = 100;
   int max_value = 1000;  

   while(incremented_variable < max_value){
   if (kill() == true){ break; }

   strip.setPixelColor(1, strip.Color(random(100,255),random(100,255),random(100,255)));
   strip.show();

   tone(TONE, notes[random(0,3)]);

   delay(100);
   incremented_variable = incremented_variable + incremented_value;
   }

EDIT: я только что прочитал ваше обновление по этому вопросу.

Затем вы можете использовать while с логическим флагом, который поможет вам завершить цикл, или, если хотите, вы можете отслеживать время, вызвав метод: millis(). р>

,

3

В этом примере:

http://playground.arduino.cc/Code/ElapsedMillis

Вы можете попробовать что-то вроде:

#include <elapsedMillis.h>

elapsedMillis timeElapsed;
unsigned int interval = 60000; // одна минута в мс

while(timeElapsed < interval){
    //делаем что-то
}

В зависимости от того, насколько точным вы хотите быть, вы можете выбрать аналогичный метод с использованием RTC.

,