Умная теплица

kanibekasset
kanibekasset аватар
Offline
Зарегистрирован: 29.10.2013

какие детали я должен приобрести для начало? ну или вообще?

renoshnik
Offline
Зарегистрирован: 11.04.2013

Товарищу нужен был вот такое устройство http://gazon.net.ua/kontroller-hunter-xch-1200.html но цена уж слишком кусачая...

Поэтому принято решение заняться хэнд-мэйдом...

результат следующий...

настольная сборка....

https://www.dropbox.com/sh/45eomilihshx5z0/wJBA_blLS5/IMG_20130915_203605.jpg

https://www.dropbox.com/sh/45eomilihshx5z0/0oS-dJB0Pv/IMG_20130923_15310...

собираем в корпус для монтажа....

https://www.dropbox.com/sh/45eomilihshx5z0/g35zYOvJPL/IMG_20131018_16034...

https://www.dropbox.com/sh/45eomilihshx5z0/9qyWay8zqp/IMG_20131018_17544...

https://www.dropbox.com/sh/45eomilihshx5z0/9jPuGBnhud/IMG_20131018_18004...

управление девайсом осуществляется со смартфона через блютуз...

https://www.dropbox.com/sh/45eomilihshx5z0/t6b4OsmMmp/P9150547.JPG

https://www.dropbox.com/sh/45eomilihshx5z0/b6D-sL_Xlc/Screenshot_2013-09...

 

 

 

dachnik
Offline
Зарегистрирован: 26.07.2013

В первом моём посте есть схема, там вроде всё подписано, ты хочешь собрать макет системы или целую теплицу?)

kanibekasset
kanibekasset аватар
Offline
Зарегистрирован: 29.10.2013

dachnik пишет:

В первом моём посте есть схема, там вроде всё подписано, ты хочешь собрать макет системы или целую теплицу?)

мне пока только макет теплицы, размеры значительно по меньше))

dachnik
Offline
Зарегистрирован: 26.07.2013

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

Есть макет в гуглскеч, по нему собирал теплицу)

GrayMan
Offline
Зарегистрирован: 20.11.2013

Доброго времени суток. Отличный проект для дачи !! А у вас на даче электричество есть? от чего заряжаете упс?

Я только начал осваивать ардуино заказал мини на 328 чипе(вчера пришел).

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

 По поводу расхода жидкости- http://www.ebay.com/itm/DN8-G1-4-Flow-Rate-Water-Speedometer-For-Compute...  датчик вроде этого-тож недорогие.

Я запланировал похожий проект отличие в том что электричества нет- все будет запитываться от солнечной батареи(кстати если есть интерес могу подсказать как сделать самому). Батарею уже собрал-работает на аккумулятор автомобильный, в пути контролер.

по поводу кода не могли бы выложить для ознакомления? а то еще не все моменты понимаю.

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

По времени или по датчику влажности? я для себя думал -полив рано с утра(если не холодно) а днем только при сухости. 

 

dachnik
Offline
Зарегистрирован: 26.07.2013

Да, в летнее время электричество есть (150-200вольт) =)

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

Учитывать расход мне тоже не нужно т.к.  скока в землю не лей, всё равно всё уйдёт =)Бочка из которой берётся вода для полива наполняется из колодца автоматически по двум датчикам. Просто засеку по времени сколько нужно чтобы пролить землю.

Клапана полива будут открываться  рано утром пока все спят=). Днём поливать нельзя, быстро испаряется и возможность нанести ожоги растениям. Вечером поливать - на стенках теплицы будет конденсат.

А воду для полива ты где будешь брать? есть колодец? или планируешь использовать собранную дождевую воду?или привозить?=)

Код можешь найти на предыдущей странице.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Есть нормальные, с датчиком Холла, с нормальной 1/2 резьбой и в два раза дешевле

http://www.ebay.com/itm/1pc-Water-Flow-Sensor-Switch-Flow-Meter-Waterpro...

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

GrayMan пишет:
По поводу расхода жидкости- http://www.ebay.com/itm/DN8-G1-4-Flow-Rate-Water-Speedometer-For-Computer-Liquid-Cooling-System-/360794735074?pt=US_Water_Cooling&hash=item54010ac1e2  датчик вроде этого-тож недорогие.

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

GrayMan
Offline
Зарегистрирован: 20.11.2013

dachnik пишет:

А воду для полива ты где будешь брать? есть колодец? или планируешь использовать собранную дождевую воду?или привозить?=)

Вода как раз таки есть а света нет. Есть вопрос про клапана -если клапан на бОльшее давление то при малом он что не откроется разве? Просто есть водоснабжение с большим давлением и бак с водой с мЕньшим. чтоб не прогадать.

Насчет датчика я такой как указал trembo и имел в виду ,просто искать влом было ) 

tamerlan37
Offline
Зарегистрирован: 22.10.2013

GrayMan пишет:

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

 

есле не сложно раскажите

