Функция задержки

suiginto
suiginto аватар
Offline
Зарегистрирован: 04.05.2017

Здаров народ. столкнулся с проблемой и не знаю решить.
нужна для кода задержка (для различных функций, например полив, проверка температуры, влажности и тд)
я попытался сделать функцией 
 

const byte DVV = A0;   //пин Датчика влажности воды
int ZDVV;      //Значение Датчика влажности воды
const byte N = 4;    //пин Насоса

void setup() 
{ Serial.begin(9800);
}

void loop() 
{
//  poliv();

  if(timer(5000) ==  true) {
       poliv();      //а тут проверка освещения
 Serial.println('1');
  }
  if(timer(10000) ==  true) {
     poliv();    // тут полив
 Serial.println('2');
  }
   if(timer(1000) ==  true) {
    poliv();       //тут например проверка температуры
 Serial.println('3');
  } 
}

void poliv() 
{
  ////////////////////////поливка///////////////////////////////////////////////////
  ZDVV = analogRead(DVV); //
  Serial.println(ZDVV);    //вывод влажности почвы в консоль
  delay(200);
  if(ZDVV < 700) digitalWrite(N, HIGH); //проверка влажности почвы
  else digitalWrite(N, LOW);
  ////////////////////конец поливки///////////////////////////////////////////////////
  
}
bool timer(int zaderjka)
{
  static unsigned long previousMillis = 0;        // храним время последнего переключения светодиода
  if(millis() - previousMillis > zaderjka) {
    previousMillis = millis();  
  return true;
  }
  else { return false;}
  }

собственно проблема в том что выполняется только   if(timer(1000) == true)  , вопрос: как сделать по красивому, без delay. может есть библиотека какая удобная, которая может помоч осущиствить задержку так, что бы можно было сделать ка каждую функцию задержку и что бы эта задержка не мешала другим(как у меня, выполняется только с самой наименьшей задержкой, остальные игнорируются)

 

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

Ну тут все просто.

Вы создали одну функцию а вызываете ее три раза для проверки разных интевалов, какой первым наступил, тот первым previousMillis и обновил, а остальным не судьба.

Тут либо делайте три функции, либо оформляйте функцию как класс, что естественно не приведет к экономии памяти, к которому вы стремились. Можно еще создать массив previousMillis и передавать его элемент параметром в функцию.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017
JasKo
Offline
Зарегистрирован: 21.11.2015
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ну или https://github.com/DetSimen/Arduino-

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

Alex_Mirko
Alex_Mirko аватар
Offline
Зарегистрирован: 16.05.2016

если без лишних заморочек

const byte DVV = A0;   //пин Датчика влажности воды
int ZDVV;      //Значение Датчика влажности воды
const byte N = 4;    //пин Насоса

unsigned long polivTime;
unsigned long svetTime;
unsigned long tempTime;

void setup()
{
  Serial.begin(9800);
  polivTime = millis();
  svetTime = millis();
  tempTime = millis();
}

void loop()
{
  //  poliv();

  if (millis() - polivTime > 5000) {
    poliv();      //а тут проверка освещения
    polivTime = millis();
    Serial.println('1');
  }
  if (millis() - svetTime > 10000) {
    poliv();    // тут полив
    svetTime = millis();
    Serial.println('2');
  }
  if (millis() - tempTime > 8000) {
    poliv();       //тут например проверка температуры
    tempTime = millis();
    Serial.println('3');
  }
}

void poliv()
{
  ////////////////////////поливка///////////////////////////////////////////////////
  ZDVV = analogRead(DVV); //
  Serial.println(ZDVV);    //вывод влажности почвы в консоль
  delay(200);
  if (ZDVV < 700) digitalWrite(N, HIGH); //проверка влажности почвы
  else digitalWrite(N, LOW);
  ////////////////////конец поливки///////////////////////////////////////////////////

}