Периодическое выполнение функций
- Войдите на сайт для отправки комментариев
Втр, 09/09/2014 - 21:11
Здравствуйте!
К сожалению не нашел предыдущей своей темы, пожтому создал новую.
Будучи новичком в программировании худо-бедно написал программку, одной из целе которой является включение и выключение полива. Например 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 секунд от заданных интервалов паузы и длительности полива.
Не могу понять в чем проблема. Посему прощу помощи у знатоков.
Заранее благодарен!
Ой а вам не приходила в голову мысль вставить serial.print и посмотреть чего оно там вообще?
а нафига постоянно обновлять дату например? какой в этом смысл?
для света добавь флаг, чтобы не включать его постоянно
ну и так далее
а нафига постоянно обновлять дату например? какой в этом смысл?
для света добавь флаг, чтобы не включать его постоянно
ну и так далее
Вот ты вопросы ставишь. Тут вообще ардуино нафига?
как без ардуины. это сейчас круче сумочки от гуччи или айпада. можно легко говорить вот запрограммировал, сделал сам свое устройство. девочки так и липнуть будут)) сам таймер сделал
а вообще почему бы и нет, работает же, переделать только
принципиальный вопрос - а на длительности 45 минут погрешность 5 секунд вообще принципиальна? урожайность страдает?
ds1307 вообще-то точностью не отличается, если хочется чтобы было с привязкой к гринвичу, то надо синхронизацию по сети делать
принципиальный вопрос - а на длительности 45 минут погрешность 5 секунд вообще принципиальна? урожайность страдает?
Конечно. Вишня перестает колоситься.
нет конечно. но откуда погрешность если используются часы реального времени, бред, проблема в коде
а растениям пофигу
часы "реального времени" имеют свойство убегать вперед или отставать, а у ds1307 это свойство особенно развито
Да в общем то никак урожайность не пострадает. Просто интересно почему так происходит. Все таки приятно, когда все работает как задуманно.
нет конечно. но откуда погрешность если используются часы реального времени, бред, проблема в коде
а растениям пофигу
Повторюсь, растениям да-пофигу на эти 5 секунд. И опять же повторюсь, приятро когда задуманное реализуется. По поводу кода - поэтому и пишу сюда, т.к. код очень далек от идеала. Хотелось бы все таки увидеть какие то конкретные замечания.
как без ардуины. это сейчас круче сумочки от гуччи или айпада. можно легко говорить вот запрограммировал, сделал сам свое устройство. девочки так и липнуть будут)) сам таймер сделал
а вообще почему бы и нет, работает же, переделать только
Вот Вы смеетесь а ведь по сути ни одно хобби не оправдано. Так же как и покупка сумочки от гуччи. Только на гуччи мода пройдет, а хобби останется и будет дарить удовольствие.
Вот Вы смеетесь а ведь по сути ни одно хобби не оправдано.
Про спорт слышали? ;)
так я уже делал предложения но ты же их проигнорил
так я уже делал предложения но ты же их проигнорил
Ничуть не проигнорировал. за совет спасибо! Сейчас изучаю как пользоваться флагами. Пока не совсем разобрался как это работает.
Вот Вы смеетесь а ведь по сути ни одно хобби не оправдано.
Про спорт слышали? ;)
Вы про что?
надо добавить переменную типа boolean. когда что то сделали изменяете флаг. при следующей проверке чтобы не делать тоже самое (то что внутри функции) просто в условии надо добавить еще одно условие на флаг, типа если флаг равен тому то только тогда выполнять, если нет пропускать. и все
например делаете перменные byte с прошлым значением года дня месяца. и периодически проверяете с настоящими. если есть изменения флаг = 1
обновление даты на дисплее: если флаг равен 1 обновляем на дисплее дату, флаг выставляем в ноль, переменные с прошлыми значениями заменяем текущими
новое срабатывание будет через сутки, обновлятся постоянно не будет
Вот Вы смеетесь а ведь по сути ни одно хобби не оправдано.
Про спорт слышали? ;)
Вы про что?
Хобби - спорт - оправдано, ибо здоровье.
хобби - ардуино - оправдано, ибо самоудовлетворение :)
Вот Вы смеетесь а ведь по сути ни одно хобби не оправдано.
Про спорт слышали? ;)
Вы про что?
Хобби - спорт - оправдано, ибо здоровье.
Аааа... Я не совсем правильно выразился. Я про финансовую сторону писал - хобби финансово не оправдано так же как и покупка сумочки Гуччи за 5К евро. Но в отличие от сумочки Гуччи, финансовая неопраданность от хобби с лихвой покрывается удовольствием от увлечения. Как то так. Писака из меня никакой =)
ТС теперь ты сам в своей теме флудишь))
ТС теперь ты сам в своей теме флудишь))
Извиняюсь =) больше не буду
хобби - ардуино - оправдано, ибо самоудовлетворение :)
Этак вы щас научное оправдание для сексшопов выведите.