Периодическое выполнение функций

kimdenisgerman.ch
Offline
Зарегистрирован: 25.08.2014

Здравствуйте!

К сожалению не нашел предыдущей своей темы, пожтому создал новую.

Будучи новичком в программировании худо-бедно написал программку, одной из целе которой является включение и выключение полива. Например 15 минут полив, 45 минут пауза между поливами.

Написал следующий код:

#include <Wire.h>
#include <OneWire.h>;
#include <RTClib.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <DallasTemperature.h>;

Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 7, 6);

RTC_DS1307 RTC;
DateTime myTime;

#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

const int RelayChn1=8;
const int RelayChn2=9;

//Освещение
int SttTime=8;
int StpTime=20;
//Помпа
int OnTime=20;
int OffTime=22;

int pauseInt=15; 
int OnInt=10; 

unsigned long currentTime;
unsigned long previousTime;

void setup()
{
  display.begin();
  display.setContrast(50);
  Wire.begin();
  RTC.begin();
  sensors.begin();

  pinMode(RelayChn1,OUTPUT);
  digitalWrite(RelayChn1,HIGH);
  pinMode(RelayChn2,OUTPUT);
  digitalWrite(RelayChn2,HIGH);
}


void loop() 
{ 
  DateTime myTime = RTC.now();
  sensors.requestTemperatures();

  display.setTextColor(BLACK);
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.print(myTime.hour(), DEC);
  display.print(":");
  display.print(myTime.minute(), DEC);
  display.print(":");
  display.print(myTime.second(),DEC);

  display.setTextColor(BLACK);
  display.setTextSize(1);
  display.setCursor(0, 8);
  display.print(myTime.day(), DEC);
  display.print("/");
  display.print(myTime.month(),DEC);
  display.print("/");
  display.print(myTime.year(),DEC);

  if (myTime.hour()>=SttTime && myTime.hour()<StpTime){
    digitalWrite(RelayChn1,LOW);
    display.setCursor(0,24);
    display.print("Light ON");
  }
  else
  {
    display.setCursor(0,24);
    display.print("Light OFF");
  }

  if (myTime.hour()>=OnTime && myTime.hour()<OffTime)
  {
    unsigned long currentTime=myTime.unixtime();

    if ((currentTime-previousTime)>OnInt){
      digitalWrite(RelayChn2,LOW);
      display.setCursor(0,32);
      display.print("Pump ON");

      if((currentTime-previousTime)>pauseInt)
        previousTime=currentTime;
    }
    else{
      digitalWrite(RelayChn2,HIGH);
      display.setCursor(0,32);
      display.print("Pump OFF");
    }
  }

  void TEMP();
  display.setCursor(0, 16);
  display.setTextSize(1);  
  display.print("Temp");

  display.setCursor(26,16);
  display.print(sensors.getTempCByIndex(0));

  display.display();
  display.clearDisplay();
}

За периодичность полива отвечют следующие строчки:

int PumpInt=15; 
int OnInt=10; 

и

  if (myTime.hour()>=OnTime && myTime.hour()<OffTime)
  {
    unsigned long currentTime=myTime.unixtime();

    if ((currentTime-previousTime)>OnInt){
      digitalWrite(RelayChn2,LOW);
      display.setCursor(0,32);
      display.print("Pump ON");

      if((currentTime-previousTime)>PumpInt)
        previousTime=currentTime;
    }
    else{
      digitalWrite(RelayChn2,HIGH);
      display.setCursor(0,32);
      display.print("Pump OFF");
    }

}

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

Не могу понять в чем проблема. Посему прощу помощи у знатоков.

Заранее благодарен!

 

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Ой а вам не приходила в голову мысль вставить serial.print и посмотреть чего оно там вообще?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а нафига постоянно обновлять дату например? какой в этом смысл?

для света добавь флаг, чтобы не включать его постоянно

ну и так далее

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

jeka_tm пишет:

а нафига постоянно обновлять дату например? какой в этом смысл?

для света добавь флаг, чтобы не включать его постоянно

ну и так далее


Вот ты вопросы ставишь. Тут вообще ардуино нафига?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

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