GrayMan
Offline
Зарегистрирован: 20.11.2013

Если в двух словах то купил фотоэлементы на ебее за 42 бакса. 40 штук размерами 156*78мм .В комплекте были шины для соединения и флюс. Соединение элементов требует минимальных навыков пайки(но очень хрупкие). Из 36-ти элементов собрал панель -предварительно уложив на стекло. Один элемент дает 0.5 вольта и ток короткого замыкания около 3-х ампер.

Панель дает в общем около 40-ка ватт .Панель заряжает аккумулятор а его в свою очередь использую на нагрузку.Заказал контроллер заряда чтобы не задумываться о перезаряде.

На ютубе множество роликов-учебников о сборе таких панелей из элементов.

dachnik
Offline
Зарегистрирован: 26.07.2013

GrayMan пишет:

Есть вопрос про клапана -если клапан на бОльшее давление то при малом он что не откроется разве? Просто есть водоснабжение с большим давлением и бак с водой с мЕньшим. чтоб не прогадать.

Я ставил от стиралки клапан 220в, при моём давлении не открывается и гудит. Ну мож пару капель выдавит)))

GrayMan
Offline
Зарегистрирован: 20.11.2013

Я понял внем наверно обратный клапан  стоит и маленькое давление неможет его продавить. Если вынуть пружину с клапана то будет работать.

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

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

Клапауций
Offline
Зарегистрирован: 10.02.2013

GrayMan пишет:

Я понял внем наверно обратный клапан  стоит и маленькое давление неможет его продавить. Если вынуть пружину с клапана то будет работать.

Probelzaelo пишет:

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

пружина в клапанах от стиралки очень слабая и предназначена исключительно для возвращения штока соленоида в исходное состояние(до того, как было подано напряжение на катушку)

т.е.: нет напряжения - давление воды захлопывает мембрану и клапан закрывается, есть напряжение - шток соленоида не давит на мембрану и клапан открывается.

поэтому, если убрать или ослабить пружину клапана, то это может привести только к неполному захлопыванию/закрытию клапана. 

*как следсвие из выше сказанного - клапаны от стиралок плохо работают с давлением ниже номинального водопроводного, не до конца захлопываются/закрываются/пропускают воду - рекомендую ставить шаровый вентиль с электроприводом.

tamerlan37
Offline
Зарегистрирован: 22.10.2013

с шаровым вентилем тоже не просто он при жесткой воде со временем работает все туже

Клапауций
Offline
Зарегистрирован: 10.02.2013

tamerlan37 пишет:

с шаровым вентилем тоже не просто он при жесткой воде со временем работает все туже

нужно брать что-то качественное немецкое в металле или японское в пластмассе

я к тому, что клапан от стиралки - совсем не подходит для малого давления

renoshnik
Offline
Зарегистрирован: 11.04.2013

зачем изобретать "велосипед", его уже изобрели ... 

питание 9 Вольт.

пропускная способность от 4 до 115 л/мин

диапазон давлений от 1,5 до 10 Бар


 

renoshnik
Offline
Зарегистрирован: 11.04.2013

tamerlan37 пишет:

с шаровым вентилем тоже не просто он при жесткой воде со временем работает все туже

 

в морозы их разрывает !!! продувка системы перед зимой проблему НЕ решает ...

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

renoshnik пишет:
зачем изобретать "велосипед", его уже изобрели ...

Если и пользоваться уже изобретенным, то зачем переплачивать то вчетверо? Бывает и подешевше вариация.

 

dachnik
Offline
Зарегистрирован: 26.07.2013

Я брал клапана тут.

renoshnik
Offline
Зарегистрирован: 11.04.2013

dachnik пишет:

Я брал клапана тут.

только учтите, что клапан управляется постоянным током... (лучше использовать переменку).

Клапауций
Offline
Зарегистрирован: 10.02.2013

renoshnik пишет:

только учтите, что клапан управляется постоянным током... (лучше использовать переменку).

почему лучше?

dachnik
Offline
Зарегистрирован: 26.07.2013

Мне точно не лучше, у меня питание системы всей на 12вольтах п.т.

renoshnik
Offline
Зарегистрирован: 11.04.2013

"переменка" для уменьшения потерь на расстоянии....

в квартире такие клапана вполне применимы, а для ландшафтных систем нужна переменка ...

step962
Offline
Зарегистрирован: 23.05.2011

renoshnik пишет:

"переменка" для уменьшения потерь на расстоянии....

в квартире такие клапана вполне применимы, а для ландшафтных систем нужна переменка ...

Ага-ага:

"Основным преимуществом высоковольтных ЛЭП постоянного тока является возможность передавать большие объёмы электроэнергии на большие расстояния с меньшими потерями, чем у ЛЭП переменного тока."

[...]

"Основным недостатком высоковольтной ЛЭП постоянного тока является необходимость преобразования типа тока из переменного в постоянный и обратно. Используемые для этого устройства требуют дорогостоящего ЗИП, так как, фактически, являются уникальными для каждой линии."

