Работа кода по времени

mrbin
Offline
Зарегистрирован: 01.02.2015

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

перешел во вторую часть кода,отработал еще одну минуту и отключился

void loop() {
  
 //цикл выполняется пока время не достигло endtime
  if (millis()<endtime) {

// если срабатывает 1 ИК-датчик
  if(digitalRead(lev_vik ) == LOW )
  {
 ROB_LEVEE(); 
 
  }
else if(digitalRead(lev_vik) == HIGH )
{
 ROB_LEVEE(); 
 
}
  }
 
 if (endtime<millis()) {
 ROB_STOP();  
}

вот первый кусок отрабатывает и останавливается,но как зделать что бы на второй режим перешел,еще минуту отработал и остановился

 

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

mrbin пишет:

вот первый кусок отрабатывает и останавливается,но как зделать что бы на второй режим перешел,еще минуту отработал и остановился

Ответ содержится в самом вопросе: если хотите обеспечить более одного режима, введите переменную, обозначающую номер текущего режима.

mrbin
Offline
Зарегистрирован: 01.02.2015

переменую понятно,как зделать что бы он переходил на другую часть кода,как сравнивать? 

 

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

<>==

mrbin
Offline
Зарегистрирован: 01.02.2015

это мне не о чем не говорит,можно по подробней,я плохо в этом понимаю

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Я бы сделал так:

 

unsigned long endtime;

void setup()
{
  endtime = millis(); 
}

void loop()
{  
  if((millis() - endtime) < 60000)
    {
      //todo foo();  
    }
  else
    {
      endtime = millis();
      //todo foo();  
    }
}

Потом, вы проверяете вход, но независимо от его значения выполняете одну и туже функцию ...

mrbin
Offline
Зарегистрирован: 01.02.2015

Спасибо !

mrbin
Offline
Зарегистрирован: 01.02.2015

я так и не понял как это работает

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

mrbin пишет:

я так и не понял как это работает

1. В setup переменной endtime присваивается текущее значение millis

2. В loop каждый раз проверяется текущее значение millis c ранее присвоенным значением переменной endtime и как только значение millis превысит endtime на 60000, то уходим на else, где переменной endtime вновь присваивается текущее значение millis ...

Как теперь, понятно? :) Я даже сам понял! :)

mrbin
Offline
Зарегистрирован: 01.02.2015

сам код где должен работать?

 

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

mrbin пишет:

сам код где должен работать?

Какой код?

mrbin
Offline
Зарегистрирован: 01.02.2015

это понятно,тот код что я в пример прел он работает нормально как положено,мне не понятно,как зделать что бы после окончания времени первого режима,перешел на второй режим,

mrbin
Offline
Зарегистрирован: 01.02.2015
// если срабатывает 1 ИК-датчик
  if(digitalRead(lev_vik ) == LOW )
  {
 ROB_LEVEE(); 
 
  }
else if(digitalRead(lev_vik) == HIGH )
{
 ROB_LEVEE(); 
 
}

само действие

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

mrbin пишет:

// если срабатывает 1 ИК-датчик
  if(digitalRead(lev_vik ) == LOW )
  {
 ROB_LEVEE(); 
 
  }
else if(digitalRead(lev_vik) == HIGH )
{
 ROB_LEVEE(); 
 
}

само действие

Вы сами-то поняли, что написали?

Что произойдет, если lev_vik == HIGH? А что произойдет, если lev_vik == LOW? Отвечаю - ОДНО И ТОЖЕ

mrbin
Offline
Зарегистрирован: 01.02.2015

это все правильно,это так и надо

mrbin
Offline
Зарегистрирован: 01.02.2015
// если срабатывает 1 ИК-датчик
  if(digitalRead(lev_vik ) == LOW )
  {
 ROB_PRAV() ;
 
  }
else if(digitalRead(lev_vik) == HIGH )
{
 ROB_LEVEE(); 
 
}

 

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

mrbin пишет:

это все правильно,это так и надо

Как же правильно, если исправили!!!?????

