Поливалка. Работает. Есть пара вопросов, кто опытный, помогите, пожалуйста.
- Войдите на сайт для отправки комментариев
День добрый всем!
прошу Вашей консультации по двум вопросам. Если коротенько... В прошлом году сделал полив теплиц автоматом на 555 таймерах, работало весь сезон, урожай фантастический, жена в восторге, выдала спич"хочу все чтобы так поливалось". Пришлось срочно осваивать контроллеры. Что было надо:
1. Полив утром 8+ грядок по очереди, две теплицы поливаются всегда, остальные по датчику влажности.
2. минимальное меню, только набор времени полива
3. после старта дисплей гаснет и не включается до сброса.
Нагло спер у wgaint код таймера в обратную сторону и на его основе сляпал свой код, в качестве дисплея выступает ТМ1638 - знатная штука с 8 кнопками и 2 7-ми сегментными индикаторами. Так как я новичок, стаж мой всего 2 месяца, получится то все вроде получилось. Однако есть пара вопросов к асам. Если не трудно, прошу Вас просветить)). Есть два вопроса:
1. Как быстро переполнится таймер контроллера при круглосуточном использованиии устройства?
2. Как сделать повторный опрос датчика света? У меня выполняется цикл do....while , после выхода из цикла нужно сделать паузу в секунду и вновь опросить датчик. Если условие верно, то включается полив, если нет, то нужно вновь вернутся в цикл do....while и снова ждать. Головой понимаю, как сделать, но не получается(( Просьба сильно не пинать, я только учусь). Заранее спасибо!
//система автополива на 8 грядок, первые две без, а все остальные с датчиком дождя //устанавливается один раз с записью в епром, чтобы поменять время полива надо нажать кнопку сброс и вновь выставить //время полива на нужном реле поливается утром, раз в сутки. #include <EEPROM.h> #include <InvertedTM1638.h> #include <TM1638.h> #include <TM1638QYF.h> #include <TM1640.h> #include <TM16XX.h> #include <TM16XXFonts.h> #include <TM1638.h> // define a module on data pin 8, clock pin 9 and strobe pin 7 TM1638 module(8, 9, 7); #define irm A1 //датчик влажности #define pwr 2 //датчик влажности power #define light A0 //датчик света #define irrig1 12 //полив реле 1 #define irrig2 13 //полив реле 2 #define irrig3 11 #define irrig4 10 #define irrig5 3 #define irrig6 4 #define irrig7 5 #define irrig8 6 unsigned long startTime; //время начала unsigned long loopTime; //время прошло unsigned long LimitTime = 0; //таймер int h=1;//номер реле int m=1;//количество минут int s=0; int x; int val; boolean running = false; //Флаг Запуска отсчета void setup(){ //установим режимы работы выходов и входов pinMode(irrig1,OUTPUT); pinMode(irrig2,OUTPUT); pinMode(irrig3,OUTPUT); pinMode(irrig4,OUTPUT); pinMode(irrig5,OUTPUT); pinMode(irrig6,OUTPUT); pinMode(irrig7,OUTPUT); pinMode(irrig8,OUTPUT); pinMode(pwr,OUTPUT); pinMode(light,INPUT); pinMode(irm,INPUT); digitalWrite (irrig1,HIGH); digitalWrite (irrig2,HIGH); digitalWrite (irrig3,HIGH); digitalWrite (irrig4,HIGH); digitalWrite (irrig5,HIGH); digitalWrite (irrig6,HIGH); digitalWrite (irrig7,HIGH); digitalWrite (irrig8,HIGH); digitalWrite (pwr,HIGH); EEPROM.write(1,1); EEPROM.write(2,1); EEPROM.write(3,1); EEPROM.write(4,1); EEPROM.write(5,1); EEPROM.write(6,1); EEPROM.write(7,1); EEPROM.write(8,1); module.setupDisplay(true, 1); module.setLEDs(0x0000); // тушим свет module.clearDisplay(); //приветствие на 3 сек module.setDisplayToString("HELLO"); delay(3000); } void loop() { if (running == true){ module.setLEDs(0x0000); // тушим свет module.clearDisplay(); running = false; do { val = analogRead (light);//ждем день } while (val < 600); delay (1000); running = true; } if (running == true){ startTime = millis(); h = 1; m = EEPROM.read (1); LimitTime = m*60000; digitalWrite (irrig1,LOW); while(loopTime < LimitTime){ // сравниваем время прошло с вр окончания s = (LimitTime - loopTime)/1000; delay(500); loopTime = millis() - startTime; //вычисляем сколько времени прошло } running = false;//окончание работы таймера loopTime = 0; LimitTime = 0; s = 0; digitalWrite (irrig1,HIGH); delay (1000); running = true; } if (running == true) { startTime = millis(); h = 2; m = EEPROM.read (2); LimitTime = m*60000; digitalWrite (irrig2,LOW); while(loopTime < LimitTime){ s = (LimitTime - loopTime)/1000; delay(500); loopTime = millis() - startTime; } running = false; loopTime = 0; LimitTime = 0; s = 0; digitalWrite (irrig2,HIGH); digitalWrite (pwr,LOW);//включаем питание датчика влаги(реле) delay (1000); running = true; } if (running == true && analogRead (irm)>220) { //таймер запущен и датчик дождя сухой startTime = millis(); digitalWrite (pwr,HIGH);//выключаем питание датчика влаги(реле) h = 3; m = EEPROM.read (3); LimitTime = m*60000; digitalWrite (irrig3,LOW); while(loopTime < LimitTime){ s = (LimitTime - loopTime)/1000; delay(500); loopTime = millis() - startTime; } running = false; loopTime = 0; LimitTime = 0; s = 0; digitalWrite (irrig3,HIGH); digitalWrite (pwr,LOW); delay (1000); running = true; } if (running == true && analogRead (irm)>220) { startTime = millis(); digitalWrite (pwr,HIGH); h = 4; m = EEPROM.read (4); LimitTime = m*60000; digitalWrite (irrig4,LOW); while(loopTime < LimitTime){ s = (LimitTime - loopTime)/1000; delay(500); loopTime = millis() - startTime; } running = false; loopTime = 0; LimitTime = 0; s = 0; digitalWrite (irrig4,HIGH); digitalWrite (pwr,LOW); delay (1000); running = true; } if (running == true && analogRead (irm)>220) { startTime = millis(); digitalWrite (pwr,HIGH); h = 5; m = EEPROM.read (5); LimitTime = m*60000; digitalWrite (irrig5,LOW); while(loopTime < LimitTime){ s = (LimitTime - loopTime)/1000; delay(500); loopTime = millis() - startTime; } running = false; loopTime = 0; LimitTime = 0; s = 0; digitalWrite (irrig5,HIGH); digitalWrite (pwr,LOW); delay (1000); running = true; } if (running == true && analogRead (irm)>220) { startTime = millis(); digitalWrite (pwr,HIGH); h = 6; m = EEPROM.read (6); LimitTime = m*60000; digitalWrite (irrig6,LOW); while(loopTime < LimitTime){ s = (LimitTime - loopTime)/1000; delay(500); loopTime = millis() - startTime; } running = false; loopTime = 0; LimitTime = 0; s = 0; digitalWrite (irrig6,HIGH); digitalWrite (pwr,LOW); delay (1000); running = true; } if (running == true && analogRead (irm)>220) { startTime = millis(); digitalWrite (pwr,HIGH); h = 7; m = EEPROM.read (7); LimitTime = m*60000; digitalWrite (irrig7,LOW); while(loopTime < LimitTime){ s = (LimitTime - loopTime)/1000; delay(500); loopTime = millis() - startTime; } running = false; loopTime = 0; LimitTime = 0; s = 0; digitalWrite (irrig7,HIGH); digitalWrite (pwr,LOW); delay (1000); running = true; } if (running == true && analogRead (irm)>220) { startTime = millis(); digitalWrite (pwr,HIGH); h = 8; m = EEPROM.read (8); LimitTime = m*60000; digitalWrite (irrig8,LOW); while(loopTime < LimitTime){ s = (LimitTime - loopTime)/1000; delay(500); loopTime = millis() - startTime; } running = false;//окончание работы таймера loopTime = 0; LimitTime = 0; s = 0; digitalWrite (irrig8,HIGH); digitalWrite (pwr,LOW); delay (1000); running = true; } if (running == true){ digitalWrite (pwr,HIGH); running = false; do { val = analogRead (light);//ждем ночь } while (val > 500); delay (1000); running = true; } if (module.getButtons()==0b00000001){ //вход в меню show (); } else{ module.setLEDs(0xFFFF); byte btn= module.getButtons(); //опрашиваем кнопки switch (btn){ case 1: h++; //1-я добавить номер if (h > 8 ){ h = 1;} delay(300); show(); break; case 2: h--; //2 - убавить номер if (h < 1){ h = 8;} delay(300); show(); break; case 4: m++; //3-я добавить минут if (m > 59 ){ m = 0;} delay(300); show(); break; case 8: m--; //4-я убавить минут if (m < 0 ){ m = 59;} delay(300); show(); break; case 16: // установить значение и записать в память module.clearDisplay(); module.setDisplayToString("SAPIS"); delay(1000); set(); break; case 64: //7-я предпоследняя запускае процесс module.setLEDs(0x0000); module.clearDisplay(); module.setDisplayToString("StARt"); s =0; delay (1000); module.setLEDs(0x0000); module.clearDisplay(); running = true; break; } } } void timing()//для показа посекундно { m = s/60; s = s - m*60; } void show()//показ на дисплее { x = h/10; module.setDisplayDigit(x,0,0); x = h - x*10; module.setDisplayDigit(x,1,0); x = m/10; module.setDisplayDigit(x,3,0); x = m - x*10; module.setDisplayDigit(x,4,0); x = s/10; module.setDisplayDigit(x,6,0); x = s - x*10; module.setDisplayDigit(x,7,0); module.setDisplayToString("-",false,2); module.setDisplayToString("-",false,5); } void set()//запись в память { EEPROM.write (h,m); x = h/10; module.setDisplayDigit(x,0,0); x = h - x*10; module.setDisplayDigit(x,1,0); x = m/10; module.setDisplayDigit(x,3,0); x = m - x*10; module.setDisplayDigit(x,4,0); x = s/10; module.setDisplayDigit(x,6,0); x = s - x*10; module.setDisplayDigit(x,7,0); module.setDisplayToString("-",false,2); module.setDisplayToString("-",false,5); }
полив теплиц автоматом на 555 таймерах, работало весь сезон, урожай фантастический ... Пришлось срочно осваивать контроллеры
и вот тут началось!
Блин, ну работало же! Зачем чинить то, что не сломано?
а и сейчас все работает))) просто БП у меня 2А , на одновременный полив 8 грядок не хватит ни напора воды, ни денег на 10А блок питания)))
ХЗ, с одной стороны вроде идея здравая, с другой - такая штука в ЛО или севернее и работать то не будет до июля, а потом мотоциклист фарой в 3 часа ночи датчик засветит. Может RTC прикрутить и всегда знать, что утро наступило?
Так вот для этого и прошу подсказать !.
Как сделать повторный опрос датчика света? У меня выполняется цикл do....while , после выхода из цикла нужно сделать паузу в секунду и вновь опросить датчик. Если условие верно, то включается полив, если нет, то нужно вновь вернутся в цикл do....while и снова ждать
Я бы не стал писать, если бы сам допер)...
RTC думал прикрутить, но мозг пока еще плохо работает, как я уже говорил, контроллерами занялся 2 месяца как...
Так вы из него не выходите - проверьте, если true подняли флаг, подождали, проверили, если false - сбросили флаг и крутимся дальше, если true и флаг поднят, сбрасываем флаг и выходим с победой.
А жучок решит на датчике отдохнуть - решим, что ночь пришла?
поверьте, за весь сезон работы поливалки ни разу не было сбоя. А датчик я хочу спрятать сбоку металлического шкафчика, который будет висеть в теплице на отдельной стойке.. вот схема того, что было, сам придумал))))
но в данной схеме уже заложено ожидание в течении двух секунд после засветки датчика,
А поподробнее про флаг нельзя?
Дополнительная булева переменная flag или как Вам нравится. Принимает true-false и используется для хранения предыдущего состояния (в данном случае).
Что то вроде этого должно получится, running и используем вместо флага.
Спасибо, буду пробовать!
По нормальному конечно надо подтянуть навыки, использовать WDT (устройство само круглосуточно работает и если повиснет вы это нескоро узнаете) и ликвидировать основную массу делеев. Работать и с ними будет, но не кошерно.
И не могу понять, как Вы в меню попадаете с таким долгоиграющим кодом?
поверьте, за весь сезон работы поливалки ни разу не было сбоя. А датчик я хочу спрятать сбоку металлического шкафчика, который будет висеть в теплице на отдельной стойке.. вот схема того, что было, сам придумал))))
Диода шунтирующего реле нет, а на деле?
а и сейчас все работает))) просто БП у меня 2А , на одновременный полив 8 грядок не хватит ни напора воды, ни денег на 10А блок питания)))
Тысячу рублей на компьютерный блок питания нет? )))
Да, ладно, за 600 рублей трёхсотваттника за глаза хватит.
ua6em, ЕвгенийП, вы это, не говорите нам селянам про такие деньжищи. Зажрались в Москвах своих, понимашь. Я так 555 пока и в глаза не видал, 1006 обхожусь.))))
ua6em, ЕвгенийП, вы это, не говорите нам селянам про такие деньжищи. Зажрались в Москвах своих, понимашь. Я так 555 пока и в глаза не видал, 1006 обхожусь.))))
Я в ауле живу, высокогорном, с пенсии уж могу выделить пару тысяч на свои хотелки, пиво не пью, водку тоже, коньяк Арарат 1957 года не достать... а мерседес у меня ногайский...
а и сейчас все работает))) просто БП у меня 2А , на одновременный полив 8 грядок не хватит ни напора воды, ни денег на 10А блок питания)))
Тысячу рублей на компьютерный блок питания нет? )))
В принципе, ключевое препятствие упустили, все остальное вторично.
а и сейчас все работает))) просто БП у меня 2А , на одновременный полив 8 грядок не хватит ни напора воды, ни денег на 10А блок питания)))
Тысячу рублей на компьютерный блок питания нет? )))
В принципе, ключевое препятствие упустили, все остальное вторично.
А поливать лучше вечером, когда вода и почва прогреты и линзового эффекта не будет
ТС молчит, может капельный у него. Если дождеванием, согласен.
поливать утром тоже на каком то форуме научился?!! :)))
arDubino, а чем капельный полив плох утром, ночью и днем?
arDubino, а чем капельный полив плох утром, ночью и днем?
если в теплице наверно ничем.
а так наверно все вопросы к агрономам.
Тогда к чему был Ваш пост?
поверьте, за весь сезон работы поливалки ни разу не было сбоя. А датчик я хочу спрятать сбоку металлического шкафчика, который будет висеть в теплице на отдельной стойке.. вот схема того, что было, сам придумал))))
Диода шунтирующего реле нет, а на деле?
не нужен тут диод, все в микросхеме есть) данная схема работала сезон в двух теплицах, полив - капельный, ссылки на использованные устройства прилагаю, у меня не было проблем никаких, данная схема повторена неоднократно, все довольны))
http://ru.aliexpress.com/item/Sindax-HK4100F-DC12V-SHG-DC-12V-Coil-SPDT-6-Pin-PCB-General-Purpose-Power-Relay-5PCS/32633933096.html?spm=2114.13010708.0.99.OJQbZU
http://ru.aliexpress.com/item/Smart-Electronics-Soil-Moisture-Hygrometer-Detection-Humidity-Sensor-Module-For-arduino-Development-Board-DIY-Robot-Smart/32562744759.html?detailNewVersion=&spm=2114.13010708.0.115.OJQbZU
http://ru.aliexpress.com/item/New-12V-Electric-Solenoid-Valve-Magnetic-DC-N-C-Water-Air-Inlet-Flow-Switch-1-2/32699483604.html?spm=2114.03010208.3.124.ZSvGpA&ws_ab_test=searchweb201556_7,searchweb201602_5_10039_10048_10057_10047_10056_10055_10037_10049_10059_10033_10046_10058_10032_10045_10017_405_404_407_10040_10060,searchweb201603_6&btsid=86e55923-7903-4950-af71-a8b8f1622196
http://ru.aliexpress.com/item/E74-Free-Shipping-10Pcs-Garden-Irrigation-Misting-Micro-Flow-1-4-Hose-Dripper-Drip-Head/32602832113.html?spm=2114.03010208.3.37.1FwUQn&ws_ab_test=searchweb201556_7,searchweb201602_5_10039_10048_10057_10047_10056_10055_10037_10049_10059_10033_10046_10058_10032_10045_10017_405_404_407_10040_10060,searchweb201603_6&btsid=5ae90af7-156a-4757-983d-cafdb98d44cf
Дополнительная булева переменная flag или как Вам нравится. Принимает true-false и используется для хранения предыдущего состояния (в данном случае).
Что то вроде этого должно получится, running и используем вместо флага.
Огромное спавибо Вам!!
все работает.
прилагаю код, тестировал на столе сутки, сбоев нет...
простите, ошибка!
СПАСИБО!
теперь все точно)))
Да, ладно, за 600 рублей трёхсотваттника за глаза хватит.
проблема в том, что уже при одновременном поливе всего двух теплиц, время полива приходилось увеличивать почти в полтора раза, так что техзадание говорило однозначно - поочередное поливание грядок. Клапан ест 0,8 А, что не есть гуд. Применив поочередный полив я выиграл в деньгах прилично. Ато на мерседес не хватает, только на хаммер)))))
И все же повторюсь
1. Как быстро переполнится таймер контроллера при круглосуточном использованиии устройства?
1. Как быстро переполнится таймер контроллера при круглосуточном использованиии устройства?
какой из таймеров?
*если экономить время таймера, то лет на 300 может хватить. О_О
на сезон хватит?
на сезон хватит?
ты не ответил на вопрос.
1. Как быстро переполнится таймер контроллера при круглосуточном использованиии устройства?
какой из таймеров?
*если экономить время таймера, то лет на 300 может хватить. О_О
я новичок!!!
знаю только, что таймеров у контроллера два, для использования второго надо устанавливать библиотеку, так что вопрос звучал про используемый мной)
я новичок!!!
да, хоть пень - зачем мне это знать?
вопрос звучал про используемый мной)
какой таймер ты используешь?
я новичок!!!
да, хоть пень - зачем мне это знать?
вопрос звучал про используемый мной)
какой таймер ты используешь?
это не таймер контроллера.
значит, сезон проработает? сброс производить ежемесячно не надо?
значит, сезон проработает? сброс производить ежемесячно не надо?
значит, - ты не ответил на мой вопрос.
От Dimax это выглядит так:
От Dimax это выглядит так:
как это называется?
как это называется?
Таймер 1 ?
Вот спасибо!
все, что я хотел знать, это то, что при круглосуточной эксплуатации моей поливалки не придется сбрасывать контроллер раз в 58 дней.
Не придется....
Буду учить матчасть)))
все, что я хотел знать, это то, что при круглосуточной эксплуатации моей поливалки не придется сбрасывать контроллер раз в 58 дней.
кто тебе такое сказал?
Буду учить матчасть)))
Самое верное решение.))))
как это называется?
Таймер 2 ?
мы тут в угадайки играем?
TIMER1_OVF_vect
А это Ваш любимый второй:
А это Ваш любимый второй:
здесь:
аппаратный таймер 2 переполняется каждую секунду.
переменная t переполнится через 136 лет.
Тогда к чему был Ваш пост?
специально для умственноограниченных.
кактусы НЕ поливать :))))))
з.ы.
поливают обычно вечером. утром НЕ поливают потому что есть роса. днем не поливают потому что если жара то будет ожог. и за полив вечером потому что вода прогревается за день
Для особо одаренных, капельным поливом поливают и круглосуточно. Если сумеете летом найти утром росу в той же Астраханской губернии, вам Нобелевку выдадут. Если сумеете представить обожженые корни от капельного полива, вам за званием академика в Сельхозакадемию.