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

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

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

Что было куплено (заказано):
Arduino Uno (В скором времени перейду на МЕГУ т.к. на UNO заканчиваются свободные порты)
Блок реле на 8 каналов - управляют нагрузкам
Датчики Температур DHT и DS1820
LCD I2C модуль для отображения темп и влажности
Кнопки нормально разомкнутые для ручного управления ардуиной
Датчик влажности почвы
Электро магнитные клапана 12в для автополива
Блок бесперебойного питания на 12вольт
Актуаторы для спутниковых антенн - ими открываются и закрываться форточки для проветривания и поддержания температуры внутри теплицы.
Поплавковые датчики уровня воды - они служат для поддержания актуального уровня воды в бочке для полива растений.
127л бочка для воды.

Теплица: 10мх3м сварена из профильной трубы 20х20х2мм, обшита поликарбонатом 4мм. Фундамент бетон Не хотел я покупать готовые теплицы, уж очень они хиленькие и не просторные. У соседей, к примеру, зимой продавило такую теплицу... Поэтому решил строить свою мега надёжную конструкцию потратив на это месяц и приобрёл в замен 10тый лэвл по сварке электродами. Получилась такая вот красавица =)

Центр автоматики =)
Сверху вниз: ИБП 12вольт с аккумуляторной батареей на 7а/ч, далее коробка в которой находится блок реле, розетка 220в и ещё что-то... ) справа от него розетка 220v для насоса и розетки +12в для актуаторов. Ниже блок с ардуинои и LCD модулем, под ними розетки для датчиков. Справа от них распределительный коллектор воды

 

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

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

внутренности

Актуатор, который открывает заднюю дверь для проветривания. По паспорту он работает от 36вольт, но от 12в тоже пашет.  Проветривание теплицы происходит по двум температурным точкам: при +30 форточка открывается, при падении до +25 форточка закрывается.

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

Капельная магистраль из ПНД трубы с врезанными кранчиками из зоомагазина, к которым подключены капельницы

 

Капельный полив пока находиться в ручном режиме(открыл шаровой кран на коллекторе вода пошла в капельную линию), т.к. э.м. клапана только вот пришли и надо допиливать схему и прошивку. Клапана заказывал специально для низкого давления до 0.8 бар т.к. давление у меня примерно 0.2бар. Пробовал клапана от стиральной машины - не прокатило - производительность 1 капля в минуту =)

Сами капельницы прилетели ко мне из Китая и со своими обязанностями справляются.

 

Примерная схема(устарела), будет возможность, выложу новую, к 5 и 6 контактам подключены датчики уровня воды в бочке полива, 11 канал идёт в блок реле канала 3 и управляет колодезным насосом.

Код прошивки выложу позже, как буду на даче.

Вот пока всё что сделал на данный момент. Может будет кому интересно.

Рад услышать критику, замечания, предложения и вопросы =)

 

 

 

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

dachnik пишет:

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

Капельная магистраль из ПНД трубы с врезанными кранчиками из зоомагазина, к которым подключены капельницы

Капельный полив пока находиться в ручном режиме(открыл шаровой кран на коллекторе вода пошла в капельную линию), т.к. э.м. клапана только вот пришли и надо допиливать схему и прошивку. Клапана заказывал специально для низкого давления до 0.8 бар т.к. давление у меня примерно 0.2бар. Пробовал клапана от стиральной машины - не прокатило - производительность 1 капля в минуту =)

Рад услышать критику, замечания, предложения и вопросы =)

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

1 - оставить клапана от стиральной машины, но тк в них установлена пружина, которая не позволяет открыться клапану если давление в сети менее 0.5, поэтому можно для повышения давления взять не дорогой насосик, пусть он и не предназначен для работы в качестве повысительного, но кратковременные нагрузки перенесет, чтобы ему облегчить жизнь можно использовать регулятор давления, для сброса излишков обратно в емкость.  потребление у насосика ватт 60 цена окло 1500р. в розничных магазинах.

2 - вместо клапанов взять готовые приводы и регуляторы использующиеся в системах отопления.

Они относительно не дорогие, работают благодаря эффекту расширения жидкости при нагреве ее от встроенного нагревателя.

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

paf
Offline
Зарегистрирован: 25.01.2013

Кран отопителя 2114 кран отопителя

Требует еще   и привод замка дверей.

реле

