Выполнение цикла определённое время

Roman2344
Offline
Зарегистрирован: 09.09.2015

Сообственно нужно что цикл который должен выполняться 7 минут, в цикле в это время будет всё время идти проверка условий if else. Чёто в голову ничего так не приходит

Набросал такое бред конечно:

int ten=5;
int t=A0;
int t2=233;
int t1=0;
int timer=0;
void setup() {
pinMode(ten, OUTPUT);
pinMode(t, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
while(timer<delay(60000);delay(60000);delay(60000);delay(60000);delay(60000);delay(60000);delay(60000);)
{t1=analogRead(t1);
delay(40);
  if(t1<t2)){
  digitalWrite(ten,1)}
else if(t1>t2){
digitalWrite(ten,0)
  
}
timer++;
}

}

 

Roman2344
Offline
Зарегистрирован: 09.09.2015

Бред из - за того что в переменную INT  НЕ ВОЗМОЖНО ЖЕ ЗАПИСАТЬ ЧИСЛО БОЛЬШЕ 255, НУЖНЫ КАКИЕ - ТО ДРУГИЕ ОПЕРАТОРЫ МОЖЕТ MICROS  КАК - ТО ПРИМЕНИТЬ?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Вам поможет функция unsigned long millis(void); и пример BlinkWithoutDelay. А также много тем было на форуме на эту тему.

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015
long loopTime = 420000; // 7 минут
 
void setup()
{
}
 
void loop()
{
  unsigned long currentMillis = millis();
  while(millis()-currentMillis<=loopTime)
  {
    if(условие)
      действие
  }
}

АА лучше вайл вообще убрать, есть же уже loop тот же цикл. Проверять время через миллис на каждом цикле и если еще не вышло выполнять другие ифы

Roman2344
Offline
Зарегистрирован: 09.09.2015

Penni Спасибо. 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Так а смысл в цикле который будет выполняться один раз, проще в этот вайл добавить условие через И, тогда этот вайл выполнится  за 7мь минут и больше не  будет выполняться.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Roman2344 пишет:

Бред из - за того что в переменную INT  НЕ ВОЗМОЖНО ЖЕ ЗАПИСАТЬ ЧИСЛО БОЛЬШЕ 255, 

Да, нет, бред здесь совсем по другой причине.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Два решения тут, только не в коем случае не читайте ни одного сообщения ни сверху ни снизу.
И даже в этом ничего не читайте. Просто забирайте готовый код.

http://arduino.ru/forum/programmirovanie/zaderzhka-bez-delay-i-perepolne...

А читать надо классику:
http://alxarduino.blogspot.ru/2013/09/BlinkAndPrintWithoutDelay.html
http://alxarduino.blogspot.ru/2013/09/ComfortablyBlinkWithoutDelay.html

 

Roman2344
Offline
Зарегистрирован: 09.09.2015

А если мне надо два цикла выполнить один с одним временем второй с другой со вторым. Так пойдёт?

long loopTime = 420000; // 7 минут
 long loopTime2 = 100000; // 1,4 минут
void setup()
{
}
 
void loop()
{
  unsigned long currentMillis = millis();
  while(millis()-currentMillis<=loopTime)
  {
    if(условие)
      действие
  }

   unsigned long currentMillis = millis();
  while(millis()-currentMillis<=loopTime2)
  {
    if(условие)
      действие
  }
}

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Тогда уж так

#define interval1 420000 // 7 минут
#define interval2 100000 // 1,4 минут
void setup()
{
}
unsigned long time=0, timer1=0, timer2=0;
void loop()
{
  time= millis();
  if(time-timer1>interval1)
  {
    timer1=time;
    if(условие) действие
  }

  if(time-timer2>interval2)
  {
    timer2=time;
    if(условие) действие
  }
}

 

Roman2344
Offline
Зарегистрирован: 09.09.2015

Andy, этот скетч не работает

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Andy пишет:

Тогда уж так

#define interval1 420000 // 7 минут
#define interval2 100000 // 1,4 минут
void setup()
{
}
unsigned long time=0, timer1=0, timer2=0;
void loop()
{
  time= millis();
  if(time-timer1>interval1)
  {
    timer1=time;
    if(условие) действие
  }

  if(time-timer2>interval2)
  {
    timer2=time;
    if(условие) действие
  }
}