Почему все-же используются преимущественно ЛЭП переменного тока? Как раз из-за основного недостатка HVDC - война токов тому пример.

Кстати, энергосистема Нью-Йорка окончательно переведена на переменный ток лишь в 2007 году...

renoshnik
Offline
Зарегистрирован: 11.04.2013

step962 пишет:

renoshnik пишет:

"переменка" для уменьшения потерь на расстоянии....

в квартире такие клапана вполне применимы, а для ландшафтных систем нужна переменка ...

Ага-ага:

"Основным преимуществом высоковольтных ЛЭП постоянного тока является возможность передавать большие объёмы электроэнергии на большие расстояния с меньшими потерями, чем у ЛЭП переменного тока."

[...]

"Основным недостатком высоковольтной ЛЭП постоянного тока является необходимость преобразования типа тока из переменного в постоянный и обратно. Используемые для этого устройства требуют дорогостоящего ЗИП, так как, фактически, являются уникальными для каждой линии."

Почему все-же используются преимущественно ЛЭП переменного тока? Как раз из-за основного недостатка HVDC - война токов тому пример.

Кстати, энергосистема Нью-Йорка окончательно переведена на переменный ток лишь в 2007 году...

Цитата конечно интересная, возьму себе на заметку .... НО ...

Когда я делал устройство (описывал тут в посте №52) основным условием заказчика было - переменный ток на клапанах !!! (мне естественно было проще управлять мосфетами постоянкой, чем морочить голову с симисторами для переменки)... Специально разговаривали с некоторыми дистрибютороми таких устройств, все заявляли, что применение переменки связано именно с уменьшением потерь (даже зависимость от расстояния приводили, сейчас уже цифр не помню)... 

В общем ситуация вот такая.... Сравнительных тестов я не проводил, если кто-то экспериментировал было бы интересно...

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

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

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

 

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

Клапауций
Offline
Зарегистрирован: 10.02.2013

я вообще не понимаю, о каких потерях речь идёт(если они вообще есть) - кабель большего сечения спасёт от потерь.

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

*а дистрибьютора(читай "барыгу") слушать - себе дороже.

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

Клапауций пишет:
*а дистрибьютора(читай "барыгу") слушать - себе дороже.

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

tamerlan37
Offline
Зарегистрирован: 22.10.2013

а ведь действительно разве там будут настолько большие расстояния от управляющего блока до исполнительного механизма?

Думаю врядли тогда зачем это обсуждать.И все же есть автомобильные клапана с регулировкой для системы отопления новых ВАЗ

2110-12

и 12в и доступно

GrayMan
Offline
Зарегистрирован: 20.11.2013

А что за клапан такой? Раскажите поподробней или ссылку..

chk
Offline
Зарегистрирован: 14.04.2013

датчик потока жидкости как здесь ссылку приводили на  dvrobot  у меня есть. и клапан от омывателя девятки тоже вынужден использовать из-за его цены. есть в китае за 200р штука примерно клапаны получше, на 24 или 220 В. может и на 12 бывают, но это надо продаванов спрашивать.  Но таможня может не пропустить партию эдак из..20. меня это вот останавливает пока что лишь от их заказа. Датчик потока нормальный, погрешность на 400мл глазу почти не заметна. разве что пришлось константу подбирать опытным путем, ибо врало на 30% если юзать ту что на сайте там написана.