Просто почаще заходите в магазин автозапчастей. Там давно все приготовлено для самодельщиков. Все узлы и агрегаты проверены временем и тяжелыми режимами в условиях русских дорог.  Ессно, для в данном случае требования к надежности идут в ущерб внешнему виду. Опять же на любителя. И двухстрочный дисплей, это не экран планшета. Фантики, я согласен с автором, для понтов! И если понты решающий элемент, то-о...

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

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

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

и счетчики жидкости (топлива)

Одна беда все автомобильное очень любит "страшные" токи, экономить батарейки производители совсем не привыкли...

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

paf пишет:

Кран отопителя 2114 

кран отопителя Требует еще

  

и привод замка дверей.

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

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

 

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

Я же писал, что пришли соленойдные клапана под моё давление, проверял, всё работает, на фотке он и подвешен к коллектору только не подключен, работает от 12вольт. Зачем что-то городить из авто запчастей... в конце концов есть не дорогие шаровые краны с электроприводами у китайцев=)

Типа таких но такие лучше вешать на ПИД =) Мне же пока думаю достаточно соленойдов

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

dachnik пишет:

Я же писал, что пришли соленойдные клапана под моё давление, проверял, всё работает, на фотке он и подвешен к коллектору только не подключен, работает от 12вольт. Зачем что-то городить из авто запчастей... в конце концов есть не дорогие шаровые краны с электроприводами у китайцев=)

Типа таких но такие лучше вешать на ПИД =) Мне же пока думаю достаточно соленойдов

Если есть где то реально недорогие шаровые с приводом, покажи. Я реально дешевых пока не встретил, а хотелось бы...

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

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

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

paf
Offline
Зарегистрирован: 25.01.2013

Умилила цена! Особенно в части доставки.

Не-ет, никто не спорит! И серву можно поставить! Можно же просто в фирме заказать кит "Сделай сам свою теплицу"  Тугой блокнот из купюр открывает широкие горизонты! 

Я думал, что функциональность - наше все! Ошибся. Иное. 

 

 

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

Одно из двух, либо я не понял иронии.

Серво это дорого? или не спортивно? Какие претензии у нас появятся к функционалу? И при чем тут КИТ?

На мой взгляд например вот такой cервопривод( с усилием 10-12 кг/см) наилучшее решение для работы с ардуино, все другие варианты например регулировочные клапаны не столь удобный вариант тк управляются они аналоговым сигналом, который от ардуино разумеется можно получить, но только через проблему связанную с не дешевыми ЦАП и тп...

 

paf
Offline
Зарегистрирован: 25.01.2013

Probelzaelo пишет:

На мой взгляд например вот такой cервопривод( с усилием 10-12 кг/см) наилучшее решение для работы с ардуино, 

 Это спортивно дорого. И если их надо несколько штук, а к сервам еще много чего... однако! Вот эта "серва" помощнее будет. И сопоставима по цене! Но ждать два месяца не надо. И это решающий момент. Подобрать временной интервал для угла поворота. Понятно, просто сверху на кран ее не оденешь. Да ведь самодельщику руки - то пока же не оторвали? Если бы стоял выбор, положим, поверни за угол направо - купи серву, поверни за угол налево - купи привод, пройди сто шагов прямо и купи готовый кран с приводом.  Ну понятно! Берем кран и быстро ставим на место.  Ну поскольку кроме автозапчастей быстро найти не получается, а я не беру в расчет когда все под боком, то дешевле, быстрее, не менее работоспособно чем китацкий кран, весь этот "кит" из автомагазина. Имхо.

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

Да! серва - это, то без чего ни одна теплица ни разу не обойдётся.

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

paf пишет:

Probelzaelo пишет:

На мой взгляд например вот такой cервопривод( с усилием 10-12 кг/см) наилучшее решение для работы с ардуино, 

  И если их надо несколько штук, а к сервам еще много чего... однако! Вот эта "серва" помощнее будет. И сопоставима по цене! Но ждать два месяца не надо.

Чего еще нужно много к сервам? Сопоставимо по цене это всего в 2 раза? не ждать есть ЕМС. если их надо много, то вполне адекватно.

О чем вообще есть спорить?

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

Клапауций пишет:

Да! серва - это, то без чего ни одна теплица ни разу не обойдётся.

если затеяна автоматизация, то без исполнительных механизмов не обойтись.

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

Probelzaelo пишет:
если затеяна автоматизация, то без исполнительных механизмов не обойтись.