Нет, не так!
Вы присваиваете переменной значение миллиса,
но пока вы делаете свои "действия", а они могут быть и сильно длительными,  миллис уже сильно изменится.
Я думаю лучше запрашивать  миллис каждый раз напрямую и именно тогда когда он понадобился.
Это как глянуть на часы.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

trembo пишет:
Вы присваиваете переменной значение миллиса,
но пока вы делаете свои "действия", а они могут быть и сильно длительными,  миллис уже сильно изменится.
Это смотря какая цель преследуется. Если действие нужно выполнять каждые ххх секунд, то именно так как у меня, а если пофиг то можно и так, как trembo предлагает. Кроме того "действия" не могут быть длительными, иначе все встанет. Основной цикл должен ходить.

Roman2344
Offline
Зарегистрирован: 09.09.2015
Сделал я так всё работает
long loopTime = 420000; // 7 минут
 long loopTime2 = 100000; // 1,4 минут
void setup()
{
}
 
void loop()
{
  unsigned long currentMillis = millis();
  while(millis()-currentMillis<=loopTime)
  {
    if(условие)
      действие
  }

   unsigned long currentMillis2 = millis();
  while(millis()-currentMillis2<=loopTime2)
  {
    if(условие)
      действие
  }
}

 

Roman2344
Offline
Зарегистрирован: 09.09.2015

Всем спасибо).

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

К циклу while  какие-то смутные подозрения.....

Что работает?

Вы используете while  пока не совпало.
И сидите в этом цикле.
Вам что время некуда девать?
Тогда delay применяйте....

Ваш код слегка подправленный, чтобы не ждать долго:


long loopTime = 20000; // 20 seconds
 long loopTime2 = 10000; // 10 seconds
void setup()
{
  Serial.begin ( 115200);
}
 
void loop(){
Serial.println ("Loop  begin ");

  unsigned long currentMillis = millis();
  while(millis()-currentMillis<=loopTime)
  {
  
  }
 Serial.println ("First while end"); 
   unsigned long currentMillis2 = millis();
  while(millis()-currentMillis2<=loopTime2)
  {
   
  }
  Serial.println ("Second while end");
  
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

trembo пишет:

Тогда delay применяйте....

Нармальные поцаны delay не пользуют :))))))))))))

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Это шутка, конечно, но устраивать цикл с выходом из него по ИФ или по времени.....
А потом другой такой-же.....

Ну если ничего другого не нужно делать, тогда конечно можно....
А вдруг ещё что-то понадобиться? А мы не в том цикле.....

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Кстати, о делэе. Вчерась полез в штатные файлы AVR Studio. Там есть delay на основе AVRCLib. Так вот, у делэя параметр имеет тип double! Я чуть со стула не свалился. Это ж надо, блин, подогнать такую огромную библиотеку (плавающую точку) ради одного дурацкого числа только потому, что лень всё в целых числах аккуратно прописать. А ведь AVR Studio - это тебе на Arduino IDE, сделанная изначально для чайников - это профессиональная среда разработки! Я охреневаю, дорогая редация!

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

.......но на платформе Arduino, double и float имеют  одинаковую точность......

точность нам, конечно, не важна, зато дипазон для дэлэя просто поражает!

Диапазон значений — от -3.4028235E+38 до 3.4028235E+38     Это-ж скоко-то будет, а????????
Кто считать умеет, помогите!

;)
 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

trembo пишет:

.......но на платформе Arduino, double и float имеют  одинаковую точность......

Да, плевать на точность. Факт использования плавающей точки, это + полтора килобайта к размеру программы сразу! Чего там нельзя было целыми сделать? Помнится, прибалдел оттого, как в библиотеке DallasTemperature флоат завели, чтобы результат вернуть, но там хоть "для чайников", а здесь-то типа "профессиональная среда", блин.

trembo пишет:

Диапазон значений — от -3.4028235E+38 до 3.4028235E+38     Это-ж скоко-то будет, а????????

Во-во, надули с диапазоном - он там как раз довольно скромный :(

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Дошел до

Roman2344 пишет:

int ten=5;

Дальше читать не стал.

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

andriano пишет:

Дальше читать не стал.

зря - там ещё интересней 

while(timer<delay(60000);delay(60000);delay(60000);delay(60000);delay(60000);delay(60000);delay(60000);)

Roman2344
Offline
Зарегистрирован: 09.09.2015

andriano пишет:

Дошел до

Roman2344 пишет:

int ten=5;

Дальше читать не стал.

 

И что тут не так?