Знает ли кто, сборка UDN2803 или что-то подобное потянет клапан омывателя девятки? сначала думал на модулях реле делать, но они много места занимают((

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

chk пишет:
Знает ли кто, сборка UDN2803 или что-то подобное потянет клапан омывателя девятки? сначала думал на модулях реле делать, но они много места занимают((
 

Для ответа нужно понимать какой ток хотят клапана, обычно автомобильные устройства не стесняются своей прожорливости, а у ULN280Х нагрузка до 500mA на пин, но при условии что суммарный ток через все пины вместе не превышает 2.5А ... http://www.ti.com/lit/ds/symlink/uln2803a.pdf там есть другая беда, ключи на составном биполярном транзисторе... потому и с нагрузкой проблема. Может лучше призадуматься о нормальных MOSFET ключах на выходах?

chk
Offline
Зарегистрирован: 14.04.2013

Probelzaelo пишет:

Для ответа нужно понимать какой ток хотят клапана, обычно автомобильные устройства не стесняются своей прожорливости, а у ULN280Х нагрузка до 500mA на пин, но при условии что суммарный ток через все пины вместе не превышает 2.5А ... http://www.ti.com/lit/ds/symlink/uln2803a.pdf там есть другая беда, ключи на составном биполярном транзисторе... потому и с нагрузкой проблема. Может лучше призадуматься о нормальных MOSFET ключах на выходах?

Посмотрел в инете про клапан - написано не более 0.5А. Но надо проверить.  Транзисторы есть несколько IRLR3110, по даташиту оч неплохи. Но пока с ними не возился еще, прогу пишу. Если делать на транзисторах, то куда подключать диод иль еще что для защиты от катушки?)

maksim
Offline
Зарегистрирован: 12.02.2012

Это схемы и картинка для транзистора D882.

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

chk пишет:
Транзисторы есть несколько IRLR3110, по даташиту оч неплохи. 

...

куда подключать диод иль еще что для защиты от катушки?)

Дык в даташите же красиво нарисован диод, его прекрасненько хватает для защиты от катушки, это как раз его место

dachnik
Offline
Зарегистрирован: 26.07.2013

Всем привет, вот появилось время решил немного попрограммировать меню. 13кб вышло. Это не последняя версия, буду и буду её усовершенствовать, это предварительная версия. Управление меню происходит по трём кнопкам. В первом меню можно задать гистерезис работы актуатора(нижняя и верхняя темп.) Во 2 настройка полива(Вкл или выкл и продолжительность полива). В 3 время срабатывания поливалки. Все значению сохраняются в eeprom. Всё работает, глюков не заметил =)  Вот что руки написали за выходные:

/* adress eeprom
EEPROM 0 Минимальное значение температуры актуатора
EEPROM 1 Максимальное значение темп актуатора
EEPROM 2 1/0 включение отключение полива (0=off / 1=on)
EEPROM 3 Продолжительность минут полива
EEPROM 4 минута полива
EEPROM 5 час полива
*/цикл

//LCD I2C 20x4
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,20,4);
//LCD



//кнопка
// задаем константы
const int buttonPin = 15;     // номер входа, подключенный к кнопке
const int buttonPin_1 = 14;  //левая кнопка 
const int buttonPin_0 = 16;  //правая кнопка
const int ledPin =  13;      // номер выхода светодиода
// переменные
int buttonState = 0;         // переменная для хранения состояния кнопки
int buttonState_1 = 0;         // переменная для хранения состояния кнопки
int buttonState_0 = 0;    // previous state of the button


void setup() {
//LCD
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
lcd.init();   // initialize the lcd 
lcd.backlight();
//--LCD

// initialize the button pin as a input:

// initialize the LED as an output:
pinMode(ledPin, OUTPUT);
// initialize serial communication:
Serial.begin(9600);

pinMode(ledPin, OUTPUT);     
// инициализируем пин, подключенный к кнопке, как вход
pinMode(buttonPin, INPUT);   
pinMode(buttonPin_0, INPUT);   
pinMode(buttonPin_1, INPUT);   
}


void loop() {
// read the pushbutton input pin:
  lcd.setCursor(0,0);
  lcd.print("GREEN GARDEN MENU v1");
        lcd.setCursor(0,2);
  lcd.print("(=very  good  menu=)");
  lcd.setCursor(0,3);
  lcd.print("        MENU        ");

 buttonState = digitalRead(buttonPin);
// проверяем нажата ли кнопка
// если нажата, то buttonState будет HIGH:
if (buttonState == HIGH) {   
digitalWrite(ledPin, HIGH);
delay(1000);// включаем светодиод   
lcd.clear(); //очищаем экран
menu();
}
}
void menu()
{
actuator_setup();
irrigtion_setup();
irrigation_set_time();
}

void actuator_setup()
{
lcd.clear(); //очищаем экран
while(1){ //бесконечный цикл 
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

lcd.setCursor(0,0);
lcd.print(" -=ACTUATOR SETUP=- ");

int t_mini = EEPROM.read(0);
lcd.setCursor(0,1);
lcd.print("min = ");
lcd.print(t_mini);
lcd.print((char)223);

int t_maxi = EEPROM.read(1);
lcd.setCursor(11,1);
lcd.print("max = ");
lcd.print(t_maxi);
lcd.print((char)223);                   

lcd.setCursor(0,2);
lcd.print("____________________");

lcd.setCursor(0,3);
lcd.print("T_MIN   NEXT   T_MAX");
digitalWrite(ledPin, HIGH);
if (buttonState == HIGH) {   
 digitalWrite(ledPin, LOW);             
 delay(1000);// включаем светодиод   
 lcd.clear(); //очищаем экран
 digitalWrite(ledPin, HIGH);
 break; }
                      
 if (buttonState_1 == HIGH) {   
 digitalWrite(ledPin, LOW);             
   lcd.clear();
        t_min();
       delay(500);
       lcd.clear(); //очищаем экран
          
       digitalWrite(ledPin, HIGH);            
       }       
    
if (buttonState_0 == HIGH) {   
       digitalWrite(ledPin, LOW);             
       lcd.clear();
        t_max();
       delay(500);// включаем светодиод   
       lcd.clear(); //очищаем экран
                   
       digitalWrite(ledPin, HIGH);
      }  
     
     }}