Сорняки прополоть, урожай убрать?

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

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

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

Probelzaelo пишет:

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

и счетчики жидкости (топлива)

Нет ни первых ни вторых.

Для отключения подачи топлива блокируется реле бензонасоса, так же ЭБУ блокирует управление форсунками.

Для определения расхода топлива снимаются показания времени открытия форсунок.

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

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

Клапаны лучше от стиральных машин брать - автомобильное на воду не рассчитано.

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

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

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

maksim пишет:

Probelzaelo пишет:

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

и счетчики жидкости (топлива)

Нет ни первых ни вторых.

Для отключения подачи топлива блокируется реле бензонасоса, так же ЭБУ блокирует управление форсунками.

Для определения расхода топлива снимаются показания времени открытия форсунок.

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

Не нивой единой жив человек.

Действительно, вот этого нет, его вообще не существует, и электромагнитных топливных клапанов не бывает...

И электро клапан отсечки топлива ни одному дизелю не нужен...

все есть было бы желание приспособить.

 

maksim пишет:

Для определения расхода топлива снимаются показания времени открытия форсунок.

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

maksim пишет:

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

Там были простые обратные клапана, не те что нам интересны.

maksim пишет:

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

Чаще они были в комплекте с сигнализацией.

 

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

Смысл спорить, что есть или нет автомобильного, если всёравно в воде оно сдохнет через месяц.

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

Probelzaelo пишет:

Действительно, вот этого нет, его вообще не существует, и электромагнитных топливных клапанов не бывает...

Это доп.оборудование, а не автозапчасти. Купить дорогущий расходомер для грузовика?Стоит оно не тех денег и в обычном магазине автозапчастей этого не купить, поэтому использовать эти детали в каких то сомоделках не практично. Лучше сразу купить нормальный расходомер и клапан.

Probelzaelo пишет:

Там были простые обратные клапана, не те что нам интересны.

Ошибаетесь:

http://www.avtoall.ru/klapan_lektromagnitnyiy_vaz_2108_omyvatelya_soate-001026/ продается в любом тазавском магазине.

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

Вы цену то видили на этот клапан? http://eltonauto.ru/blek_valve, а на расходомер? http://web.archive.org/web/20110526035519/http://tscontrol.ru/oborudovanie/dopolnitelnoe-oborudovanie/?section=13

Есть желание поставить это в теплицу? )

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

maksim пишет:

Ошибаетесь:

согласен, бывает. у меня не было таких )

maksim пишет:
Вы цену то видили на этот клапан?
Видел, потому и сказал что дороговато. Но относительно расходомера, близкой альтернативы то по возможностям измерения малых обьемов практически нет у остальных, тех что дешевые, для водопровода, цена импульса от 0,1 литра и до 10...

 

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

Вот есть например такой.

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

Тогда уж лучше такой за гораздо более интересные 130 руб. Точность: 1 импульс на 3,7 мл +/- 2% ("Frequency (Hz) = 4.5* Q +/- 2%  where Q = flow rate (L/min)")

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

maksim пишет:

Вот есть например такой.

Это уже что то, по цене дешевле вдвое, правда точность хуже аж в 50 раз, впрочем она не так уж и важна для теплицы. На самом деле и автомобильный и вот этот расходомеры имеют сличком малую пропускную способность чтобы их можно было пользовать в системе полива, ну если только в случае капельного. А при использования по теме, расход вообще имеет смысл контроллировать в основном лишь для статистики, а реально поливом управлять по датчику влажности почвы, которой кстати в современной тепличке вообще может не быть ))

Кстати, принцип полива по влажности уже и заложен в одной из "спец версий" нашего *duino

http://robocraft.ru/blog/projects/26.html

Обнаружил совсем мелкий и совсем уж дешевый счетчик для малых потоков жидкости, до 3 л.мин

http://dvrobot.ru/shop/i221.schetchik_rashoda_zhidkosti..htm

step962 пишет:

Тогда уж лучше такой за гораздо более интересные 130 руб. Точность: 1 импульс на 3,7 мл +/- 2% ("Frequency (Hz) = 4.5* Q +/- 2%  where Q = flow rate (L/min)")

Вот уж во истину штука гАрная!

 

djominov
Offline
Зарегистрирован: 23.09.2013

Очень интересный проект! Хотелось бы поглядеть на код для ардуины, сам сейчас тоже занимаюсь подобным проектом, только думаю делать систему на аквапонике, с рыбой в общем :)

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

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