Так вот, свой код вставляете вместо первого foo(), а вместо второго foo() вставляете ROB_STOP()

mrbin
Offline
Зарегистрирован: 01.02.2015
void loop() {
  if((millis() - endtime) < 1000)
  {
// если срабатывает 1 ИК-датчик
  if(digitalRead(lev_vik ) == LOW )
  {
 ROB_PRAV() ;
 
  }

else if(digitalRead(lev_vik) == HIGH )
{
 ROB_LEVEE(); 
 
}
  
  
  else
    {
      endtime = millis();
      ROB_STOP() ;
    }
}
  
}

не идет

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

mrbin пишет:

void loop() {
  if((millis() - endtime) < 1000)
  {
// если срабатывает 1 ИК-датчик
  if(digitalRead(lev_vik ) == LOW )
  {
 ROB_PRAV() ;
 
  }

else if(digitalRead(lev_vik) == HIGH )
{
 ROB_LEVEE(); 
 
}
  
  else
    {
      endtime = millis();
      ROB_STOP() ;
    }
}
  
}

не идет

Кошмар ... предпоследняя фигурная скобка к чему относится?

mrbin
Offline
Зарегистрирован: 01.02.2015

без нее ошибка

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Понятно дело, ее просто нужно переместить и поставить перед последним else

mrbin
Offline
Зарегистрирован: 01.02.2015

да так оно правильно,только когда она стоит перед предпоследним else он вообще не запускается

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

mrbin пишет:

да так оно правильно,только когда она стоит перед предпоследним else он вообще не запускается

Прочтите еще раз #20 - где вы увидели слово "предпоследний"?

mrbin
Offline
Зарегистрирован: 01.02.2015

 перед последним

mrbin
Offline
Зарегистрирован: 01.02.2015

вернее запускается,но через заданное время не остонавливается

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Да, пардон, закомментируйте строчку endtime = millis() в последнем else

mrbin
Offline
Зарегистрирован: 01.02.2015

вот теперь идет,спасибо

mrbin
Offline
Зарегистрирован: 01.02.2015

Скажите как теперь  после первого режима перешел во второй,тоже на определенное время

JasKo
Offline
Зарегистрирован: 21.11.2015

mrbin пишет:

Скажите как теперь  после первого режима перешел во второй,тоже на определенное время

Вот так

int Status = 0; 
unsigned long Time = 0;
#define TIMERUN 60000

void setup() {

}

void loop() {
  if (Status == 0){
    Status++;
    Time = millis();
  }
  if (Status == 1 && millis() - Time <= TIMERUN){
    // Здесь код который должен выполняться в течении первой минуты
  } else if (Status == 1 && millis() - Time > TIMERUN) {
    Status++;
    Time = millis();
  }
  if (Status == 2 && millis() - Time <= TIMERUN){
    // Здесь код который должен выполняться в течении второй минуты
  } else if (Status == 2 && millis() - Time > TIMERUN) {
    Status++;
    Time = millis();
   }
}

 

mrbin
Offline
Зарегистрирован: 01.02.2015

Большое вам спасибо!

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

mrbin пишет:

Скажите как теперь  после первого режима перешел во второй,тоже на определенное время

Можно задать два временных интервала - endtime и stoptime. В первом if проверять endtime, в последнем else дополнительно проверять сумму endtime и stoptime

mrbin
Offline
Зарегистрирован: 01.02.2015

Спасибо вам все работает исправно

mrbin
Offline
Зарегистрирован: 01.02.2015

Пример можете показать?

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011
unsigned long endtime;

void setup()
{ 
  endtime = millis();
}

void loop()
{  
  if((millis() - endtime) < 4000)
    {
      //todo foo1();
      digitalWrite(13,HIGH);  
    }
  else
    {      
      if((millis() - endtime) < 5000)
      {
        //todo foo2();
        digitalWrite(13,LOW);         
      }
      else
      {
        endtime = millis();
      }        
    }
}

Вариантов много, вот один из них

mrbin
Offline
Зарегистрирован: 01.02.2015

Благодорю за помощь ,буду изучать.