void irrigtion_setup()
{
lcd.clear(); //очищаем экран
while(1){ //бесконечный цикл 
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

 lcd.setCursor(0,0);
 lcd.print("-=IRRIGATION SETUP=-");
 int on_off = EEPROM.read(2);
String x;
 if (on_off == 1) {x="ON";}
 if (on_off == 0) {x="OFF";}

 lcd.setCursor(0,1);
 lcd.print("irr=");
 lcd.print(x);


 int duration = EEPROM.read(3);
 lcd.setCursor(10,1);
 lcd.print("dur=");
 lcd.print(duration);
 lcd.print("min");                   
 lcd.setCursor(0,2);
 lcd.print("____________________"); 
 lcd.setCursor(0,3);
 lcd.print("ON/OFF NEXT DURATION");
//                   digitalWrite(ledPin, HIGH);
    if (buttonState == HIGH) {   
           digitalWrite(ledPin, LOW);             
           delay(500);// включаем светодиод   
           lcd.clear(); //очищаем экран
            break;
           }
    
    if (buttonState_0 == HIGH) {   
           digitalWrite(ledPin, LOW);             
           lcd.clear();
            durration_irrigation();  
           delay(500);// включаем светодиод   
               lcd.clear(); //очищаем экран
              
           digitalWrite(ledPin, HIGH);            
           }       
        
    if (buttonState_1 == HIGH) {   
           digitalWrite(ledPin, LOW);             
           lcd.clear();
            on_off_irrigation();  
           delay(500);// включаем светодиод   
           lcd.clear(); //очищаем экран
                       
           digitalWrite(ledPin, HIGH);
          }  
 
 }}

void irrigation_set_time()
{
lcd.clear(); //очищаем экран
while(1){ //бесконечный цикл 
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки
 lcd.setCursor(0,0);
 lcd.print("IRRIGATION SET TIME");
 lcd.setCursor(0,1);
 lcd.print("irr_time= "); string_irrigation_time();

 lcd.setCursor(0,2);
 lcd.print("____________________");

 lcd.setCursor(0,3);
 lcd.print("minuts  NEXT  hours");
 digitalWrite(ledPin, HIGH);
if (buttonState == HIGH) {   
       digitalWrite(ledPin, LOW);             
       delay(1000);// включаем светодиод   
           lcd.clear(); //очищаем экран
           break;
       digitalWrite(ledPin, HIGH);
       }

if (buttonState_1 == HIGH) {   
       digitalWrite(ledPin, LOW);             
       lcd.clear();
        irrigation_set_minuts();
       delay(500);
       lcd.clear(); //очищаем экран
          
       digitalWrite(ledPin, HIGH);            
       }       
    
if (buttonState_0 == HIGH) {   
       digitalWrite(ledPin, LOW);             
       lcd.clear();
       irrigation_set_hours();
       delay(500);// включаем светодиод   
       lcd.clear(); //очищаем экран
                   
       digitalWrite(ledPin, HIGH);
      }  
 
 }}



//////--------------------------------------------------------------------------
//SUB MENU

void t_min()
{

lcd.clear(); //очищаем экран
delay(1000);
while(1){ //бесконечный цикл 
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

 lcd.setCursor(0,0);
 lcd.print(" TEMP MINIMUM SETUP");
 int t_min = EEPROM.read(0);
 lcd.setCursor(0,1);
 lcd.print("t = ");
 lcd.print(t_min);
 lcd.print((char)223);
 lcd.print("C");                   
 lcd.setCursor(0,3);
 lcd.print("t_min-1 NEXT t_min+1");
 lcd.setCursor(0,2);
 lcd.print("____________________");

 digitalWrite(ledPin, HIGH);
    if (buttonState == HIGH) {   
           digitalWrite(ledPin, LOW);             
           delay(1000);// включаем светодиод   
               lcd.clear(); //очищаем экран
               break;
           digitalWrite(ledPin, HIGH);
           }
    
    if (buttonState_0 == HIGH) {   
            delay(500);     
            digitalWrite(ledPin, LOW);             
            lcd.clear();
            EEPROM.write(0, t_min + 1);
            digitalWrite(ledPin, HIGH);            
           }       
        
    if (buttonState_1 == HIGH) {   
          delay(500); 
          digitalWrite(ledPin, LOW);             
          lcd.clear();
          EEPROM.write(0, t_min - 1);
          digitalWrite(ledPin, HIGH);
          }  
 
 }
}