djominov пишет:
думаю делать систему на аквапонике, с рыбой в общем :)

Вау! "Это же мой гардеробчик"(с)...

Очень интересно. Правда я подумывал про мух отдельно - котлеты отдельно. Рыбе в питательном растворе не комильфо будет, а просто "рыбной" воды, если нет перенаселения будет маловато для флоры...

djominov
Offline
Зарегистрирован: 23.09.2013

Probelzaelo пишет:

djominov пишет:
думаю делать систему на аквапонике, с рыбой в общем :)

Вау! "Это же мой гардеробчик"(с)...

Очень интересно. Правда я подумывал про мух отдельно - котлеты отдельно. Рыбе в питательном растворе не комильфо будет, а просто "рыбной" воды, если нет перенаселения будет маловато для флоры...

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

В целом результат неплохой, купил высокорослые помидоры, уже в высоту 140см :) Жду вот помидорок, специально поздно высадил, теперь надеюсь на урожай :)

djominov
Offline
Зарегистрирован: 23.09.2013

Жаль что топикстартер пропал из поля зрения, интересный рассказ получался...

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

Я некуда не пропадал, я тут, я слежу =) Просто времени не было заниматься теплицей и всё остановилась на том уровне, на котором я закончил свой репорт.  Система уже отключена и разобрана. Урожай снят. Всё было вкусно(особенно дыньки и помидорки черри). Пока потихоньку собираю новую автоматику на Меге. Надеюсь к следующей весне успею =)

Из минусов моей системы хотел бы отметить - капельный полив, очень плохо поливает, одна капельница капает, другая, которая находится выше её уровнем - нет и зарастают дырки капельниц налётом, Для этого полива нужно хорошее давление по видимому. Так что приходилось поливать из лейки  там где не докапывало=)\

Актуатор отработал весь летний цикл без нареканий. Даже когда отключали надолго эл-во, 12в ББП прекрасно справлялся со своею задачей, давая энергию на всю автоматику.

 

djominov
Offline
Зарегистрирован: 23.09.2013

Рад, что у вас был урожай. Кодом для ардуины поделиться сможете? Может получится вместе довести до ума.

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

Вроде он, но может быть не последняя версия... 

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
int open_motor = 8; //открыть актуатор пином 8
int close_motor = 9; //закрыть актуатор пином 9
int del_time = 12; //задержка открытия закрытия
int t_max = 30; //Верхний предел температуры
int t_min = 29; //Нижний предел температуры

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


LiquidCrystal_I2C lcd(0x27,16,2); //инициализируем 2х строчный дисплей
// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2 // пин шины 1-Wire 

#define DHTPIN 4 //пин датчика дхт
#define DHTTYPE DHT11 // тип датчика дхт
// Setup a oneWire instance to communicate with any OneWire devices 
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);


// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
 
DHT dht(DHTPIN, DHTTYPE); 

void setup(void) //сделать что-то один раз при запуске МК
{
// start serial port;
 Serial.begin(9600);
// Serial.println("Dallas Temperature IC Control Library Demo");
pinMode(open_motor, OUTPUT);
pinMode(close_motor, OUTPUT);

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

  
lcd.init();                      // initialize the lcd 
 
  // Print a message to the LCD.
  lcd.backlight();
  // Start up the library
  sensors.begin();


dht.begin();
delay(3000);
}
 
 
void loop()//цикл
{

  sensors.requestTemperatures(); // Send the command to get temperatures
  float t_out = sensors.getTempCByIndex(0);
  float t_in = sensors.getTempCByIndex(1);  
  int h = dht.readHumidity();
  float t = dht.readTemperature();


Serial.print("Temp_out: ");
Serial.print(t_out);
Serial.print("Temp_in: ");
Serial.print(t);
Serial.print("Hum: ");
Serial.print(h);
Serial.print("\n");

  lcd.setCursor(0,0);
  lcd.print("OUT=");
  lcd.setCursor(4,0);
  lcd.print(t_out);

  lcd.setCursor(0,1);
  lcd.print("IN =");
  lcd.setCursor(4,1);
//lcd.print(t_in); //темп ds1820 датчика
  lcd.print(t); //темп DHT датчика
//delay(1000);
  lcd.setCursor(11,1);
  lcd.print("H=");
  lcd.print(h);
  lcd.print("%");

//Терморегулирование

if (t_out > t_max)// && digitalRead(open_motor) == LOW) 
  {
    open_window();
}


if (t_out < t_min) // && digitalRead(open_motor) == HIGH) 
{
    close_window();  
}



    // You can have more than one IC on the same bus. 
    // 0 refers to the first IC on the wire
 
button();
}