com
Offline
Зарегистрирован: 06.09.2013

принципиальный вопрос - а на длительности 45 минут погрешность 5 секунд вообще принципиальна? урожайность страдает?

ds1307 вообще-то точностью не отличается, если хочется чтобы было с привязкой к гринвичу, то надо синхронизацию по сети делать

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

com пишет:

принципиальный вопрос - а на длительности 45 минут погрешность 5 секунд вообще принципиальна? урожайность страдает?


Конечно. Вишня перестает колоситься.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

а растениям пофигу

com
Offline
Зарегистрирован: 06.09.2013

часы "реального времени" имеют свойство убегать вперед или отставать, а у ds1307 это свойство особенно развито

kimdenisgerman.ch
Offline
Зарегистрирован: 25.08.2014

Да в общем то никак урожайность не пострадает. Просто интересно почему так происходит. Все таки приятно, когда все работает как задуманно.

kimdenisgerman.ch
Offline
Зарегистрирован: 25.08.2014

jeka_tm пишет:

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

а растениям пофигу

Повторюсь, растениям да-пофигу на эти 5 секунд. И опять же повторюсь, приятро когда задуманное реализуется. По поводу кода - поэтому и пишу сюда, т.к. код очень далек от идеала. Хотелось бы все таки увидеть какие то конкретные замечания.

kimdenisgerman.ch
Offline
Зарегистрирован: 25.08.2014

jeka_tm пишет:

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

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

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

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

kimdenisgerman.ch][quote=jeka_tm пишет:

 Вот Вы смеетесь а ведь по сути ни одно хобби не оправдано.

Про спорт слышали? ;)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так я уже делал предложения но ты же их проигнорил

kimdenisgerman.ch
Offline
Зарегистрирован: 25.08.2014

jeka_tm пишет:

так я уже делал предложения но ты же их проигнорил

Ничуть не проигнорировал. за совет спасибо! Сейчас изучаю как пользоваться флагами. Пока не совсем разобрался как это работает.

 

kimdenisgerman.ch
Offline
Зарегистрирован: 25.08.2014

JollyBiber]</p> <p>[quote=kimdenisgerman.ch пишет:
jeka_tm пишет:

 Вот Вы смеетесь а ведь по сути ни одно хобби не оправдано.

Про спорт слышали? ;)

Вы про что?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

например делаете перменные byte с прошлым значением года дня месяца. и периодически проверяете с настоящими. если есть изменения флаг = 1

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

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

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

kimdenisgerman.ch]</p> <p>[quote=JollyBiber пишет:

kimdenisgerman.ch пишет:
jeka_tm пишет:

 Вот Вы смеетесь а ведь по сути ни одно хобби не оправдано.

Про спорт слышали? ;)

Вы про что?

Хобби - спорт - оправдано, ибо здоровье.

com
Offline
Зарегистрирован: 06.09.2013

хобби - ардуино - оправдано, ибо самоудовлетворение :)

kimdenisgerman.ch
Offline
Зарегистрирован: 25.08.2014

JollyBiber]</p> <p>[quote=kimdenisgerman.ch пишет:

JollyBiber пишет:

kimdenisgerman.ch пишет:
jeka_tm пишет:

 Вот Вы смеетесь а ведь по сути ни одно хобби не оправдано.

Про спорт слышали? ;)

Вы про что?

Хобби - спорт - оправдано, ибо здоровье.

Аааа... Я не совсем правильно выразился. Я про финансовую сторону писал - хобби финансово не оправдано так же как и покупка сумочки Гуччи за 5К евро. Но в отличие от сумочки Гуччи, финансовая неопраданность от хобби с лихвой покрывается удовольствием от увлечения. Как то так. Писака из меня никакой =)  

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ТС теперь ты сам в своей теме флудишь))

kimdenisgerman.ch
Offline
Зарегистрирован: 25.08.2014

jeka_tm пишет:

ТС теперь ты сам в своей теме флудишь))

Извиняюсь =) больше не буду

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

com пишет:

хобби - ардуино - оправдано, ибо самоудовлетворение :)


Этак вы щас научное оправдание для сексшопов выведите.