void t_max()
{

lcd.clear(); //очищаем экран
delay(1000);
while(1){ //бесконечный цикл 
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

 lcd.setCursor(0,0);
 lcd.print(" TEMP MAXIMUM SETUP");
 int t_max = EEPROM.read(1);
 lcd.setCursor(0,1);
 lcd.print("t = ");
 lcd.print(t_max);
 lcd.print((char)223);
 lcd.print("C");                   
 lcd.setCursor(0,3);
 lcd.print("t_max-1 NEXT t_max+1");
 lcd.setCursor(0,2);
 lcd.print("____________________");

 digitalWrite(ledPin, HIGH);
    if (buttonState == HIGH) {   
           digitalWrite(ledPin, LOW);             
           delay(1000);// включаем светодиод   
               lcd.clear(); //очищаем экран
               break;
           digitalWrite(ledPin, HIGH);
           }
    
    if (buttonState_0 == HIGH) {   
            delay(500);     
            digitalWrite(ledPin, LOW);             
            lcd.clear();
            EEPROM.write(1, t_max + 1);
            digitalWrite(ledPin, HIGH);            
           }       
        
    if (buttonState_1 == HIGH) {   
          delay(500); 
          digitalWrite(ledPin, LOW);             
          lcd.clear();
          EEPROM.write(1, t_max - 1);
          digitalWrite(ledPin, HIGH);
          }  
 
 }
}

void on_off_irrigation()
{

lcd.clear(); //очищаем экран
delay(1000);
while(1){ //бесконечный цикл 
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

 lcd.setCursor(0,0);
 lcd.print(" ON/OFF  IRRIGATION ");
 int on_off = EEPROM.read(2);
 String x;
 if (on_off == 1) {x="ON";}
 if (on_off == 0) {x="OFF";}
 lcd.setCursor(0,1);
 lcd.print("now irrigation = ");
 
 lcd.print(x);
 lcd.setCursor(0,2);
 lcd.print("____________________");                                      
 lcd.setCursor(0,3);
 lcd.print("ON      NEXT     OFF");


 digitalWrite(ledPin, HIGH);
    if (buttonState == HIGH) {   
           digitalWrite(ledPin, LOW);             
           delay(1000);// включаем светодиод   
               lcd.clear(); //очищаем экран
               break;
           digitalWrite(ledPin, HIGH);
           }
    
    if (buttonState_0 == HIGH) {   
            delay(500);     
            digitalWrite(ledPin, LOW);             
            lcd.clear();
            EEPROM.write(2, 0);
            digitalWrite(ledPin, HIGH);            
           }       
        
    if (buttonState_1 == HIGH) {   
          delay(500); 
          digitalWrite(ledPin, LOW);             
          lcd.clear();
          EEPROM.write(2, 1);
          digitalWrite(ledPin, HIGH);
          }  
 
 }
}
void durration_irrigation()
{

lcd.clear(); //очищаем экран
delay(1000);
while(1){ //бесконечный цикл 
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

 lcd.setCursor(0,0);
 lcd.print("DURRATION IRRIGATIN");
 int duration = EEPROM.read(3);
 lcd.setCursor(0,1);
 lcd.print("durration = ");
 lcd.print(duration);
 lcd.print("min");                   
 lcd.setCursor(0,3);
 lcd.print("-1min   NEXT   +1min");
 lcd.setCursor(0,2);
 lcd.print("____________________");

 digitalWrite(ledPin, HIGH);
    if (buttonState == HIGH) {   
           digitalWrite(ledPin, LOW);             
           delay(1000);// включаем светодиод   
               lcd.clear(); //очищаем экран
               break;
           digitalWrite(ledPin, HIGH);
           }
    
    if (buttonState_0 == HIGH) {   
            delay(500);     
            digitalWrite(ledPin, LOW);             
            lcd.clear();
            EEPROM.write(3, duration + 1);
            digitalWrite(ledPin, HIGH);            
           }       
        
    if (buttonState_1 == HIGH) {   
          delay(500); 
          digitalWrite(ledPin, LOW);             
          lcd.clear();
          EEPROM.write(3, duration - 1);
          digitalWrite(ledPin, HIGH);
          }  
 
 }
}