void timer() //функция таймер
{
for (int i=del_time-1; i>=0; i-- )
   {

    int z = 8; //позиция курсора
    lcd.setCursor(0,1);
    lcd.print(" Timer :");   
    lcd.setCursor(z,1);
    //if (i<10){ lcd.print (" "); lcd.setCursor (z+1,1);} //убрать мёртвый символ
    lcd.print(i);  
    lcd.print(" "); 
    delay(500); //мигаем светодиодом
    digitalWrite(ledPin, LOW);
    delay(500);
    digitalWrite(ledPin, HIGH);
    }
}

void open_window() //фУНКЦИЯ ОТКРЫВАНИЯ ФОРТОЧКИ
{
    digitalWrite(close_motor, LOW);
    delay(1000);
    digitalWrite(open_motor, HIGH);

    lcd.setCursor(0,0);
    lcd.print("Open window");   
    lcd.setCursor(13,0);
    lcd.print("ON ");
   
    timer(); //запуск функции таймера

    digitalWrite(open_motor, LOW);

}

void close_window() //фУНКЦИЯ ЗАКРЫВАНИЯ ФОРТОЧКИ
{
    digitalWrite(open_motor, LOW);
    delay(1000);
    digitalWrite(close_motor, HIGH);

    lcd.setCursor(13,0);
    lcd.print("OFF");
}

void button()
{//кнопка
// считываем значения с входа кнопки
  buttonState = digitalRead(buttonPin);
  // проверяем нажата ли кнопка
  // если нажата, то buttonState будет HIGH:
  if (buttonState == HIGH) {   
    digitalWrite(ledPin, HIGH);
    delay(1000);// включаем светодиод   
    lcd.clear(); //очищаем экран
    
    while(1){ //бесконечный цыкл 
  buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
  buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
  buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

      lcd.setCursor(0,0);
      lcd.print("MANUAL MODE");
      lcd.setCursor(0,1);
      lcd.print("CLOSE EXIT OPEN");

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

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


}

 

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

У меня вопрос, кто-нибудь пробывал сделать такое ?

http://favoritpoliv.prom.ua/p14463864-hanter-polivaktsiya-kontroller.html

есть необходимость в 12 зонном приборе ...

http://www.polivpro.com.ua/catalog/kontrolleri/kontrolleri-na-12-zon

djominov
Offline
Зарегистрирован: 23.09.2013

А в чём сложность собственно? 12 клапанов, 12 реле, ардуино и всё счастье. Ну и конечно датчик дождя, влажности почвы, смотря что вам надо мониторить.

djominov
Offline
Зарегистрирован: 23.09.2013

Спасибо за исходники, только похоже не самая последняя версия или может быть вы просто так и не прописали ручной режим. По сути выводится только текст на экран и всё.

За время работы какие то глюки наблюдались?

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

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

djominov пишет:

А в чём сложность собственно? 12 клапанов, 12 реле, ардуино и всё счастье. Ну и конечно датчик дождя, влажности почвы, смотря что вам надо мониторить.

каждый из 12 клапанов включается 4 раза в день (время включения и длительность полива задаётся для каждого раза своя).

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

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

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

Да, версия кода старая, нету функции авто-запонения бочки=) ну эт не сложный алгоритм.  Ручной режим только для открывания закрывания форточки(Функция button() за это отвечает)

Глюков не замечал.

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

 

djominov
Offline
Зарегистрирован: 23.09.2013

На самом деле помпа глючила, когда переводил реле из Лоу в хай. Тоесть отрубал реле. Оно клацало и возвращалось во включенное положение.

 

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

Из того что читал, дилей надо вообще не юзать в коде и заменять его на милис.

Еще такой момент - структура кода должна быть построена иначе, если надо чтобы одновременно собиралось что то с датчиков и выполнялось одновременно.

 

Дачник, ты что то планируешь еще делать или руки опустил? :)

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

djominov пишет:

Из того что читал, дилей надо вообще не юзать в коде и заменять его на милис.

 

а с чем это связано ??? 

просто если включать устройство по таймеру на заданный период времени, с милис это получается геморно... нужно контролировать текущее время, т.к. программа продолжает работать и нужно постоянно ПОДТВЕРЖДАТЬ команду на включение.

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

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

