Функция задержки
- Войдите на сайт для отправки комментариев
Чт, 04/05/2017 - 04:50
Здаров народ. столкнулся с проблемой и не знаю решить.
нужна для кода задержка (для различных функций, например полив, проверка температуры, влажности и тд)
я попытался сделать функцией
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. может есть библиотека какая удобная, которая может помоч осущиствить задержку так, что бы можно было сделать ка каждую функцию задержку и что бы эта задержка не мешала другим(как у меня, выполняется только с самой наименьшей задержкой, остальные игнорируются)
Ну тут все просто.
Вы создали одну функцию а вызываете ее три раза для проверки разных интевалов, какой первым наступил, тот первым previousMillis и обновил, а остальным не судьба.
Тут либо делайте три функции, либо оформляйте функцию как класс, что естественно не приведет к экономии памяти, к которому вы стремились. Можно еще создать массив previousMillis и передавать его элемент параметром в функцию.
класс титановый велосипед для delay без delay().
класс титановый велосипед для delay без delay().
Рекомендую присмотреться к сообщению http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-delay-bez-delay#comment-230335
ну или https://github.com/DetSimen/Arduino-
как раз для опроса разных даччиков. Обращайся, помогу, еслишто.
если без лишних заморочек
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); ////////////////////конец поливки/////////////////////////////////////////////////// }