void irrigation_set_minuts()
{

lcd.clear(); //очищаем экран
delay(1000);
while(1){ //бесконечный цикл 
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

 lcd.setCursor(0,0);
 lcd.print("SET MINUTES");
 int minuts = EEPROM.read(4);
 lcd.setCursor(0,1);
 lcd.print("minuts = ");
 lcd.print(minuts);
 lcd.print("min");                   
 lcd.setCursor(0,3);
 lcd.print("-1min   NEXT   +1min");
 lcd.setCursor(0,2);
 lcd.print("____________________");

 digitalWrite(ledPin, HIGH);
    if (buttonState == HIGH) {   
           digitalWrite(ledPin, LOW);             
           delay(1000);// включаем светодиод   
               lcd.clear(); //очищаем экран
               break;
           digitalWrite(ledPin, HIGH);
           }
    
    if (buttonState_0 == HIGH) {   
            delay(500);     
            digitalWrite(ledPin, LOW);             
            lcd.clear();
            minuts = minuts + 1;
            if (minuts >59){minuts=0;}
            EEPROM.write(4, minuts);
            digitalWrite(ledPin, HIGH);            
           }       
        
    if (buttonState_1 == HIGH) {   
          delay(500); 
          digitalWrite(ledPin, LOW);             
          lcd.clear();
          minuts = minuts - 1;
          if (minuts < 0) {minuts=59;}
          EEPROM.write(4, minuts);
          digitalWrite(ledPin, HIGH);
          }  
 
 }

}
void irrigation_set_hours()
{

lcd.clear(); //очищаем экран
delay(1000);
while(1){ //бесконечный цикл
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

 lcd.setCursor(0,0);
 lcd.print("SET hours");
 int hours = EEPROM.read(5);
 lcd.setCursor(0,1);
 lcd.print("hours = ");
 lcd.print(hours);
 lcd.print("h");                   
 lcd.setCursor(0,3);
 lcd.print("-1hour  NEXT  +1hour");
 lcd.setCursor(0,2);
 lcd.print("____________________");

 digitalWrite(ledPin, HIGH);
    if (buttonState == HIGH) {   
           digitalWrite(ledPin, LOW);             
           delay(1000);// включаем светодиод   
               lcd.clear(); //очищаем экран
               break;
           digitalWrite(ledPin, HIGH);
           }
    
    if (buttonState_0 == HIGH) {   
            delay(500);     
            digitalWrite(ledPin, LOW);             
            lcd.clear();
            hours = hours + 1;
            if (hours >23){hours=0;}
            EEPROM.write(5, hours);
            digitalWrite(ledPin, HIGH);            
           }       
        
    if (buttonState_1 == HIGH) {   
          delay(500); 
          digitalWrite(ledPin, LOW);             
          lcd.clear();
          hours = hours - 1;
          if (hours < 0) {hours=23;}
          EEPROM.write(5, hours);
          digitalWrite(ledPin, HIGH);
          }  
 
 }

}
void string_irrigation_time() // функция формирования строки времни полива
{
 String irr_time = ""; //объявление переменной строки 


 int minuts = EEPROM.read(4); //читаем память
 int hours = EEPROM.read(5);
 if (hours >= 0 && hours <=9) {irr_time += 0; irr_time += hours;} else{irr_time += hours;} //дописываем нолик 
 
 irr_time += ":";
 if (minuts >= 0 && minuts <=9){irr_time += 0; irr_time += minuts;} else{irr_time += minuts;}
 
 
 irr_time += ":";
 irr_time += "00";
// lcd.setCursor(0,1);
 //lcd.print("irr_time=");
 lcd.print(irr_time);


}

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

renoshnik пишет:

"переменка" для уменьшения потерь на расстоянии....

в квартире такие клапана вполне применимы, а для ландшафтных систем нужна переменка ...

Не "переменка", а высокое напряжение, т.к. длина проводов - значительно больше... Высокое на постоянном токе - опасно всякими негаснущими дугами в выключателях и т.п., потому и советуют питание гнать переменкой, и преобразовывать его в постоянку уже по месту...

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

Andrey_Y_Ostanovsky пишет:
Высокое на постоянном токе - опасно всякими негаснущими дугами в выключателях и т.п., потому и советуют питание гнать переменкой, и преобразовывать его в постоянку уже по месту...

Есть и еще пара оправданий для переменки

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

А вовторых и это пожалуй главное, только переменное напряжение можно с легкостью понизить или увеличить с помощью самого трансформатора, сделать из 500КВ постоянки например те же 220 врядли получится без слишком дорогих "инструментов". Разумеется не будем рассматривать простой вариант типа - получить дугу от 500КВ и, за счет ее свечения, снять нужное напряжение с солнечной батареи ))

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Будет намного удобнее понимать текст программы если вместо:

if (buttonState == HIGH)

использовать просто

if (buttonState )

И ещё избавиться от внешних резисторов привязки:

pinMode(buttonPin, INPUT_PULLUP);   
pinMode(buttonPin_0, INPUT_PULLUP);   
pinMode(buttonPin_1, INPUTPULLUP);   

Соответственно кнопки идут на землю.

Ну и попробовать заменить переменные buttonState....   //запоминаем значение кнопки

на

#define buttonState     !digitalRead(buttonPin);
#define buttonState_0   !digitalRead(buttonPin_0);
#define buttonState_1   !digitalRead(buttonPin_1);

Ну a если вдруг переезжать на другую плату, например на Мегу какую...

лучше вместо 14,15,16 писать прямо, как есть, как на плате подписано: A0, A1, A2.

 

dachnik
Offline
Зарегистрирован: 26.07.2013

trembo пишет:

Будет намного удобнее понимать текст программы если вместо:

if (buttonState == HIGH)

использовать просто

if (buttonState )

Спасибо, поправил.

trembo пишет:

И ещё избавиться от внешних резисторов привязки:

pinMode(buttonPin, INPUT_PULLUP);   
pinMode(buttonPin_0, INPUT_PULLUP);   
pinMode(buttonPin_1, INPUTPULLUP);   

Соответственно кнопки идут на землю.