Делаю по мере возможностей и времени,  сейчас прикручиваю к меге модуль DS1307 и SD модуль. чтобы писать логи на карту и на ней же хранить данные переменных например. Но всё как-то с трудом даётся...начиная от сенсор шилда для меги(который оказался неработоспособным из-за кривых китайских рук=) кончая предпочитаний меги относительно выбора карты памяти(на УНО карта пашет, на меге не в какую)....

В планах перевести всё на мегу, заменить 2х строчный дисплей на 4х строчный, прикрутить SD,RTC. Доделать наконец клапана для полива, переделать полив(пока ещё не знаю каким образом, ещё вся зима впереди). Если всё сложится удачно то прикрутить мегу к piшке для интеграции с сервером заданий и сбора статистики(но об этом ещё рано)...

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

А можно последнюю весию кода, и что делает таймер он на внешнем таймере реализован или на внутреннем?

dachnik
Offline
Зарегистрирован: 26.07.2013
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
int open_motor = 8; //открыть актуатор пином 8
int close_motor = 9; //закрыть актуатор пином 9

int del_time = 12; //задержка открытия закрытия

int t_max = 30; //Верхний предел температуры при котором открывается форточка
int t_min = 25; //Нижний предел температуры при котором закрывается форточка

const int min_level = 5; //пин датчика нижнего уровня воды
const int max_level = 6; //пин датчика верхенго уровня воды
const int nasos = 3; // пин насоса
int min_water_level_sensor_state = 1;
int max_water_level_sensor_state = 1;


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


LiquidCrystal_I2C lcd(0x27,16,2); //инициализируем 2х строчный дисплей
// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2 // пин шины 1-Wire 

#define DHTPIN 4 //пин датчика дхт
#define DHTTYPE DHT22 // тип датчика дхт
// Setup a oneWire instance to communicate with any OneWire devices 
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);


// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
 
DHT dht(DHTPIN, DHTTYPE); 

void setup(void) //сделать что-то один раз при запуске МК
{
// start serial port;
 Serial.begin(9600);
// Serial.println("Dallas Temperature IC Control Library Demo");
pinMode(open_motor, OUTPUT);
pinMode(close_motor, OUTPUT);
pinMode(min_level, INPUT); 
pinMode(max_level, INPUT);
pinMode(nasos, OUTPUT);

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

  
lcd.init();                      // initialize the lcd 
 
  // Print a message to the LCD.
  lcd.backlight();
  // Start up the library
  sensors.begin();


dht.begin();
delay(3000);
}
 
 
void loop()//цикл
{

  sensors.requestTemperatures(); // Send the command to get temperatures
  float t_out = sensors.getTempCByIndex(0);
  float t_in = sensors.getTempCByIndex(1);  
  int h = dht.readHumidity();
  float t = dht.readTemperature();


Serial.print("Temp_out: ");
Serial.print(t_out);
Serial.print("Temp_in: ");
Serial.print(t);
Serial.print("Hum: ");
Serial.print(h);

Serial.print("min_level=");
Serial.print(min_water_level_sensor_state);
Serial.print("Max_level");
Serial.print(max_water_level_sensor_state);
Serial.print("\n");


  lcd.setCursor(0,0);
  lcd.print("OUT=");
  lcd.setCursor(4,0);
  lcd.print(t_out);

  lcd.setCursor(0,1);
  lcd.print("IN =");
  lcd.setCursor(4,1);
//lcd.print(t_in); //темп ds1820 датчика
  lcd.print(t); //темп DHT датчика
//delay(1000);
  lcd.setCursor(11,1);
  lcd.print("H=");
  lcd.print(h);
  lcd.print("%");

//Терморегулирование

if (t_out > t_max)// && digitalRead(open_motor) == LOW) 
  {
    open_window();
}


if (t_out < t_min) // && digitalRead(open_motor) == HIGH) 
{
    close_window();  
}

{
  //ручное управление
button();
}

{
//функция авто насоса 
  start_nasos();
}

}

void timer() //функция таймер
{
for (int i=del_time-1; i>=0; i-- )
   {

    int z = 8; //позиция курсора
    lcd.setCursor(0,1);
    lcd.print(" Timer :");   
    lcd.setCursor(z,1);
    //if (i<10){ lcd.print (" "); lcd.setCursor (z+1,1);} //убрать мёртвый символ
    lcd.print(i);  
    lcd.print(" "); //так меньше слов =)
    delay(500); //мигаем светодиодом
    digitalWrite(ledPin, LOW);
    delay(500);
    digitalWrite(ledPin, HIGH);
    }
}

void open_window() //фУНКЦИЯ ОТКРЫВАНИЯ ФОРТОЧКИ
{
    digitalWrite(close_motor, LOW);
    delay(1000);
    digitalWrite(open_motor, HIGH);

//    lcd.setCursor(0,0);
 //   lcd.print("Open window");   
    lcd.setCursor(13,0);
    lcd.print("ON ");
   
//    timer(); //запуск функции таймера
//    digitalWrite(open_motor, LOW);

}

void close_window() //фУНКЦИЯ ЗАКРЫВАНИЯ ФОРТОЧКИ
{
    digitalWrite(open_motor, LOW);
    delay(1000);
    digitalWrite(close_motor, HIGH);

    lcd.setCursor(13,0);
    lcd.print("OFF");
}
void start_nasos() //прототип автонаполнения бочки наполнения 
{
  min_water_level_sensor_state = digitalRead(min_level);
  max_water_level_sensor_state = digitalRead(max_level);
  
  if (min_water_level_sensor_state == LOW) {
    digitalWrite(nasos, HIGH);} 

  if (max_water_level_sensor_state == HIGH) {
    digitalWrite(nasos, LOW);}
}

void button()
{//кнопка
// считываем значения с входа кнопки
  buttonState = digitalRead(buttonPin);
  // проверяем нажата ли кнопка
  // если нажата, то buttonState будет HIGH:
  if (buttonState == HIGH) {   
    digitalWrite(ledPin, HIGH); // включаем светодиод  
    delay(1000); 
    lcd.clear(); //очищаем экран
    
    while(1){ //бесконечный цыкл 
  buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
  buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
  buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

      lcd.setCursor(0,0);
      lcd.print("MANUAL MODE");
      lcd.setCursor(0,1);
      lcd.print("CLOSE EXIT OPEN");

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

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


}

Функция таймер была сделана для тестов с актуатором(типа например если темп упала, то то актаутор работает по таймеру(10 сек призакрыл, перепроверил темп, если ещё упала то ещё призакрыл и т.д.... ну мысль понятна?(оказалось невостребованна))), её можно закоментировать, она в коде не используется.

djominov
Offline
Зарегистрирован: 23.09.2013

Дачник, где же обновки! :) Я вот по-тихоньку меню ковыряю, пока правда не до конца понимаю как писать и читать из EEPROM, а то как то не комильфо терять значения через 50 дней :(

Вот тема по поводу меню, если будет интересна:
http://arduino.ru/forum/programmirovanie/pomogite-s-lcd-menyu#comment-44833

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

Ничего ещё не думал, руки не доходят, и мозги тоже не могут собраться, зимой может начну, лень сцука, как я тебя ненавижу....

djominov
Offline
Зарегистрирован: 23.09.2013

Лень это да, особенно по такой погоде ничего не хочется...

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

Здравствуйте! Я бы хотел реализовать Ваш проект на дипломную работу. Идея похожа, функции:

1) полив по влажности( по времени);

2) Освещение(если оно нужно);

3) управление этим через интернет(повесить на какой- то хостинг);

4) Подумываю о вентиляции.

 

Возможно ли будет это сделать?

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

Конечно возможно. И не так уж сложно.

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

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

3)Да можно, необязательно на хостинг, можно на свой комп

4) вентиляция летом обязательна. В жаркую погоду темп может вырасти до 40-50 градусов если не проветривать. У меня это делают актуаторы, открывая форточки.

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

Я надеюсь, Вы мне поможете реализовать и получить отлично?) 
 

Я учусь на программиста и надеюсь смогу сделать)

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

Я так полагаю диплом скорее будет ориентирован на исходный код контролера и веб интерфейса? как бы этот проект больше относиться к АСУ =)

Тема у тебя какая?

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

dachnik пишет:

Я так полагаю диплом скорее будет ориентирован на исходный код контролера и веб интерфейса? как бы этот проект больше относиться к АСУ =)

Тема у тебя какая?

Тему я могу подкорректировать под себя.

А в дипломной работе будет учтено все: код веб интерфейса, контроллера и всего прочего. Мне самому интересно будет реализовать этот проект ;)