т.е. подключение кнопки идёт один контакт к земле, а другой к пину? Внешний резистор выкидываю?
Попробовал..., меню само сабой листается=)

trembo пишет:

Ну и попробовать заменить переменные buttonState....   //запоминаем значение кнопки

на

#define buttonState     !digitalRead(buttonPin);
#define buttonState_0   !digitalRead(buttonPin_0);
#define buttonState_1   !digitalRead(buttonPin_1);

Можно поподробней, не совсем въехал как юзать эту директиву. с таким ещё не сталкивался=) Понял только, что если компилятор встретит buttonState в тексте программы он заменит её на !digitalRead(buttonPin); ? не понимаю смысла? =)

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Andrey_Y_Ostanovsky пишет:

renoshnik пишет:

"переменка" для уменьшения потерь на расстоянии....

Не "переменка", а высокое напряжение, т.к. длина проводов - значительно больше...

Я часто использую вот эту парочку (когда не хватает сечения кабеля и слишком большая длинна)

http://www.ebay.com/itm/NEW-DC-DC-Adjustable-Step-up-Power-supply-voltage-Converter-Module-Output-5V-35V-/141048598227?pt=LH_DefaultDomain_0&hash=item20d726ced3

http://www.ebay.com/itm/2013-DC-DC-Buck-Converter-Step-Down-Module-LM2596-Power-Supply-Output-1-23V-30V-/291040362494?pt=LH_DefaultDomain_0&hash=item43c35b7ffe

Поднимаю в линию до 35 Вольт, а то что дошло - вниз до нужного ( обычно 12 или 5 Вольт)

И ещё  неплохо подходят POE инжекторы, но там 44-57 Вольт по стандарту, поэтому идут

http://www.ebay.com/itm/LM2596HV-DC-Voltage-Regulator-Power-Converter-St...

Input voltage: 4.5-60V (Cannot work long time when it exceeds 50V)

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Если начАть или нАчать прйчёсывать код я бы сделал.....

заменил бы

const int buttonPin = 7;     // номер входа, подключенный к кнопке
const int buttonPin_1 = 10;  //кнопка +
const int buttonPin_0 = 11;  //кнопка -
const int ledPin =  13;      // номер выхода светодиода

на

#define buttonEnterPin   7

#define buttonPlusPin    10

#define buttonMinusPin  11

#define ledPin              13

 и тогда

#define EnterPressed   !digitalRead(buttonEnterPin);

#define PlusPressed    !digitalRead(buttonPlusPin);

#define MinusPressed   !digitalRead(buttonMinusPin);

А теперь сравните ваше

if (buttonState == HIGH)    и     if (EnterPressed)

if (buttonState_0 == HIGH)  и    if (PlusPressed)

 

General
Offline
Зарегистрирован: 09.12.2012

Родная тема. Занимаюсь чем-то подобным, но в рамках всего огорода. Правда с давлением у меня прболем нет. 

Хотел бы уточнить. Актуатор - зачем лишняя электрическая часть (влажность в теплице), если есть механические на основе пневмоцилиндра ? 

dachnik
Offline
Зарегистрирован: 26.07.2013

Фигня эти пневмоцилиндры, я не ищю лёгких путей! форточку не откроешь по нажатию кнопки или команды МК. На влажность пофиг актуатору, он предназначен для любой погоды =) Да и какая электрическая часть в теплице? 12вольт? что-то даже как-то не страшно. Сезон отработало без нареканий и КЗ.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

если в ваше отсутствие будет солнышко, а электричество отключат, или АКБ сядет, то в теплице будет до +55 градусов, что убьет все посадки. Гидроцилиндры работают независимо от наличия или отсутствия электричества - в этом их преимущество.

tamerlan37
Offline
Зарегистрирован: 22.10.2013

dachnik пишет:
Всем привет, вот появилось время решил немного попрограммировать меню. 13кб вышло. Это не последняя версия, буду и буду её усовершенствовать, это предварительная версия. Управление меню происходит по трём кнопкам. В первом меню можно задать гистерезис работы актуатора(нижняя и верхняя темп.) Во 2 настройка полива(Вкл или выкл и продолжительность полива). В 3 время срабатывания поливалки. Все значению сохраняются в eeprom. Всё работает, глюков не заметил =)

Попробовал ваш код у себя запустить, правда переделал его немного у меня дисплей  2*16 так вот  у меня  както все работало неадкекватно то менялись пункты меню сами по себе то просто светилась надпись меню, я кнопки пока вообще не ставил просто скетч залил в контролер с дисплеем,мож это ис за отсутствия подтягиваюшего резистора,там правельно к земле подтягивать и к плюсу на сигнал?Я пробовал пинцетом имитировать нажатие кнопки замыкал пин кнопки на плюс но в общем хаосе этого почти небыло заметно.

dachnik
Offline
Зарегистрирован: 26.07.2013

Поставь кнопки, всё заработает. Сам пробовал отключать кнопку, начинается хаос)