Форум перцеводов и перцеедов

Главная категория => Искусственный климат => Тема начата: AlexYalta от 02 Июль 2016, 00:00:28

Название: Создание периодики на Arduino
Отправлено: AlexYalta от 02 Июль 2016, 00:00:28
Раз тема для новичков. Хотел бы предоставь на суд  свой проект системы по типу ""периодика". Конструктил исходя из возможностей моего перцариума, минимального бюджета, и максимально простоты изготовления.

Приблизительная схема, вид так сказать сверху:
(https://img-fotki.yandex.ru/get/61248/340095097.0/0_13ceb3_8b0b68f5_XXL.jpg) (https://fotki.yandex.ru/next/users/asdset/album/509626/view/1298099)

Немного подробней:

Схема условная, но масштаб в целом выдержан, планирую под 6 кустов длина рабочих труб 800мм,  по центрам между отверстиями под растения 300мм...

Отводы что под №5 и 7  будут установлены один выходом вверх для штуцера подачи и выходом вниз для сливного соответственно. В сами выходы вклею заглушку на 50 с наглухо вкрученными штуцерами под шланги нужного(пока не определил) диаметра.

Кусок трубы (№6) нужен для увеличения расстояния между основными рабочими трубами (№2) и возможности соединить отводы, между собой.

Переливной клапан (№8) на случай если произойдет глюк сливного клапана или помпы и будет угроза потопа....

Все стыки будут проклеены клеем для ПВХ.

Объем рабочей жидкости, по моим подсчетам, будет около 25л. Ведро для хранения будет стоять под столом, так что помпе придется качать раствор вверх, зато сливаться это все будет самотеком.

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

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

Управлять всем эти думаю посредством одноканального таймера, к которому будут подключены помпа и электромагнитный клапан для слива типа «нормально открыт» 
Принцип прост, программируем время когда, и  главное на сколько, нам надо включить помпу чтобы заполнить рабочую емкость раствором.
Время приходит, подается питание на помпу и клапан, помпа начинает качать, клапан при этом закрывается, как только питание отключается, помпа глохнет, клапан слива открывается и раствор самотеком сливается обратно в емкость хранения.... 

смета:
4000. - на трубы и клей, шланги, штуцера и ведро на 30л,
2500 - релюха программируемая,
2500 - помпа аквариумная
клапан электромагнитный, мне даром, а вообще около 1500р. блок питания к нему 150р.

итого 10650р.


Замечания, предложения, осуждения.... Всему буду рад.
Название: Создание периодики на Arduino
Отправлено: Ann от 02 Июль 2016, 13:49:48
Интересная схема. Несколько вопросов:
1. А в чем принципиальная необходимость соединительной перегородки (110мм), не проще сделать две 160мм и продублировать в каждой отверстия? Вижу следующие преимущества:
- удобней было бы расположить (ближе друг к другу или дальше, под углом, одну выше, другую ниже и т.д.),
- масштабировать (одну можно отключить в случае необходимости),
- раствор не будет оставаться после слива (сливной штуцер расположен в трубе 110мм, нижняя часть которой выше нижней части 160мм на 25 мм, следовательно в 160мм-трубе всегда будет не полностью сливаться раствор и часть корней никогда не увидят воздуха).
2. Что за модель помпы и какая ее мощность, возможная высота столба воды ?
3. Вместо дорого и малофункционального одноканального реле, почему бы не использовать Arduino UNO + двухканальное реле. Преимущества:
- цена (комплект в районе 8$);
- два канала (клапан открывать можно будет с некоторой задержкой, чтобы успели напиться и помпа в это время не молотила);
- на порядок гибче "программируемость" (периоды можно менять в зависимости от времени дня и ночи - днем выше транспирация, значит чаще нужно пить, от температуры воздуха - чем выше температура, тем чаще пить и т.д.).

Вы не против, если я перенесу в тему "системы гидропоники" ? Все-таки изготовление "периодики" - это уровень уже далеко не новичков  :)
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 02 Июль 2016, 17:37:34
Все верно, еще подумал немного и решил соединить две рабочие 160ки, просто гибким шлангом, в который посредством крестовины, воткну шланг слива и подачи.... Потом зашел почитать отзывы и тут  ваш комент подтвердил мои догадки :). В нижней части заглушки просто врезаю штуцер под шланг подачи-слива раствора, в верхней, под аварийный шланг, это сократить количество деталей, уменьшит затраты, и ак вы правильно заметили, это более гибкое решение, можно и двигать и убирать и добавлять рабочие модуля и по габаритам выигрышей и объем рабочего раствора меньше, короче одни плюсы... 

Раствор бы и в первом варианте сливался полностью, так как переходник 160-110, по типу эксцентрика, т.е. выход 110мм смещен в плотную к краю, хотя это уже не важно.

Помпа китайская "Boyu" 1100л\ч столб воды 1.3 м. Она уже давно у меня, с подобными задачами проявляется в легкую.

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

Переносите куда надо, я пока не совсем понял структуру форума.

Название: Создание периодики на Arduino
Отправлено: Ann от 02 Июль 2016, 17:49:19
Ок, по Ардуине, если нужна помощь, обращайтесь, у меня небольшой опыт есть. Там программа от силы на 20-30 строчек кода получится, напишу если нужно. Только обратите внимание на важный нюанс: Ардуины бывают на 5V и на 3.3V. Аналогичным образом и модули/датчики бывают на 5V и на 3.3V. Убедитесь при покупке что и Ардуина и реле работают на одинаковом напряжении, чтобы костыли потом не пришлось изобретать.
Берите лучше на 5 вольт, зарядным от любой мобилки запитать можно.
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 02 Июль 2016, 19:16:09
Спасибо! От помощи не откажусь. Бегло полистав ифу, как я понял мне потребуется контроллер Arduino Uno, модуль на 2 реле, модуль часов реального времени. Или последний не обязателен?

Поправил схему шайтан трубы:

(https://img-fotki.yandex.ru/get/128446/340095097.0/0_13cec3_16d12cd2_XXL.jpg) (https://fotki.yandex.ru/next/users/asdset/album/509626/view/1298115)

Так вроде намного проще.  и при использование Arduino  поможет снизить бюджет примерно на 2500р.
Название: Создание периодики на Arduino
Отправлено: bottica от 02 Июль 2016, 19:31:39
Бегло полистав ифу, как я понял мне потребуется контроллер Arduino Uno, модуль на 2 реле, модуль часов реального времени. Или последний не обязателен?
С RTC проще отслеживать временные интервалы, привязываться к времени суток. И модуль лучше на четыре реле, как задел на будущее, допустим добавить датчик освещенности...
Название: Создание периодики на Arduino
Отправлено: Ann от 02 Июль 2016, 19:43:59
Модуль не обязателен, но, как сказал bottica, удобен. В Ардуине есть встроенный таймер с емкостью на 4млрд. миллисекунд (~50суток, при желании можно обработать его обнуление в коде, тем самым сделав бесконечным), но при выключении он сбивается. Я с ним не заморачивался (не было под рукой батарейки для него), но у меня был дисплей и возможность вручную вводить текущее время после включения (здесь (http://chile-forum.ru/index.php/topic,2318.255.html) описано).
Название: Создание периодики на Arduino
Отправлено: Ann от 02 Июль 2016, 19:46:09
Бегло полистав ифу, как я понял мне потребуется контроллер Arduino Uno, модуль на 2 реле, модуль часов реального времени. Или последний не обязателен?
С RTC проще отслеживать временные интервалы, привязываться к времени суток. И модуль лучше на четыре реле, как задел на будущее, допустим добавить датчик освещенности...
Насчет задела согласен, но датчик если добавлять, то уж лучше добавить ардуиновский, с прямым подключением к ардуине, чтоб можно было обрабатывать его показания в программе, изменяя интервалы.
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 02 Июль 2016, 20:33:56
Модуль не обязателен, но, как сказал bottica, удобен. В Ардуине есть встроенный таймер с емкостью на 4млрд. миллисекунд (~50суток, при желании можно обработать его обнуление в коде, тем самым сделав бесконечным), но при выключении он сбивается. Я с ним не заморачивался (не было под рукой батарейки для него), но у меня был дисплей и возможность вручную вводить текущее время после включения (здесь (http://chile-forum.ru/index.php/topic,2318.255.html) описано).


Стоит он все рано копейки, главное суметь правильно вписать в всю эту хрень :)  Релеху тогда закажу на 4шт. и датчик света сразу, вдруг до освещения доберусь.
Название: Создание периодики на Arduino
Отправлено: Ann от 02 Июль 2016, 20:57:04
Стоит он все рано копейки, главное суметь правильно вписать в всю эту хрень :)  Релеху тогда закажу на 4шт. и датчик света сразу, вдруг до освещения доберусь.
Датчик температуры/влажности еще возьмите, и соединительных проводов папа-мама и папа-папа по паре десятков.
А там и до WiFi-модуля с отображением параметров и управлением по интернету недалеко :)
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 02 Июль 2016, 22:18:33
не не не, все по минимуму, никаких вайфаев :)  Главное в этом всем, вовремя остановится....
Название: Создание периодики на Arduino
Отправлено: alexis69 от 06 Июль 2016, 11:59:15
Какие минусы есть у гидропонной системы работающей по принципу подпор?
На взгляд не специалиста, данная технология превосходит классику в части полива.
Можно уехать на несколько дней и не беспокоится что растение засохнет.
- нет риска засушить растение
- нет риска перелить растение
- сложность системы не выше чем у классики. Разница только в наличии глубокого поддона.
- в идеале вообще не требует внимания человека
Где же подвох?
Почему эта технология не популярна (здесь на форуме вообще никто не использует)?
Возможно, в жару недостаточно влаги поступающей капилярным способом? Нет?

p.s. у нас ведь капилярные силы поднимают влагу выше уровня жидкости? Т.е. достаточно просто обеспечить контакт субстрата с раствором? Глубоко погружать не надо?
Название: Создание периодики на Arduino
Отправлено: Jah от 06 Июль 2016, 12:51:03
В первую очередь, проблема в том, что системы без циркуляции раствора очень быстро ослизневают, а корни задыхаются. При нормальной аэрации раствора отличия систем чисто технические.
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 22 Июль 2016, 13:11:56
Никидал тут схемку своего ардуин-контроллера для "переодики" :

(https://img-fotki.yandex.ru/get/101212/340095097.0/0_140a9a_53c4fe71_orig.jpg) (https://fotki.yandex.ru/next/users/asdset/album/509626/view/1313434)

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

По порядку:

ЧРВ- часы реального времени
ДУЖ - датчик уровня жидкости
П-Р - потенциометр
К - кнопка
Д - светодиод.



Принцип действия, собственно сам рабочий цикл:

В нужное время старт,

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

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

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

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


Кнопки:

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

Диоды нужны для индикации выбранной программы 1 светит - 1я, 2 - 2я, 3 -3я....


зы. Если не в кассу пост, перенесите в мою тему, или я сам перенесу. Просто вроде тут начали обсуждение строительства гидропоник и логично будет тут и продолжить. 
Название: Создание периодики на Arduino
Отправлено: Ann от 22 Июль 2016, 14:00:45
Немного не понял по кнопкам.
Вы нажимаете на кнопку и у нас происходит короткое замыкание между +5V и GND, т.е. бадабум и прощай Ардуина.
Или Вы просто резисторы на схеме не отразили ?

Название: Создание периодики на Arduino
Отправлено: AlexYalta от 22 Июль 2016, 14:02:59
резисторы не отразил.


зы. Позже если все удачно собрать получится, распишу подробней, с фотками.
Название: Создание периодики на Arduino
Отправлено: Ann от 22 Июль 2016, 15:59:57
Несколько мыслей/вопросов:

1. По поводу датчика уровня жидкости
У Вас такой ?
(http://arduino.ru/sites/default/files/u11685/datchik_urovnya_vody.jpg)
Если да, то лучше его не использовать.
Его принцип действия основан на электропроводности воды, а она в свою очередь зависит от ррм. Т.е. показываемый им уровень заполнения будет плавать, то отключит помпу при половине, то не отключит совсем.
И плюс опять же - электролиз. Дорожки будут окисляться, а с ними полетит к чертям надежность системы.

Я бы просто замерил время наполнения трубы и зашил бы его в программу (добавил бы 10% на всякий случай). Это будет на порядок надежнее.

2. Не совсем понял необходимость потенциометра, каждый раз должна набираться труба до верха. Зачем что-то регулировать ? Лучше его приспособить для регулировки частоты затопления.

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

4. Индикацию на диодах практичнее сделать пульсирующую. Ну, скажем, первый диод будет отвечать за частоту затопления. Быстро мигает 3 раза, затем 2 секунды перерыв, затем снова - значит включена третья программа, 6 раз - значит включена 6 программа.
Второй диод, например отвечает за продолжительность затопления. Тот же принцип. Это будет практичнее, возможно программ у Вас будет 10 на каждый параметр, диодов столько не напасешься. И плюс мгновенно можно будет отслеживать изменение программ потенциометром (без индикации им трудно что-то регулировать).

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

6. А вы не брали датчик температуры/влажности ? Удобно было бы привязать частоту затопления к температуре/влажности.

Ну а в целом вроде бы все правильно нарисовали, только если не трудно отобразите все элементы с указанием номинала (резисторы).

И, если не трудно, выложите скетч.


Пост совершенно в тему. Если, кстати, наберется более-менее полная информация, вынесу в отдельную тему под названием "Ардуина", давно еще меня просили отдельную тему по ней сделать. А такого подробного описания процесса изготовления и настройки системы со схемами, как у Вас, еще никто на форуме не делал.
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 22 Июль 2016, 16:17:01
Несколько мыслей/вопросов:

1. По поводу датчика уровня жидкости
У Вас такой ?
Если да, то лучше его не использовать.
Его принцип действия основан на электропроводности воды, а она в свою очередь зависит от ррм. Т.е. показываемый им уровень заполнения будет плавать, то отключит помпу при половине, то не отключит совсем.
И плюс опять же - электролиз. Дорожки будут окисляться, а с ними полетит к чертям надежность системы.

Я бы просто замерил время наполнения трубы и зашил бы его в программу (добавил бы 10% на всякий случай). Это будет на порядок надежнее.

2. Не совсем понял необходимость потенциометра, каждый раз должна набираться труба до верха. Зачем что-то регулировать ? Лучше его приспособить для регулировки частоты затопления.

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

4. Индикацию на диодах практичнее сделать пульсирующую. Ну, скажем, первый диод будет отвечать за частоту затопления. Быстро мигает 3 раза, затем 2 секунды перерыв, затем снова - значит включена третья программа, 6 раз - значит включена 6 программа.
Второй диод, например отвечает за продолжительность затопления. Тот же принцип. Это будет практичнее, возможно программ у Вас будет 10 на каждый параметр, диодов столько не напасешься. И плюс мгновенно можно будет отслеживать изменение программ потенциометром (без индикации им трудно что-то регулировать).

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

6. А вы не брали датчик температуры/влажности ? Удобно было бы привязать частоту затопления к температуре/влажности.

Ну а в целом вроде бы все правильно нарисовали, только если не трудно отобразите все элементы с указанием номинала (резисторы).

И, если не трудно, выложите скетч.


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


1 - да, именно такой.
2 - это исходя из глюкавости датчика уровня жидкости, думал в случае если поползет куда, можно было подкорректировать.
3 - думаю я вообще откажусь от его использования, и собирать и программировать все это проще будет. Может потом на что сгодится.
4 -  над индикацией еще не думал, просто привел пример.
5 - поищу. вроде было что то такое.
6 - прока нет, хотел взять датчик освещенности, но его не оказалось и мне вернули деньги :(  Может и к лучшему, пока обойдусь простой системой, потом посмотрю что да как работает и уже доделаю до более серьезной.
 
Скетча  нет, у меня все пока  кусками, часы, кнопки, диоды. В воскресенье, если будет время хочу заняться по плотней, может уже что то более конкретное и осознанное сделаю....  Как будет результат обязательно поделюсь, правда думаю до этого еще далеко :)  Схему тоже потом нормальную нарисую, та что есть,  просто общая концепция для понимания в какую сторону двигаться и что вообще надо делать, да и свою функцию уже выполнила, ДУЖ в топку :)




Название: Создание периодики на Arduino
Отправлено: Ann от 22 Июль 2016, 16:21:39
Еще мысль появилась по поводу управления.
Кнопками можно переключить, что именно мы будем регулировать, а потенциометром уже собственно регулировать.
Ну, скажем, нажимаем первую кнопку, входим в режим регулирования частоты затопления. Потенциометром влево-вправо, регулируем эту частоту.
Вторая - продолжительность затопления, то же самое.
Третья - аварийные режимы, потенциметром переключаемся между режимами (1-принудительное затопления, 2 принудительный слив, ночной режим, режим пасмурной погоды, 3-кратная промывка корней, и т.д. в общем придумать на что фантазии хватит, практика сама подскажет, что нужно, а что нет).
А соответствующие диоды будут пульсирующей индикацией отображать режимы. Как-то так.

Хотел спросить, Вы в какой программе такие красивые схемки рисуете ?
Название: Создание периодики на Arduino
Отправлено: kido от 22 Июль 2016, 17:04:01
Простите, что вмешиваюсь, но не кажется ли вам, что простота - залог надежности? Может не стоит плодить лишние сущности в виде ардуинов, клапанов и т.п.?
Чем плох вариант механического контроля уровня?
(https://jahforum.org/uploads//monthly_03_2013/post-5005-0-59214800-1364400721_thumb.jpg)
А с периодичностью включения помпы справится и обычный электромеханический таймер типа ТМ32.

P.S. Конечно, всякие электронные штуки это интересно, но, зачастую, это только лишняя головная боль.
Хотя если данная установка создается исключительно для удовлетворения своей жажды деятельности, то тогда да.  :)
Название: Создание периодики на Arduino
Отправлено: Ann от 22 Июль 2016, 17:20:43
Простите, что вмешиваюсь, но не кажется ли вам, что простота - залог надежности? Может не стоит плодить лишние сущности в виде ардуинов, клапанов и т.п.?

А с периодичностью включения помпы справится и обычный электромеханический таймер типа ТМ32.

P.S. Конечно, всякие электронные штуки это интересно, но, зачастую, это только лишняя головная боль.
Хотя если данная установка создается исключительно для удовлетворения своей жажды деятельности, то тогда да.  :)
Если приоритетом поставить простоту, тогда и с гидропоникой нечего заморачиваться, не так ли ? Выращивать себе тихонько "Огонек" на кухне в земле, и не испытывать "лишнюю головную боль".  :)

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

Название: Создание периодики на Arduino
Отправлено: AlexYalta от 22 Июль 2016, 17:24:33
Еще мысль появилась по поводу управления.
Кнопками можно переключить, что именно мы будем регулировать, а потенциометром уже собственно регулировать.
Ну, скажем, нажимаем первую кнопку, входим в режим регулирования частоты затопления. Потенциометром влево-вправо, регулируем эту частоту.
Вторая - продолжительность затопления, то же самое.
Третья - аварийные режимы, потенциметром переключаемся между режимами (1-принудительное затопления, 2 принудительный слив, ночной режим, режим пасмурной погоды, 3-кратная промывка корней, и т.д. в общем придумать на что фантазии хватит, практика сама подскажет, что нужно, а что нет).
А соответствующие диоды будут пульсирующей индикацией отображать режимы. Как-то так.

Хотел спросить, Вы в какой программе такие красивые схемки рисуете ?

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


зы. Прога CorelDRAW,  я дизайнер, векторные, растровые 3d и прочие граф. редакторы это моя родная стихия.
Название: Создание периодики на Arduino
Отправлено: Ann от 22 Июль 2016, 17:31:58

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

зы. Прога CorelDRAW,  я дизайнер, векторные, растровые 3d и прочие граф. редакторы это моя родная стихия.
Ну да, я немного удивился, что Вы сразу уже готовую схему нарисовали. Я как в правило, если разбираюсь с чем, то иду мелкими шажками, ну, к примеру, заставил работать реле, потом мигать диодик, потом реагировать на кнопку и т.д. Сразу все это сложновато, немалый опыт нужен. А опыт программирования какой-нибудь есть ?
Название: Создание периодики на Arduino
Отправлено: kido от 22 Июль 2016, 17:39:27
Ann,  вы немного неверно поняли смысл моего поста (или я криво изложил :) ): я не призывал к простоте в выборе условий выращивания, а только к упрощению самой конструкции.
Безусловно, Ардуино лучше, гибче и надеждей (нет мех. частей) чем эм-таймер - с этим согласен, но датчик уровня (такого типа), электромагнитные клапана - это, имхо, лишнее. Если в данной системе от этого можно отказаться, то от этого стоит отказаться.
А что касается "создание и настройка такой системы - развлечение не хуже...", то мне эти "развлечения" в кошмарных снах снятся!
Издержки, так сказать, профессии  :D
Название: Создание периодики на Arduino
Отправлено: Ann от 22 Июль 2016, 17:51:27
Ann,  вы немного неверно поняли смысл моего поста (или я криво изложил :) ): я не призывал к простоте в выборе условий выращивания, а только к упрощению самой конструкции.
Безусловно, Ардуино лучше, гибче и надеждей (нет мех. частей) чем эм-таймер - с этим согласен, но датчик уровня (такого типа), электромагнитные клапана - это, имхо, лишнее. Если в данной системе от этого можно отказаться, то от этого стоит отказаться.
А что касается "создание и настройка такой системы - развлечение не хуже...", то мне эти "развлечения" в кошмарных снах снятся!
Издержки, так сказать, профессии  :D
Ну от этого датчика AlexYalta уже, насколько я понял, отказался. Ардуина и реле довольно выносливые. По электромагнитным клапанам лично никогда не сталкивался, но их критики вроде бы не встречал, тоже отрабатывают свое, в тех же стиралках, если не ошибаюсь.
В принципе, мне кажется, что предложенная AlexYalta схема довольна проста, надежна и в то же время функциональна, если бы я собирал, то собрал бы точно такую, тут мы с ним мыслим одинаково.
А по поводу кошмарных снов - тут, да, у каждого своих хватает  :) Или наоборот не хватает  :D, приходится создавать себе на задн голову новые приключения. В этом вся прелесть жизни :)
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 22 Июль 2016, 18:12:19

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

зы. Прога CorelDRAW,  я дизайнер, векторные, растровые 3d и прочие граф. редакторы это моя родная стихия.
Ну да, я немного удивился, что Вы сразу уже готовую схему нарисовали. Я как в правило, если разбираюсь с чем, то иду мелкими шажками, ну, к примеру, заставил работать реле, потом мигать диодик, потом реагировать на кнопку и т.д. Сразу все это сложновато, немалый опыт нужен. А опыт программирования какой-нибудь есть ?


Опыта программирования нет, мой путь аналогичен вашему, общий принцип работы, кнопочка, диодик, часики сейчас изучаю, далее релехи, потенциометры.... 
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 22 Июль 2016, 18:28:45
Ann,  вы немного неверно поняли смысл моего поста (или я криво изложил :) ): я не призывал к простоте в выборе условий выращивания, а только к упрощению самой конструкции.
Безусловно, Ардуино лучше, гибче и надеждей (нет мех. частей) чем эм-таймер - с этим согласен, но датчик уровня (такого типа), электромагнитные клапана - это, имхо, лишнее. Если в данной системе от этого можно отказаться, то от этого стоит отказаться.
А что касается "создание и настройка такой системы - развлечение не хуже...", то мне эти "развлечения" в кошмарных снах снятся!
Издержки, так сказать, профессии  :D

Мне в кашмарах ремонты квартир снятся, когда в воскресенье по ящику попадается передача "квартирный вопрос" возникает практически непреодолимое желание выкинуть телек в окно :) 

Клапана в системе "переодики" необходимы, ими можно регулировать время на которое корневая будет затоплена. Механически это никак не отрегулировать. ИМХО естественно. 

Если у Вас есть идеи по теме конструирования гидропонных систем, не стесняйтесь, пишите, чем больше инфы тем лучше. Возможно появится концепт более простой в изготовлении, что есть хорошо для темы и форума в целом... 
Название: Создание периодики на Arduino
Отправлено: Ann от 22 Июль 2016, 18:29:24
Если никогда не сталкивались с программированием, то Вам будет сложно (я б даже сказал очень сложно) написать более менее сложную программу.
Без знакомства с базовыми основами написания программ (типы переменных, флаги, массивы, условия, циклы, функции, инкременты и т.д.) очень сложно реализовать логику программы.

Если хотите, если есть сейчас время и под рукой Ардуина, давайте попробуем с чего-нибудь начать, ну например, включать реле каждые 10 секунд на 2 секунды, затем уже сами сориентируетесь. Или это уже умеете ?
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 22 Июль 2016, 19:02:24
Ардуину уже заставил мигать диодами, с интервалами, пару примеров для ШИМ выхода сделал, кнопку тоже работать заставил. Часы пока сложно, но надеюсь в воскресенье будет время поседеть поковырять. Если есть свободная минутка, читаю инфу по синтаксису.

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

зы. Трудности меня не пугают. Чем сложней задача, тем больше кайфа от её реализации :) Тем более что у меня есть идеи на другие варианты применения ардуины, и думаю базовые навыки конструирования - программирования систем на её основе будут очень для меня полезны.... 
Название: Создание периодики на Arduino
Отправлено: Ann от 22 Июль 2016, 19:05:03
Ок, маякуйте, если что.
Название: Создание периодики на Arduino
Отправлено: kido от 22 Июль 2016, 19:08:59
Если у Вас есть идеи по теме конструирования гидропонных систем, не стесняйтесь, пишите, чем больше инфы тем лучше. Возможно появится концепт более простой в изготовлении, что есть хорошо для темы и форума в целом... 
Я за отказ от клапанов и использование перелива.
Название: Создание периодики на Arduino
Отправлено: Ann от 22 Июль 2016, 19:11:12
Если у Вас есть идеи по теме конструирования гидропонных систем, не стесняйтесь, пишите, чем больше инфы тем лучше. Возможно появится концепт более простой в изготовлении, что есть хорошо для темы и форума в целом... 
Я за отказ от клапанов и использование перелива.
Почему?
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 22 Июль 2016, 19:42:05
Если у Вас есть идеи по теме конструирования гидропонных систем, не стесняйтесь, пишите, чем больше инфы тем лучше. Возможно появится концепт более простой в изготовлении, что есть хорошо для темы и форума в целом...  
Я за отказ от клапанов и использование перелива.

если с переливом, часть раствора будет оставаться в рабочих емкостях, что насколько я понимаю не торт для перца....

Или Вы в смысле, использовать слив с малым диаметром? раствор типа не будет успевать стекать пока работает помпа?
Название: Создание периодики на Arduino
Отправлено: kido от 22 Июль 2016, 19:57:06
Ann: Используя перелив, уровень зафиксирован и изменить его "значение" можно только сознательно. Надежность 100%
AlexYalta: Раствор не будет оставаться т.к. при откл. помпы он по линии подачи вернется в емкость хранения (исходим из того, что помпа находится в ней и погружена в раствор)
Дополнительно, переливаясь, раствор будет обогащаться кислородом при сливе в емкость (еффект водопада)

Цитировать
Или Вы в смысле, использовать слив с малым диаметром? раствор типа не будет успевать стекать пока работает помпа?
верно
Название: Создание периодики на Arduino
Отправлено: Ann от 22 Июль 2016, 21:15:32
Вы правы, только там, во-первых, будет небольшой минус - помпа будет колотить все время питания (расход эл-ва, износ), а, во-вторых, AlexYalta стремится минимизировать кол-во раствора с помощью каскадов, что не позволяет такой способ использовать.
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 22 Июль 2016, 22:47:41
Ann: Используя перелив, уровень зафиксирован и изменить его "значение" можно только сознательно. Надежность 100%
AlexYalta: Раствор не будет оставаться т.к. при откл. помпы он по линии подачи вернется в емкость хранения (исходим из того, что помпа находится в ней и погружена в раствор)
Дополнительно, переливаясь, раствор будет обогащаться кислородом при сливе в емкость (еффект водопада)

Цитировать
Или Вы в смысле, использовать слив с малым диаметром? раствор типа не будет успевать стекать пока работает помпа?
верно

Те помпы что были у меня имеют что то типа "обратного клапана" в обратку даже при отключении ничего не идет... Возможно у Вас другая.  Если вам интресна данная тема, прошу распишите желательно с схемами как вы себе представляете свою систему. Это полезно для всех, разные варианты больше возможностей... и учтите что тут не мега инженеры пишут и профессиональный взгляд  и новые идеи только приветствуются. Главное объяснить и показать свои идеи максимально доступным и понятным способом...     
Название: Создание периодики на Arduino
Отправлено: kido от 22 Июль 2016, 23:18:43
В таком случае, ради уменьшения количества рабочего раствора придется идти на всякие ухищрения с электроклапанами. :(

Касаемо экономии электроэнергии и износа...
Если абстрагироваться от каскадной системы и взять за пример систему приведенную мной несколькими постами выше, то:
- время полного затопления системы определяется экспериментально и управляется контроллером,
- превышение уровня компенсирует система перелива,
- сечение дренажа подбирается таким образом, чтобы ~1/2 объема сливалась  минут за 10-15.
Т.к. время затопленного состояния системы не рекомендуют делать больше 15-20мин (если больше, то начинается кислородное голодание корней), то варьировать нужно будет только время пауз. Обычно от 45мин до 3ч.
Получается, что перерасхода электроэнергии и сильного износа не будет.
Как-то так....  :)
Название: Создание периодики на Arduino
Отправлено: kido от 22 Июль 2016, 23:23:14
Если бы я собирал "периодичку", то брал бы за основу это: http://www.hydroponicsonline.com/blog/6-plant-ebb-flow-flood-and-drain-hydroponic-system (http://www.hydroponicsonline.com/blog/6-plant-ebb-flow-flood-and-drain-hydroponic-system)
+добавил бы дренажные трубки.

Название: Создание периодики на Arduino
Отправлено: Ann от 22 Июль 2016, 23:36:31
- сечение дренажа подбирается таким образом, чтобы ~1/2 объема сливалась  минут за 10-15.
Как вариант, можно на во время водопоя переводить помпу в режим поддержания уровня (скажем включать каждую минуту на 10 сек), чтобы не заморачиваться с подбором диаметра шланга (слишком тонкий тоже не желательно, может забиться корнями).
В общем вариантов куча.
Название: Создание периодики на Arduino
Отправлено: kido от 22 Июль 2016, 23:51:11
Можно и так, но частый старт/стоп и есть самый убийственный режим для двигателя :(
Лучше проблему забивания дренажной трубы корнями решать дублированием оной + защитная сетка на входе
(http://magicles.org/files/pics/gidroponika/gidroponic_device/4_setka.jpg)
Название: Создание периодики на Arduino
Отправлено: Ann от 23 Июль 2016, 00:07:20
Да, согласен.
Все-таки, конечно, вариант с клапанами, мне кажется предпочтительнее. Не нужно заморачиваться с диаметрами шлангов, их дублированием, идти на компромисы. Когда захотел - налил, когда захотел - слил, никаких ограничений с каскадами и пр. возможные неудобства.
А почему Вы так принципиально против клапанов, сталкивались с ними ? Какие подводные камни в работе с ними ? Насколько велик риск поломки, какие факторы на этот риск влияют ?
Название: Создание периодики на Arduino
Отправлено: kido от 23 Июль 2016, 01:21:54
Я же говорю, издержки профессии ))) Будучи разработчиком систем АСУТП, стараешься по возможности сделать систему как можно проще.
Минус использования клапанов вижу в отсутствии обратной связи. При выходе из строя или не закачается раствор или не сольется. Мы ведь не контролируем их состояние. Или опять таки придется вводить косвенную обратную связь (как вы и предлагали, можно контролировать уровень раствора в емкости хранения).
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 23 Июль 2016, 12:08:31
Если бы я собирал "периодичку", то брал бы за основу это: http://www.hydroponicsonline.com/blog/6-plant-ebb-flow-flood-and-drain-hydroponic-system (http://www.hydroponicsonline.com/blog/6-plant-ebb-flow-flood-and-drain-hydroponic-system)
+добавил бы дренажные трубки.


Спасибо, хороший  и простой вариант.  Когда буду собирать свою, опробую и такой вариант, только вместо бутылок использую свою схему с трубами. Думаю при достаточном диаметре труб и аналогичных габаритах, можно получить больший объем для корневой. Если норм получится, и разберусь с искусственным освещением, одну оставлю дома, вторую, более простую поставлю в офисе.
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 23 Июль 2016, 12:25:24
Я же говорю, издержки профессии ))) Будучи разработчиком систем АСУТП, стараешься по возможности сделать систему как можно проще.
Минус использования клапанов вижу в отсутствии обратной связи. При выходе из строя или не закачается раствор или не сольется. Мы ведь не контролируем их состояние. Или опять таки придется вводить косвенную обратную связь (как вы и предлагали, можно контролировать уровень раствора в емкости хранения).

Простота это хорошо. Мне свойственно все усложнять и  изобретать велосипеды, в этом для меня есть свой кайф :)

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



Кстат как специалист что думаете о таком клапане http://valveko.ru/valveko/klapany/bmc-09.html  вроде пишут что пригоден для работы при нулевом давлении. В отличии от клапанов для стиралок, которым необходимо давление воды для корректной работы.

 Если есть еще какие варианты по теме клапанов, предлагайте, буду признателен. Пока система с клапанами для меня предпочтительней, по ряду причин, я начинающий перцевод, мне нужна максимально гибкая система, чтоб проще было разобраться в тонкостях выращивания данной культуры. Да и каскад с его двойным(тройным, четверным:)) уменьшением рабочего объема раствора тоже весьма заманчив, всегда более свежий раствор, меньшая емкость для хранения, меньшее время работы помпы.... 
Название: Создание периодики на Arduino
Отправлено: Ann от 23 Июль 2016, 19:17:13
Решил набросать Вам самую громоздкую часть программы - управление режимами и их индикация. Паяльник брать в руки и доставать свою Ардуину было лень, но во время написания программы нужно проверять ее работоспособность, полез в интернет поискать какой-нить эмулятор Ардуины и набрел на просто потрясную штуку - Proteus. Даже видео захотелось снять, как он работает.
В общем используем 3 наших диода, 1 кнопку и 1 потенциометр (проще было бы конечно три потенциометра, по 1 на каждый параметр, но и с одним вполне юзабельно получилось).
На видео справа там подключен виртуальный осциллограф, так нагляднее следить за морганиями диодов, и внизу виртуальный вольтметр, для наглядности, чтобы понимать какое напряжение потенциометр на наш вход подает.
Принцип действия следующий:
Потенциометром мы меняем значение 3 переменных, которые могут принимать значение от 1 до 11. Т.е. ручка потенциометра влево до упора - будет 1, вправо до упора - 11. Можно кстати шкалу вокруг него впоследствии нарисовать - очень удобно и точно получится.
Каждая из этих переменных отвечает на 1 параметр. Например, первая - за частоту затоплений, вторая - продолжительность затоплений, третья - какие-нибудь спец. режимы (принудительное затопление или слив и т.д.). Затем к этим переменным мы просто подвяжем таймеры помпы и клапана.
Диод, отвечающий за каждый параметр моргает столько раз, сколько равна переменная, с последующий перерывом 2 секунды. Вначале все три установлены в значение 1.
Потенциометром в каждый момент времени мы регулируем только одну переменную. На видео вначале потенциометр подвязан к "красной" переменной, на 20-й секунде я его начинаю "крутить", соответственно мы видим, как меняется количество морганий красного диода, значит переменную изменили.
Кнопка у нас изменяет "подвязку" потенциометра. На 35-й секунде я нажимаю на нее и видно как поочередно загораются диоды (в момент смены режимов они уже не моргают как раньше, а просто горят, показывая к какой переменной в данный момент подвязан потенциометр).
На 50 секунде я оставляю подвязку на "зеленой" переменной и начинаю её изменять.
Подвязка происходит через 3 секунды с момента последнего нажатия кнопки. В этом момент переменная становится равна тому, в каком положении находится потенциометр, и диоды из режима отображения подвязки возвращаются в режим отображения значений своих переменных.
Задержка эта сделана для того, чтобы иметь возможность выбрать параметр, не изменяя другой, который вы изменять не хотите. Ну, к примеру, в данный момент потенциометр подвязан к красному диоду, а нам нужно изменить зеленый. Но для этого мы проходим через желтый, и если бы не было такой задержки, то желтый принял бы значение потенциометра при проходе через него, чего нам не нужно, а задержка даст возможность спокойно выбрать нужный параметр.
В общем не знаю на сколько доступно изложил, но на деле все довольно просто и интуитивно.
Вот видео:
(http://img10.lostpic.net/2016/07/23/7207e6e78bfe9fb79e2fd110a4d5e4b9.png) (https://youtu.be/00S0p97NiEw)

Название: Создание периодики на Arduino
Отправлено: kido от 23 Июль 2016, 21:45:05
Цитировать
Мне свойственно все усложнять и  изобретать велосипеды, в этом для меня есть свой кайф
Если мы говорим о неком лабораторном стенде, то можно и изобретать и усложнять. Лишь бы в радость на здоровье! ;)
На счет клапана мыслей особо нет, т.к. плотно с ними не сталкивался. Посоветую только одно: берите с катушкой на 12В.
Знаю из аквариумной темы, что пневмоклапана на 220В довольно сильно греются, гораздо сильнее чем на 12В. Правда там время работы измеряется часами.
Что касается уменьшения кол-ва раствора, то я сильно бы за этим не гнался, рискуете нарваться на нестабильность параметров. В большем объеме гораздо меньше колебаний и легче поддерживать концентрации компонентов.
Время работы помпы.... ну, не знаю! :) При потреблении 15-20Вт/ч мне было бы все равно работает помпа 2мин или 5мин.
Кстати, в вашем случае я бы уменшил диаметр со 160 до 110мм. Не такая уж большая у перца корневая. Это же не cаnnаbis! ))))))


Цитировать
1 потенциометр
Ann, а как в таком случае узнать предыдущее значение для каждой переменной?
Название: Создание периодики на Arduino
Отправлено: Ann от 23 Июль 2016, 21:49:44
Ann, а как в таком случае узнать предыдущее значение для каждой переменной?
Не совсем понял суть вопроса, ну так каждый диод мигает столько раз, чему равна переменная. Ну, например, мигает красный диод по 3 раза с двухсекундными перерывами, значит "красная" переменная равна трем.
Название: Создание периодики на Arduino
Отправлено: kido от 23 Июль 2016, 22:18:44
Теперь ясно
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 23 Июль 2016, 23:14:08
Решил набросать Вам самую громоздкую часть программы - управление режимами и их индикация. Паяльник брать в руки и доставать свою Ардуину было лень, но во время написания программы нужно проверять ее работоспособность, полез в интернет поискать какой-нить эмулятор Ардуины и набрел на просто потрясную штуку - Proteus. Даже видео захотелось снять, как он работает.
В общем используем 3 наших диода, 1 кнопку и 1 потенциометр (проще было бы конечно три потенциометра, по 1 на каждый параметр, но и с одним вполне юзабельно получилось).
На видео справа там подключен виртуальный осциллограф, так нагляднее следить за морганиями диодов, и внизу виртуальный вольтметр, для наглядности, чтобы понимать какое напряжение потенциометр на наш вход подает.
Принцип действия следующий:
Потенциометром мы меняем значение 3 переменных, которые могут принимать значение от 1 до 11. Т.е. ручка потенциометра влево до упора - будет 1, вправо до упора - 11. Можно кстати шкалу вокруг него впоследствии нарисовать - очень удобно и точно получится.
Каждая из этих переменных отвечает на 1 параметр. Например, первая - за частоту затоплений, вторая - продолжительность затоплений, третья - какие-нибудь спец. режимы (принудительное затопление или слив и т.д.). Затем к этим переменным мы просто подвяжем таймеры помпы и клапана.
Диод, отвечающий за каждый параметр моргает столько раз, сколько равна переменная, с последующий перерывом 2 секунды. Вначале все три установлены в значение 1.
Потенциометром в каждый момент времени мы регулируем только одну переменную. На видео вначале потенциометр подвязан к "красной" переменной, на 20-й секунде я его начинаю "крутить", соответственно мы видим, как меняется количество морганий красного диода, значит переменную изменили.
Кнопка у нас изменяет "подвязку" потенциометра. На 35-й секунде я нажимаю на нее и видно как поочередно загораются диоды (в момент смены режимов они уже не моргают как раньше, а просто горят, показывая к какой переменной в данный момент подвязан потенциометр).
На 50 секунде я оставляю подвязку на "зеленой" переменной и начинаю её изменять.
Подвязка происходит через 3 секунды с момента последнего нажатия кнопки. В этом момент переменная становится равна тому, в каком положении находится потенциометр, и диоды из режима отображения подвязки возвращаются в режим отображения значений своих переменных.
Задержка эта сделана для того, чтобы иметь возможность выбрать параметр, не изменяя другой, который вы изменять не хотите. Ну, к примеру, в данный момент потенциометр подвязан к красному диоду, а нам нужно изменить зеленый. Но для этого мы проходим через желтый, и если бы не было такой задержки, то желтый принял бы значение потенциометра при проходе через него, чего нам не нужно, а задержка даст возможность спокойно выбрать нужный параметр.
В общем не знаю на сколько доступно изложил, но на деле все довольно просто и интуитивно.
Вот видео:


Вполне понятно. Огромное спасибо!  Идея с одной кнопкой и одним потенциометром нравится. Проще все спаять будет, хотя я и неплохо это умею, но все же пайка это не мое...


Зы. Завтра буду ардуину крутить, соберу на макетной плате вашу схемку. Только потенциометр у меня дефектный оказался, но где то еще один валялся.   

Зы . скетч бы Ваш, тоже не помешал :)
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 23 Июль 2016, 23:22:48
Цитировать
Мне свойственно все усложнять и  изобретать велосипеды, в этом для меня есть свой кайф
Если мы говорим о неком лабораторном стенде, то можно и изобретать и усложнять. Лишь бы в радость на здоровье! ;)
На счет клапана мыслей особо нет, т.к. плотно с ними не сталкивался. Посоветую только одно: берите с катушкой на 12В.
Знаю из аквариумной темы, что пневмоклапана на 220В довольно сильно греются, гораздо сильнее чем на 12В. Правда там время работы измеряется часами.
Что касается уменьшения кол-ва раствора, то я сильно бы за этим не гнался, рискуете нарваться на нестабильность параметров. В большем объеме гораздо меньше колебаний и легче поддерживать концентрации компонентов.
Время работы помпы.... ну, не знаю! :) При потреблении 15-20Вт/ч мне было бы все равно работает помпа 2мин или 5мин.
Кстати, в вашем случае я бы уменшил диаметр со 160 до 110мм. Не такая уж большая у перца корневая. Это же не cаnnаbis! ))))))


Цитировать
1 потенциометр
Ann, а как в таком случае узнать предыдущее значение для каждой переменной?

По сути это и есть лабораторный стенд :)

Наврено за клапанами я все же отправлюсь на али, они там по 250р.  да и помпу думаю там еще одну возму, тоже цена канареечная... все естественно на 12v. 

Для контроля параметров раствора приобретены все необходимые приблуды. Так что думаю повторяемости я достигну....

Помпа чутка гудит, так что чем меньше тем лучше, да и залить за минимальное время тоже полезно.

Пускай пока 160 побудет. Запас не помешает, а вот если не хватит, будет обидно....
Название: Создание периодики на Arduino
Отправлено: kido от 23 Июль 2016, 23:37:25
Для контроля параметров раствора приобретены все необходимые приблуды. Так что думаю повторяемости я достигну....
Не в повторяемости дело. Испарилось у вас, предположим, 100мл воды, для объема в 1л - это 10%, а для 10л - 1%. Концентрации поменяются соответственно. Но это я так, к слову :)

Помпа чутка гудит, так что чем меньше тем лучше, да и залить за минимальное время тоже полезно.

Пускай пока 160 побудет. Запас не помешает, а вот если не хватит, будет обидно....
"Вас, Ивановых, не поймешь!..."(с)  :D
Название: Создание периодики на Arduino
Отправлено: Ann от 24 Июль 2016, 00:00:00
Немного прокомментировал, чтоб легче было разобраться, что не понятно, спрашивайте
(красным выделил переменные, которые можете изменять, остальные служебные)
int current_mode = 1;                       //Переменная, показывающая к какому параметру привязан потенциометр, может быть 1, 2, 3, которые соотв. "красному", "желтому" и "зеленому"
boolean change = 0;                         // Флаг, показывающий, что мы находимся в режиме изменения привязки потенциометра, 1-в режиме, 0-не в режиме
float change_last_time = 0;                 // для засечки 3 секундного таймера выхода из режима изменения привязки

int x=0;                                    //Переменная, в которой храним считанные показания потенциометра

int y = 0;                                  //Переменная, в которой храним считанные показания цифрового входа кнопки, 0 или 1, нажата или нет
float y_last_time = 0;                      //Для засечки таймера
[color=red]
int led_red = 1;[/color]                            //Наша главная "красная" переменная, к которой будем в дальнейшем привязывать исполняющие таймеры
boolean led_red_flag = 0;                   //Флаг для мигания
int led_red_current = 0;                    //Порядковый номер текущего "мига"
float led_red_last_time = 0;                //для засечки таймера

[color=red]int led_green = 1;     [/color]                     // Главная "зеленая" переменная
boolean led_green_flag = 0;                  // Далее все аналогично, как и у красной
int led_green_current = 0;
float led_green_last_time = 0;

[color=red]int led_blue = 1;          [/color]                 //Главная "желтая" переменная, назвал blue, но не важно
boolean led_blue_flag = 0;
int led_blue_current = 0;
float led_blue_last_time = 0;

[color=red]int led_freq = 200; [/color]                        //Частота мигания, т.е. перерыв между каждым миганием в миллисекундах
[color=red]int led_pause = 2000; [/color]                      //Пауза между сериями миганий в мс
                    

void setup() {
  pinMode(2, INPUT);                        //Пин для кнопки
  pinMode(11, OUTPUT);                      //пины для диодов
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(A5, INPUT);                       //пин для потенциометра
}

void loop() {
  
if(!change){                                                //если не находимся в режиме смены привязки, значит меняем главные переменные
   x = analogRead(A5);
   if (current_mode == 1){ led_red = (int)(x/100) + 1;}     //Меняем переменную, в зависимости от текущей привязки
   if (current_mode == 2){ led_green = (int)(x/100) + 1;}   //Вот здесь важная формула, потенциометр на аналоговый вход выдает нам значение от 0 до 1024
   if (current_mode == 3){ led_blue = (int)(x/100) + 1;}    //Делим на 100, округляем и добавляем 1 (чтоб нуля не было), получается переменная может принимать значения
                                                            // от 1 до 11.
}


if(change && (millis()-change_last_time)>3000){             //Это момент выхода из режима привязки, обнуляются служебные переменные диодов, выключаются
  change = 0;                                              
  led_green_current = 0;
  led_red_current = 0;
  led_blue_current = 0;
  led_red_flag = 0;
  digitalWrite(11, 0);
  led_green_flag = 0;
  digitalWrite(12, 0);
  led_blue_flag = 0;
  digitalWrite(13, 0);
  }

if((millis()-y_last_time)>200){                     //Обработка нажатия на кнопку, добавил небольшой таймер 200мс, чтоб убрать "дребезг" - множественное срабатывание, кнопка будет срабатывать только если ее немного подержать (200мс)
  y = digitalRead(2);                               //читаем кнопочный выход
  if (y>0){                                         //если кнопка нажата
    current_mode++;                                 //инкрементируем текущий режим
    if(current_mode > 3) {current_mode = 1;}        //если получилось 4, то возвращаемся на 1
    change = 1;                                     //объявляем режим смены привязки
    change_last_time = millis();                    //засекаем для 3-секундного таймера выхода из режима смены
    digitalWrite(11, 0);                            //выключаем все диоды
    digitalWrite(12, 0);
    digitalWrite(13, 0);
    if (current_mode == 1){  digitalWrite(11, 1);}  //зажигаем только тот диод, к которому привязан потенциометр
    if (current_mode == 2){  digitalWrite(12, 1);}
    if (current_mode == 3){ digitalWrite(13, 1);}
    }
  y_last_time = millis();
  }

                                                          //Далее идут три блока моргания для каждого диода, они идентичны
                                                          
 if (!change && (millis()-led_red_last_time)>led_freq){   //Если не находимся в режиме смены привязки и время моргнуть наступило    
    led_red_flag = 1-led_red_flag;                        //Инвертируем флаг текущего состояния диода, если было 0, стало 1, было 1, стало 0
    digitalWrite(11, led_red_flag);                       //Включаем или выключаем диод в зависимости в текущего состояния флага
    led_red_last_time = millis();
    led_red_current++;                                    //инкрементируем текущий порядковый номер "мига"
    if (led_red_current > (led_red*2-1)){                 //если текущий порядковый номер "мига" превысил главную переменную, здесь идет умножение на 2, т.к. текущих мигов у нас будет в 2 раза больше (1для включения, 1 для выключения).
      led_red_current = 0;                                //обнуляем его
      led_red_last_time = millis() + (led_pause-led_freq);//делаем засчеку для следующего мига, но уже добавляем паузу
      led_red_flag = 0;                                   //ставим флаг в 0, т.к. в начале следующего цикла он инвертируется и станет 1
      }
    }

  if (!change && (millis()-led_green_last_time)>led_freq){
    led_green_flag = 1-led_green_flag;
    digitalWrite(12, led_green_flag);
    led_green_last_time = millis();
    led_green_current++;
    if (led_green_current > (led_green*2-1)){
      led_green_current = 0;
      led_green_last_time = millis() + (led_pause-led_freq);
      led_green_flag = 0;
      }
    }

  if (!change && (millis()-led_blue_last_time)>led_freq){
    led_blue_flag = 1-led_blue_flag;
    digitalWrite(13, led_blue_flag);
    led_blue_last_time = millis();
    led_blue_current++;
    if (led_blue_current > (led_blue*2-1)){
      led_blue_current = 0;
      led_blue_last_time = millis() + (led_pause-led_freq);
      led_blue_flag = 0;      }
    }
}[\code]
Название: Создание периодики на Arduino
Отправлено: kido от 24 Июль 2016, 00:25:14
а компилятор понимает такую конструкцию?
led_red_flag = !led_red_flag;

если да, то эту строчку можно убрать
led_red_flag = 0;
Название: Создание периодики на Arduino
Отправлено: Ann от 24 Июль 2016, 00:58:02
Да, правильно, эта строчка не нужна. Видимо осталась с того момента, как я боролся с питанием. Как видите на эмулируемой Ардуине отсутствуют разъемы питания, и я не сразу разобрался как правильно подключить. Пытался делать искусственный +5V на цифровом пине, через программу делая на нем HIGH, вроде работало, но давало наводки, сигналы уже не были прямоугольными и работало не стабильно. Видимо тогда и включил эту строчку, пытаясь решить проблему, а затем забыл убрать.
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 24 Июль 2016, 13:04:38
Для контроля параметров раствора приобретены все необходимые приблуды. Так что думаю повторяемости я достигну....
Не в повторяемости дело. Испарилось у вас, предположим, 100мл воды, для объема в 1л - это 10%, а для 10л - 1%. Концентрации поменяются соответственно. Но это я так, к слову :)

Помпа чутка гудит, так что чем меньше тем лучше, да и залить за минимальное время тоже полезно.

Пускай пока 160 побудет. Запас не помешает, а вот если не хватит, будет обидно....
"Вас, Ивановых, не поймешь!..."(с)  :D



Если  все правильно посчитал, объем рабочего раствора у меня выйдет 15л.

Ивановых никогда не понять, нам всем свойственно пытаться совмещать не совместимое, или вообще выдвигать взаимоисключающие параграфы :)

Название: Создание периодики на Arduino
Отправлено: kido от 24 Июль 2016, 13:42:09
Если  все правильно посчитал, объем рабочего раствора у меня выйдет 15л.
Что-то маловато... Рассказывайте как считали.
Название: Создание периодики на Arduino
Отправлено: alexis69 от 24 Июль 2016, 15:53:20
Вы тут вопрос клапанами решили?
Люди рекомендуют клапана от стеклоомывателя ВАЗ 2108 - 2199
Там так же есть обратные клапана.

p.s. а тот кто подходит к контролеру серьезно - интегрируют в систему ph и tds датчики для контроля и корректировки раствора.
Название: Создание периодики на Arduino
Отправлено: kido от 24 Июль 2016, 16:18:36
p.s. а тот кто подходит к контролеру серьезно - интегрируют в систему ph и tds датчики для контроля и корректировки раствора.
ага, и стоимость системы растет по экспоненте
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 24 Июль 2016, 16:51:02
Если  все правильно посчитал, объем рабочего раствора у меня выйдет 15л.
Что-то маловато... Рассказывайте как считали.

через площадь основания и длину цилиндра :

площадь основания 7,5x7,5 = 56,25х3.14 = 176,6см2 х 80 = 14.130 литра. Вроде так меня в школе учили, хотя могу и ошибаться, объемы мне редко считать приходится, тем более цилиндров.  Учитывая что емкость скорее всего будет заполнена не полностью, и объем трубок, думаю как раз и выйдет около15л...

Название: Создание периодики на Arduino
Отправлено: AlexYalta от 24 Июль 2016, 16:53:12
Вы тут вопрос клапанами решили?
Люди рекомендуют клапана от стеклоомывателя ВАЗ 2108 - 2199
Там так же есть обратные клапана.

p.s. а тот кто подходит к контролеру серьезно - интегрируют в систему ph и tds датчики для контроля и корректировки раствора.

тут бы пока с тем что есть разобраться. А там видно будет :)

зы. Сорри не прочел, с капанами вопрос пока открыт жумаю вот эти заказать http://ru.aliexpress.com/item/New-Top-Quality-1-2-for-DC-12V-Electric-Solenoid-Valve-N-C-Water-Inlet-Flow/32697150722.html?spm=2114.14010208.99999999.261.jGC4hk
и вот такую помпу http://ru.aliexpress.com/store/product/Anself-Ultra-quiet-Mini-Brushless-Oil-Water-Pump-Waterproof-Submersible-Fountain-Aquarium-Circulating-260L-H-Lift/2096012_32668948817.html
моя что то слабовата, была еще одна крутецкая немецкая, но я её подарил :(
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 24 Июль 2016, 16:57:45
Немного прокомментировал, чтоб легче было разобраться, что не понятно, спрашивайте
(красным выделил переменные, которые можете изменять, остальные служебные)



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


выглядит как то так:
(https://img-fotki.yandex.ru/get/42618/340095097.0/0_140ebf_bd3a7c8_XXL.jpg) (https://fotki.yandex.ru/next/users/asdset/album/509626/view/1314495)

По клику крупней.
Глумитесь, не стесняйтесь!  :)
Название: Создание периодики на Arduino
Отправлено: kido от 24 Июль 2016, 17:14:32
через площадь основания и длину цилиндра :

площадь основания 7,5x7,5 = 56,25х3.14 = 176,6см2 х 80 = 14.130 литра. Вроде так меня в школе учили, хотя могу и ошибаться, объемы мне редко считать приходится, тем более цилиндров.  Учитывая что емкость скорее всего будет заполнена не полностью, и объем трубок, думаю как раз и выйдет около15л...
Прекрасно! А "мертвый остаток" в емкости хранения кто будет считать? Помпа ведь погружная, постоянно в жидкости находится?
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 24 Июль 2016, 17:16:44
У мну помпа до дна все высасывает, пара миллиметров остается. Если закажу другую, учту этот момент. Пока расчет по то что есть....
Название: Создание периодики на Arduino
Отправлено: Ann от 24 Июль 2016, 17:30:08
Глумитесь, не стесняйтесь!  :)
Да нормуль  :)
Диоды через резистор вроде подключены ? На моей схеме в эмуляторе я их не ставил, но в реале нужно поставить.
И если проблема с потенциометром, давайте вместо него сделаем кнопку, просто при каждом нажатии на нее будет на 1 увеличиваться значение переменной. Там 5 минут буквально, 2-3 строчки кода изменить.
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 24 Июль 2016, 17:35:12
Да, землю диодов пустил через  резистор. Этот урок я выучил первым, ценою двух сгоревших диодов :)

С потенциометром проблем нет, в гараже целая коробка радиодеталей. Сходить только надо.

Кстат заметил странный глюк, если заливаю скетч для работы часов реального времени. Один из модулей реле, дрыгается в такт секунд..... Хотя нигде о его пине в скетче ни слова...
Название: Создание периодики на Arduino
Отправлено: Ann от 24 Июль 2016, 17:49:12
Да, землю диодов пустил через  резистор. Этот урок я выучил первым, ценою двух сгоревших диодов :)

С потенциометром проблем нет, в гараже целая коробка радиодеталей. Сходить только надо.

Кстат заметил странный глюк, если заливаю скетч для работы часов реального времени. Один из модулей реле, дрыгается в такт секунд..... Хотя нигде о его пине в скетче ни слова...
Значит подтянуть его вход нужно к земле.
На цифровых входах/входах могут гулять наводки и очень чувствительная Ардуина (или в данном случае модуль реле) могут воспринять их за сигнал. Поэтому на входы кидается через резистор большого сопротивления  (100к или больше) земля, в итоге все наводки и статика уберутся и на входе будет по умолчанию 0. А при подаче сигнала станет 1 (наш подтягивающий резистор будет пропускать через себя очень малый ток, поэтому на сигнал не окажет никакого влияния).
Вот точно этот же принцип при подключении кнопки. Ее через резистор большого сопротивления подключили к земле, чтобы по умолчанию на входе был всегда 0.
В принципе в ардуине есть возможность программным путем подтянуть вход к земле или +5, вот так
pinMode(pin, INPUT);           // назначить выводу порт ввода
digitalWrite(pin, LOW);       // включить подтягивающий резистор

Попробуйте тот пин, который идет на непослушное реле сделать так, проблема должна исчезнуть.
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 24 Июль 2016, 18:06:31
именно нужный выход, например 2, я его пихаю на макетную плату к резистору и от (через) него уже в ардуину?  Или просто землю что идет к всему модулю реле через резистор пустить?
Название: Создание периодики на Arduino
Отправлено: Ann от 24 Июль 2016, 18:14:34
Представим, что вверху Ваше реле, тогда вот так.
(http://img10.lostpic.net/2016/07/24/f72e5b44dc494af11f8fefcd5838e2be.png)

Но попробуйте сначала программным путем в скече

Добавьте в метод setup() Вот эти строки
pinMode(2, OUTPUT);  
digitalWrite(2, LOW);
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 24 Июль 2016, 18:44:34
вот так сделал: красное изменения

  
    // библиотека для работы I²C
    #include <Wire.h>
    // библиотека для работы с часами реального времени
    #include "TroykaRTC.h"
    
    // EEPROM — энергонезависимая память
    // библиотека для записи и считывания информации с EEPROM
    #include <EEPROM.h>
    
    // размер массива для времени с учётом завершающего нуля
    #define LEN_TIME 12
    // размер массива для даты с учётом завершающего нуля
    #define LEN_DATE 12
    // размер массива для дня недели с учётом завершающего нуля
    #define LEN_DOW 12
    
    // создаём объект для работы с часами реального времени
    RTC clock;


 int r1 = 1;
 
    void setup()
    {
      // открываем последовательный порт
      Serial.begin(9600);
      // инициализация часов
      clock.begin();
      // метод установки времени и даты в модуль вручную
      // clock.set(10,25,45,27,07,2005,THURSDAY);
      // метод установки времени и даты автоматически при компиляции
      clock.set(__TIMESTAMP__);
      
pinMode(r1, OUTPUT);  
digitalWrite(r1, LOW);

    }
    
    void loop()
    {



на первом пине висит глючный модуль. Не помогло. или я что то натупил и не туда-не так запихал....
Название: Создание периодики на Arduino
Отправлено: Ann от 24 Июль 2016, 18:58:47
Смотрите в UNO первый и второй цифровые пины используются для Serial (на них даже написано Rx и Tx), возможно ваш скетч (библиотека часов) чего-то по ним передает.
Попробуйте
1. Вообще отключить пин от глючного модуля ? Проблема пропала ?
2. Подключить глючный модуль к другому пину. Проблема пропала ?
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 24 Июль 2016, 19:03:19
Ха! Сработало! Спасибо! Перенес с 0,1,2,3 на 8,9,10,11.
Скетч реле работа норм, скетч часов работа норм....

Пойду схожу в гараж за потенциометром, позже продолжу.
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 25 Июль 2016, 00:14:27
Подрубил потенциометр, привязал его и светодиоды под пины у себя на схеме. Все работает!  Правда диоды у меня все в куче, не очень удобно и по началу не понял как оно, но понаблюдав, все стало на места, вполне понятно и работоспособно. Когда буду схемку паять,  диоды разнесу, подпишу, и шкалу для потенциометра нарисую, думаю будет вполне юзабельно.

Теперь осталось дело за малым, продолжить изучать ардуину и понять как привязать все это к таймеру и реле :)  пока моих знаний хватает разве что на пины присвоить...
Название: Создание периодики на Arduino
Отправлено: Ann от 25 Июль 2016, 00:22:01
Подрубил потенциометр, привязал его и светодиоды под пины у себя на схеме. Все работает!  Правда диоды у меня все в куче, не очень удобно и по началу не понял как оно, но понаблюдав, все стало на места, вполне понятно и работоспособно. Когда буду схемку паять,  диоды разнесу, подпишу, и шкалу для потенциометра нарисую, думаю будет вполне юзабельно.

Теперь осталось дело за малым, продолжить изучать ардуину и понять как привязать все это к таймеру и реле :)  пока моих знаний хватает разве что на пины присвоить...
А запишите видео работы, интересно глянуть как оно в реале выглядит, а не в эмуляторе.
По реле это просто, там буквально несколько строчек кода получится, сейчас набросаю.
А по часам - расскажите, какая модель, в каком виде они информацию выдают ? Я думаю нам от них требуется только одно число - текущий час. И если он к примеру в диапазоне 8-20, значит переводим нашу систему в дневной режим, иначе - в ночной.
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 25 Июль 2016, 00:38:32
Ок, только завтра, сейчас единственный в доме девайс что умеет снимать видео, занят турниром по шахматам, трогать его низя :(

Часы DS1307  инфу выдают в любом формате 12 или 24 часа, который задается пользователем, думаю минут-часов будет достаточно. Нужно еще  разработать "шкалу" например при значении 1 с потенциометра, мы имеет интервал в 1ч, и далее например + 10 мин, 2 = 1.10, 3 = 1.20....

Я там скетч будильника кокой то видел, завтра отыщу и скину, может поможет разобраться, а то с меня толку мало.
Название: Создание периодики на Arduino
Отправлено: Ann от 25 Июль 2016, 01:14:53
Так, набросал, но когда начал писать ответ, вспомнил, что у Вас же еще клапаны, а почему-то делал по упрощенной системе, которую предлагал kido (видимо на подсознательном уровне убедил меня :) ).
В общем давайте пока попробуем так, затем добавим клапан.

Это вставляем в начале


float base_dive_freq = 10000;              //Базовый интервал между затоплениями, он затем будет умножаться на "зеленую" переменную, таким образом может быть от 10с до 110с
float dive_freq = 0;                       //Вычисленное реальное время между затоплениями. Служебная.
float dive_freq_last_time = 0;             //Засечка. Служебная

float dive_const = 1000;                   //Константа. Нужно будет замерять и занести сюда время, за которое физически наполняется труба до верха

float base_dive_time = 100;                //Базовый интервал для времени затопления. Мы его будем затем умножать на "желтую" переменную (led_blue)
float dive_time = 0;                      // Здесь будет уже вычисленное время продолжительности затопления. Служебная
float dive_time_last_time = 0;            //Засечка. Служебная

boolean dive_flag = 0;                      //Флаг, который говорит включена помпа или нет. 1 - включена, 0 - нет.


Это в метод setup()


 pinMode(9, OUTPUT); //пин для помпы

Это куда-нибудь в метод loop(), в начало можно для удобства.

 dive_freq = base_dive_freq * led_green;                 //вычисляем периоды между затоплениями. Наш базовый период умножаем на "зеленую" переменную
  dive_time = dive_const + base_dive_time * led_blue;     //Вычисляем продолжительность затопления. Берем нашу константу (время, за которое помпа наполняет трубу, и увеличиваем на базовый период, умноженный на нашу "желтую" переменную
  if((millis()-dive_freq_last_time) > dive_freq) {        //если время затопления наступило
    digitalWrite(9, 1);                                   //включаем помпу
    dive_flag = 1;                                        //выставляем флаг, что помпа включена
    dive_freq_last_time = millis();                       //засечка для вычисления времени следующего включения помпы
    dive_time_last_time = millis();                       //засечка для вычисления премени выключения помпы
    }

  if(dive_flag && (millis()-dive_time_last_time) > dive_time){   //если помпа включена и время выключения наступило
    digitalWrite(9, 0);                                                 //выключаем помпу
    dive_flag = 0;                                                      //выставляем флаг, что помпа выключена
    }
Название: Создание периодики на Arduino
Отправлено: Ann от 25 Июль 2016, 02:25:37
Добавил клапан и проверил. Вот итоговое:
[color=red]float base_dive_freq = 2000;[/color]              //Базовый интервал между затоплениями, он затем будет умножаться на "зеленую" переменную, таким образом может быть от 2с до 22с
float dive_freq = 0;                       //Вычисленное реальное время между затоплениями. Служебная.
float dive_freq_last_time = 0;             //Засечка. Служебная

[color=red]float dive_const = 1000;   [/color]                //Константа. Нужно будет замерять и занести сюда время, за которое физически наполняется труба до верха

[color=red]float base_dive_time = 200;[/color]                //Базовый интервал для времени затопления. Мы его будем затем умножать на "желтую" переменную (led_blue)
float dive_time = 0;                      // Здесь будет уже вычисленное время продолжительности затопления. Служебная
float dive_time_last_time = 0;            //Засечка. Служебная

boolean dive_flag = 0;                      //Флаг, который говорит включена помпа или нет. 1 - включена, 0 - нет.
boolean clapan_flag = 0;                      //Флаг, который говорит закрыт клапан или нет. 1 - закрыт, 0 - нет.


Это в метод setup()
pinMode(9, OUTPUT);                       //пин для реле, на которой будет помпа
pinMode(10, OUTPUT);                      // пин для клапана


Это куда-нибудь в метод loop(), в начало можно для удобства.

 dive_freq = base_dive_freq * led_green;                 //вычисляем периоды между затоплениями. Наш базовый период умножаем на "зеленую" переменную
  dive_time = dive_const + base_dive_time * led_blue;     //Вычисляем продолжительность затопления. Берем нашу константу (время, за которое помпа наполняет трубу, и увеличиваем на базовый период, умноженный на нашу "желтую" переменную
  if((millis()-dive_freq_last_time) > dive_freq) {        //если время затопления наступило
    digitalWrite(9, 1);                                   //включаем помпу
    digitalWrite(10, 1);                                  //закрываем клапан
    dive_flag = 1;                                        //выставляем флаг, что помпа включена
    clapan_flag = 1;                                      //выставляем флаг, что клапан закрыт
    dive_freq_last_time = millis();                       //засечка для вычисления времени следующего включения помпы
    dive_time_last_time = millis();                       //засечка для вычисления премени выключения помпы
    }

  if(dive_flag && (millis()-dive_time_last_time) > dive_const){   //если помпа включена и время выключения наступило
    digitalWrite(9, 0);                                                 //выключаем помпу
    dive_flag = 0;                                                      //выставляем флаг, что помпа выключена
    }

  if(clapan_flag && (millis()-dive_time_last_time) > dive_time){
    digitalWrite(10, 0);                                                 //открываем клапан
    clapan_flag = 0;                                                      //выставляем флаг, что клапан открыт
    }
[\code]
И вот видео, вроде бы все работает четко:
[url=https://youtu.be/LF7cjIbySVU][img height=400]http://img10.lostpic.net/2016/07/25/f5d6a88fbbe3ece76f256adbf1cc01a1.png[/img][/url]

На видео крайний слева зеленый диод - это помпа, рядом с ним желтый - клапан.
В начале у нас базовый период между включениями помпы равен 2 секундам. Время заполнения трубы - 1 сек, и базовый период для увеличения периода затопления 200мс.
Итого, каждый две секунды у нас включается помпа на 1 секунду, заполняя трубу. Одновременно с ней закрывается клапан и открывается через 1.2 сек (1 сек + 200мс).
Далее на видео я меняю зеленую переменную на 2 (до этого было 1). Следовательно базовый период умножается на зеленую переменную и период между включениями становится 4 сек.
Далее я меняю желтую переменную на 11. Следовательно клапан закрывается на 3.2 секунды (1 сек + 200мс*11).


Название: Создание периодики на Arduino
Отправлено: AlexYalta от 25 Июль 2016, 10:34:00
Добавил клапан и проверил. Вот итоговое:


На видео крайний слева зеленый диод - это помпа, рядом с ним желтый - клапан.
В начале у нас базовый период между включениями помпы равен 2 секундам. Время заполнения трубы - 1 сек, и базовый период для увеличения периода затопления 200мс.
Итого, каждый две секунды у нас включается помпа на 1 секунду, заполняя трубу. Одновременно с ней закрывается клапан и открывается через 1.2 сек (1 сек + 200мс).
Далее на видео я меняю зеленую переменную на 2 (до этого было 1). Следовательно базовый период умножается на зеленую переменную и период между включениями становится 4 сек.
Далее я меняю желтую переменную на 11. Следовательно клапан закрывается на 3.2 секунды (1 сек + 200мс*11).




Спасибо! Вроде работает. Вечерком поковыряю более пристально. Пока только заметил:


 dive_freq = base_dive_freq * led_green;                 //вычисляем периоды между затоплениями. Наш базовый период умножаем на "зеленую" переменную
  dive_time = dive_const + base_dive_time * led_blue;     //Вычисляем продолжительность затопления. Берем нашу константу (время, за которое помпа наполняет трубу, и увеличиваем на базовый период, умноженный на нашу "желтую" переменную
  if((millis()-dive_freq_last_time) > dive_freq) {        //если время затопления наступило
    digitalWrite(9, 1);                                   //включаем помпу
    digitalWrite(10, 1);                                  //закрываем клапан
    dive_flag = 1;                                        //выставляем флаг, что помпа включена
    clapan_flag = 1;                                      //выставляем флаг, что клапан закрыт
    dive_freq_last_time = millis();                       //засечка для вычисления времени следующего включения помпы
    dive_time_last_time = millis();                       //засечка для вычисления премени выключения помпы


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

Логически, в аппаратном виде, это выглядит так:

1 По умолчанию, с выключенными реле, клапана закрыты, помпа выключена. Это состояние между рабочими циклами. Его можно регулировать по первому каналу тот что "лед грин".
2 включается помпа, клапана по прежнему закрыты. Эмпирически определяется время необходимое для заполнение и забивается в прогу раз и на всегда.
3 Первая рабочая емкость наполнилась, помпа выключается.
4 Делаем паузу, на протяжении которой корневая в первой рабочей емкости находится в затопленном состоянии. например 1мин. Этот параметр регулируется по второму каналу "лед ред"  
5 Первый клапан открывается и раствор перетекает самотеком из первой в вторую рабочую емкость. Время открытия должно быть достаточным для перетекания жидкости, тоже эмпирически определяем его, + скажем 2мин запаса и тоже забивается в прогу раз и на всегда
6  Делаем паузу, на протяжении которой корневая второй рабочей емкости находится в затопленном состоянии. например 1мин. Этот параметр регулируется по второму каналу "лед ред"  
7 Второй  клапан открывается и раствор перетекает самотеком из второй рабочей емкости, в емкость хранения раствора.  Время открытия должно быть достаточным для перетекания жидкости, тоже эмпирически определяем его,  + скажем 2мин запаса и тоже забивается в прогу раз и на всегда

По итогу мы имеем полностью завершенный "автоматический" цикл с управляемыми, по каналам 1"лед грин" и 2"лед ред" параметрами


Отдельно было бы круто прописать третий канал "лед блю" Просто как принудительный цикл промывки корневой, никак не связанный с "автоматическим" циклом. Например:

мы выбрали кнопкой канал "лед блю"
в положении потенциометра 1-4 мы включается помпа, визуально наблюдаем за наполнением робочей емкости, по наполнению крутим потенциометр дальше до положения 5
в положении 5-8 помпа выключается и открывается первый клапан, как раствор перетек из первой емкости в вторую, крутим дальше потенциометр до положения 9
в положении 9-11  второй клапан открывается, и раствор стекает в емкость хранения.

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

 

Название: Создание периодики на Arduino
Отправлено: Ann от 25 Июль 2016, 12:16:09
Красным строка закрытия клапана, если я все правильно понимаю, она не нужна, так как клапан нормально закрытый(без питания закрыт) .

Смотрите, ранее Вы писали:
Управлять всем эти думаю посредством одноканального таймера, к которому будут подключены помпа и электромагнитный клапан для слива типа «нормально открыт» 

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

4 Делаем паузу, на протяжении которой корневая в первой рабочей емкости находится в затопленном состоянии. например 1мин. Этот параметр регулируется по второму каналу "лед ред" 
Смотрите из этой строчки видно, что время затопления привязано к led_blue.
dive_time = dive_const + base_dive_time * led_blue; 
Это не принципально, конечно, можно назвать как угодно, просто для понимания.


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

По спец. режимам на третьем канале.
Давайте четко определимся, какие нам нужны.
1. Нормальный режим. Идет обычный процесс в соот. с заданным программами (я предлагаю так, удобнее и программировать, и управлять. В предложенном Вами варианте - при перепривязке потенциометра к другому параметру, он сразу же собьется и его придется восстанавливать, т.к. потенциометр мы крутили и его значения изменились, а привязанный параметр автоматически читает его значения).
2. Включаем помпу. Как долго она должна работать ? Только наполнить трубы или пока не выключат ? Может промыть корни захотим? Я предлагаю "пока не выключат", на то они и спец. режимы.
3. Полный слив. Помпа выключена, клапана открыты.
4. Помпа выключена. Открыт только первый клапан. Для чего нужен такой режим ? Нет, я не против, там это не сложно в коде сделать, просто хочу понять логику. Если хотим промыть корни несколько раз, проще запустить нормальный, первый, режим с минимальными параметрами, чтобы после затопления и слива, сразу же начинался следующий цикл.



Название: Создание периодики на Arduino
Отправлено: AlexYalta от 25 Июль 2016, 13:21:26
Красным строка закрытия клапана, если я все правильно понимаю, она не нужна, так как клапан нормально закрытый(без питания закрыт) .

Смотрите, ранее Вы писали:
Управлять всем эти думаю посредством одноканального таймера, к которому будут подключены помпа и электромагнитный клапан для слива типа «нормально открыт»  

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

4 Делаем паузу, на протяжении которой корневая в первой рабочей емкости находится в затопленном состоянии. например 1мин. Этот параметр регулируется по второму каналу "лед ред"  
Смотрите из этой строчки видно, что время затопления привязано к led_blue.
dive_time = dive_const + base_dive_time * led_blue;  
Это не принципально, конечно, можно назвать как угодно, просто для понимания.


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

По спец. режимам на третьем канале.
Давайте четко определимся, какие нам нужны.
1. Нормальный режим. Идет обычный процесс в соот. с заданным программами (я предлагаю так, удобнее и программировать, и управлять. В предложенном Вами варианте - при перепривязке потенциометра к другому параметру, он сразу же собьется и его придется восстанавливать, т.к. потенциометр мы крутили и его значения изменились, а привязанный параметр автоматически читает его значения).
2. Включаем помпу. Как долго она должна работать ? Только наполнить трубы или пока не выключат ? Может промыть корни захотим? Я предлагаю "пока не выключат", на то они и спец. режимы.
3. Полный слив. Помпа выключена, клапана открыты.
4. Помпа выключена. Открыт только первый клапан. Для чего нужен такой режим ? Нет, я не против, там это не сложно в коде сделать, просто хочу понять логику. Если хотим промыть корни несколько раз, проще запустить нормальный, первый, режим с минимальными параметрами, чтобы после затопления и слива, сразу же начинался следующий цикл.





Отказался от идеи Н.О клапана, их гораздо сложней найти, извиняюсь что не отразил это в теме.
Насчет держать открытыми, я с Вами согласен, но к сожалению клапана H.O. беда печаль. Думаю ставить их открытыми минут на 10, этого будет достаточно для того чтоб все хорошо стекло.


По спец режиму:

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

Ща схемку набросаю как оно должно быть....

как-то так:
(https://img-fotki.yandex.ru/get/57422/340095097.0/0_140f39_f63ff71b_XL.jpg) (https://fotki.yandex.ru/next/users/asdset/album/509626/view/1314617)
Название: Создание периодики на Arduino
Отправлено: Ann от 25 Июль 2016, 13:46:48
Отказался от идеи Н.О клапана, их гораздо сложней найти, извиняюсь что не отразил это в теме.
Насчет держать открытыми, я с Вами согласен, но к сожалению клапана H.O. беда печаль. Думаю ставить их открытыми минут на 10, этого будет достаточно для того чтоб все хорошо стекло.
По спец режиму:
1 - Прошу прощения что все так усложнил, я просто еще не  понял логику программирования ардуина, давайте сделаем как удобней-проще.
2 - согласен.
3-4 смысл в том что рабочие модули находятся на разной высоте, помпа закачивает раствор только в первую(верхнею) рабочую емкость и 1 клапан при этом держит раствор в ней. Как только мы его открыли раствор самотеком стекает в вторую(нижнию) емкость, раствор в которой удерживает клапан2...

Ща схемку набросаю как оно должно быть....

А сколько клапан потребляет мощности в открытом положении ? Если мало, можно держать их постоянно открытыми.

По 4-му пункту.
Я понял принцип Вашей схемы. Я просто не понял зачем этот момент выносить отдельным пунктом в спец. режим. Все это будет работать в нормальном режиме.

Спец. режим на третьем канале может принимать 3 значения - 1,2 и 3.
Если 1, то - система работает в обычном режиме.
Если 2, то принудительно затопляется (может понадобиться для экстренной заливки, вдруг листья опустили, или Вы перед этим сливали раствор, а сейчас нужно заполнить)
Если 3, то принудительно сливается (хотите произвести какие-то манипуляции с растениями или системой, для чего нужно слить раствор и чтобы случайно в разгар манипуляций не включилась помпа).

Вот Вы пишете:
в положении 5-8 помпа выключается и открывается первый клапан, как раствор перетек из первой емкости в вторую, крутим дальше потенциометр до положения 9
в положении 9-11  второй клапан открывается, и раствор стекает в емкость хранения.


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

Название: Создание периодики на Arduino
Отправлено: Ann от 25 Июль 2016, 13:50:38
Ну да, так я и представлял.
А переливной шланг верхней трубы идет во вторую трубу или в емкость для раствора ?
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 25 Июль 2016, 14:18:08
Отказался от идеи Н.О клапана, их гораздо сложней найти, извиняюсь что не отразил это в теме.
Насчет держать открытыми, я с Вами согласен, но к сожалению клапана H.O. беда печаль. Думаю ставить их открытыми минут на 10, этого будет достаточно для того чтоб все хорошо стекло.
По спец режиму:
1 - Прошу прощения что все так усложнил, я просто еще не  понял логику программирования ардуина, давайте сделаем как удобней-проще.
2 - согласен.
3-4 смысл в том что рабочие модули находятся на разной высоте, помпа закачивает раствор только в первую(верхнею) рабочую емкость и 1 клапан при этом держит раствор в ней. Как только мы его открыли раствор самотеком стекает в вторую(нижнию) емкость, раствор в которой удерживает клапан2...

Ща схемку набросаю как оно должно быть....

А сколько клапан потребляет мощности в открытом положении ? Если мало, можно держать их постоянно открытыми.

По 4-му пункту.
Я понял принцип Вашей схемы. Я просто не понял зачем этот момент выносить отдельным пунктом в спец. режим. Все это будет работать в нормальном режиме.

Спец. режим на третьем канале может принимать 3 значения - 1,2 и 3.
Если 1, то - система работает в обычном режиме.
Если 2, то принудительно затопляется (может понадобиться для экстренной заливки, вдруг листья опустили, или Вы перед этим сливали раствор, а сейчас нужно заполнить)
Если 3, то принудительно сливается (хотите произвести какие-то манипуляции с растениями или системой, для чего нужно слить раствор и чтобы случайно в разгар манипуляций не включилась помпа).

Вот Вы пишете:
в положении 5-8 помпа выключается и открывается первый клапан, как раствор перетек из первой емкости в вторую, крутим дальше потенциометр до положения 9
в положении 9-11  второй клапан открывается, и раствор стекает в емкость хранения.


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




Согласен, нафик мой мега режим. Ваш явно логичней.

 Клапана потребляют 250мА  при 12v 3 ватт в час выходит.... Думаю если сильно греется не будут,можно будет и по полчаса их держать...


Ну да, так я и представлял.
А переливной шланг верхней трубы идет во вторую трубу или в емкость для раствора ?

Переливные шланги буду в обе емкости ставить, воткну их в крестовину после второго клапана. Чтоб в ведро два шланга шло, забор раствора и слив раствора.  Вечерком нарисую уже нормальную, подробную, схему....
Название: Создание периодики на Arduino
Отправлено: Ann от 25 Июль 2016, 20:43:04
Набросал на два клапана и со спец. режимами:
[color=pink]Это в начало:[/color]

[color=red]float base_dive_freq = 2000;[/color]              //Базовый интервал между затоплениями, он затем будет умножаться на "зеленую" переменную, таким образом может быть от 10с до 110с
float dive_freq = 0;                           //Вычисленное реальное время между затоплениями. Служебная.
float dive_freq_last_time = 0;             //Засечка. Служебная

[color=red]float dive_const = 1000;     [/color]              //Константа. Нужно будет замерять и занести сюда время, за которое физически наполняется труба до верха
[color=red]float pereliv_const = 1000; [/color]               //Константа. Нужно будет замерять и занести сюда время, за которое физически из верхней трубы в нижнюю переливается раствор
                                          
[color=red]float base_dive_time = 200;[/color]                //Базовый интервал для времени затопления. Мы его будем затем умножать на "желтую" переменную (led_blue)
float dive_time = 0;                           // Здесь будет уже вычисленное время продолжительности затопления. Служебная
float dive_time_last_time = 0;             //Засечка. Служебная

float dive_time_down = 0;                 // Здесь будет уже вычисленное время продолжительности затопления для нижней трубы. Служебная
float dive_time_down_last_time = 0;   //Засечка нижней трубы. Служебная

[color=pink]Это в setup()[/color]

  pinMode(8, OUTPUT);                       //пин для нижнего клапана
  pinMode(9, OUTPUT);                       //пин для реле, на которой будет помпа
  pinMode(10, OUTPUT);                      // пин для верхнего клапана

[color=pink]Куда нибудь в loop(), для удобства в начало:[/color]

if (led_red == 1){                                                      // Все это будет выполняться только в первом спец.режиме, т.е. обычный режим
  dive_freq = base_dive_freq * led_green;                      //вычисляем периоды между затоплениями. Наш базовый период умножаем на "зеленую" переменную
  dive_time = dive_const + base_dive_time * led_blue;     //Вычисляем продолжительность затопления. Берем нашу константу (время, за которое помпа наполняет трубу,
                                                                              //  и увеличиваем на базовый период, умноженный на нашу "желтую" переменную
  dive_time_down = pereliv_const + base_dive_time * led_blue;       //Вычисляем продолжительность затопления для нижней трубы.
                                                                                           //Берем нашу константу теперь уже перелива, и увеличиваем на базовый период, умноженный на нашу "желтую" переменную
  
  
  if((millis() - dive_freq_last_time) > dive_freq) {        //если время затопления наступило
    digitalWrite(9, 1);                                             //включаем помпу
    digitalWrite(10, 1);                                           //закрываем клапан
    dive_flag = 1;                                                  //выставляем флаг, что помпа включена
    clapan_up_flag = 1;                                          //выставляем флаг, что клапан закрыт
    dive_freq_last_time = millis();                             //засечка для вычисления времени следующего включения помпы
    dive_time_last_time = millis();                             //засечка для вычисления премени выключения помпы
    }

  if(dive_flag && (millis()-dive_time_last_time) > dive_const){   //если помпа включена и время выключения наступило
    digitalWrite(9, 0);                                                         //выключаем помпу
    dive_flag = 0;                                                              //выставляем флаг, что помпа выключена
    }

  if(clapan_up_flag && (millis()-dive_time_last_time) > dive_time){       //если верхний клапан закрыт и время затопления истекло
    digitalWrite(10, 0);                                                                 //открываем верхний клапан
    clapan_up_flag = 0;                                                                //выставляем флаг, что верхний клапан открыт
    digitalWrite(8, 1);                                                                   //закрываем нижний клапан
    clapan_down_flag = 1;                                                            //выставляем флаг, что нижний клапан закрыт
    dive_time_down_last_time = millis();  
    }

  if(clapan_down_flag && ((millis()-dive_time_down_last_time) > dive_time_down)){              //если нижний клапан закрыт и время нижнего затопления истекло
    digitalWrite(8, 0);                                                                                                  //Открываем нижний клапан
    clapan_down_flag = 0;                                                                                           //выставляем флаг, что нижний клапан открыт
    }
}


if (led_red == 2){                                                                     // все будет выполняться только вo 2 спец. режиме, т.е. принудительный слив
  digitalWrite(8, 0);                                                                   //открываем оба клапана
  digitalWrite(10, 0);
  digitalWrite(9, 0);                                                                   //выключаем помпу
  dive_freq_last_time = millis() - (float)86400000;                           // заставляем базовую программу думать, что последний полив был сутки назад
  }

[\code]
И еще, вместо строчки
 if (current_mode == 1){ led_red = (int)(x/100) + 1;}  

вставляем
if (current_mode == 1){ led_red = (int)(x/100) + 1;      //Меняем переменную, в зависимости от текущей привязки
      if(led_red > 2){led_red = 2;}                       // Если потенциометр накрутил больше 2, то все равно отображать 2
      }


И еще, если удаляли строчку
 led_red_flag = 0;
Верните назад, все-таки она нужно, в некоторых ситуация без нее может на возникнуть инверсия сигнала (на видео в конце это видно).

Поясню по спец. режимам. Я их сделал всего два, но нужные функцию исполняют.
1. Обычный режим.
2. Режим слива.
Нюанс в том, что при заходе в режим слива, мы заставляем программу думать, что последнее затопление было сутки назад. Вследствие чего при возврате в обычный режим она в срочном порядке включает затопление. Т.е. если мы хотим принудительно затопить, то просто на мгновение переходим в режим слива и сразу же возвращаемся в обычный режим, сразу же начнется затопление и далее работа продолжится в обычном порядке.
Если же мы наоборот не хотим сейчас затапливать, т.е. продолжить с паузы между затоплениями. То можно просто выключить и включить Ардуину в сеть - она стартует всегда с паузы.
В общем, надеюсь не слишком все упростил, в принципе все функции (обычный, слив, затопление) в наличии. Потом, если что, чего будет не хватать, допишем.
Ну и видео.
Слева зеленая помпа, рядом желтый - верхний клапан, правее желтый - нижний клапан.
Добавил на них осциллограф, чтоб нагляднее моменты включения можно было увидеть.
При старте, все находится в обычном режиме. Затем перехожу во второй режим, все выключается. Затем возвращаюсь в обычный и вижу, как сразу же начинается затопление.
[url=https://youtu.be/tqFBdtDEKME][img height=400]http://img10.lostpic.net/2016/07/25/b302db75894d4b5e840ec9f9eb0bbc6c.png[/img][/url]
По клапанам, я не стал корректировать программу, просто когда будете подключать их к реле, воткните в инверсный вход (там есть вход, на который без сигнала закорочен, а при сигнале размкнут, а есть наоборот, который нормально закорочен, при сигнале разомкнут).
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 25 Июль 2016, 23:36:27
слепил все в кучу:
int current_mode = 1;                       //Переменная, показывающая к какому параметру привязан потенциометр, может быть 1, 2, 3, которые соотв. "красному", "желтому" и "зеленому"
boolean change = 0;                         // Флаг, показывающий, что мы находимся в режиме изменения привязки потенциометра, 1-в режиме, 0-не в режиме
float change_last_time = 0;                 // для засечки 3 секундного таймера выхода из режима изменения привязки

int x=0;                                    //Переменная, в которой храним считанные показания потенциометра

int y = 0;                                  //Переменная, в которой храним считанные показания цифрового входа кнопки, 0 или 1, нажата или нет
float y_last_time = 0;                      //Для засечки таймера

int led_red = 1;                            //Наша главная "красная" переменная, к которой будем в дальнейшем привязывать исполняющие таймеры
boolean led_red_flag = 0;                   //Флаг для мигания
int led_red_current = 0;                    //Порядковый номер текущего "мига"
float led_red_last_time = 0;                //для засечки таймера

int led_green = 1;                          // Главная "зеленая" переменная
boolean led_green_flag = 0;                  // Далее все аналогично, как и у красной
int led_green_current = 0;
float led_green_last_time = 0;

int led_blue = 1;                           //Главная "желтая" переменная, назвал blue, но не важно
boolean led_blue_flag = 0;
int led_blue_current = 0;
float led_blue_last_time = 0;

int led_freq = 200;                         //Частота мигания, т.е. перерыв между каждым миганием в миллисекундах
int led_pause = 2000;                       //Пауза между сериями миганий в мс

float base_dive_freq = 2000;              //Базовый интервал между затоплениями, он затем будет умножаться на "зеленую" переменную, таким образом может быть от 10с до 110с
float dive_freq = 0;                           //Вычисленное реальное время между затоплениями. Служебная.
float dive_freq_last_time = 0;             //Засечка. Служебная

float dive_const = 1000;                  //Константа. Нужно будет замерять и занести сюда время, за которое физически наполняется труба до верха
float pereliv_const = 1000;               //Константа. Нужно будет замерять и занести сюда время, за которое физически из верхней трубы в нижнюю переливается раствор
                                          
float base_dive_time = 200;                //Базовый интервал для времени затопления. Мы его будем затем умножать на "желтую" переменную (led_blue)
float dive_time = 0;                           // Здесь будет уже вычисленное время продолжительности затопления. Служебная
float dive_time_last_time = 0;             //Засечка. Служебная

float dive_time_down = 0;                 // Здесь будет уже вычисленное время продолжительности затопления для нижней трубы. Служебная
float dive_time_down_last_time = 0;   //Засечка нижней трубы. Служебная


                    

void setup() {
  pinMode(4, INPUT);                        //Пин для кнопки
  pinMode(5, OUTPUT);                      //пины для диодов
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(A3, INPUT);                       //пин для потенциометра

  pinMode(8, OUTPUT);                       //пин для нижнего клапана
  pinMode(9, OUTPUT);                       //пин для реле, на которой будет помпа
  pinMode(10, OUTPUT);                      // пин для верхнего клапана
}

void loop() {


  if (led_red == 1){                                                      // Все это будет выполняться только в первом спец.режиме, т.е. обычный режим
  dive_freq = base_dive_freq * led_green;                      //вычисляем периоды между затоплениями. Наш базовый период умножаем на "зеленую" переменную
  dive_time = dive_const + base_dive_time * led_blue;     //Вычисляем продолжительность затопления. Берем нашу константу (время, за которое помпа наполняет трубу,
                                                                              //  и увеличиваем на базовый период, умноженный на нашу "желтую" переменную
  dive_time_down = pereliv_const + base_dive_time * led_blue;       //Вычисляем продолжительность затопления для нижней трубы.
                                                                                           //Берем нашу константу теперь уже перелива, и увеличиваем на базовый период, умноженный на нашу "желтую" переменную
  
  
  if((millis() - dive_freq_last_time) > dive_freq) {        //если время затопления наступило
    digitalWrite(9, 1);                                             //включаем помпу
    dive_flag = 1;                                                  //выставляем флаг, что помпа включена
    clapan_up_flag = 1;                                          //выставляем флаг, что клапан закрыт
    dive_freq_last_time = millis();                             //засечка для вычисления времени следующего включения помпы
    dive_time_last_time = millis();                             //засечка для вычисления премени выключения помпы
    }

[color=red]  if(dive_flag && (millis()-dive_time_last_time) > dive_const){  [/color] //если помпа включена и время выключения наступило
    digitalWrite(9, 0);                                                         //выключаем помпу
    dive_flag = 0;                                                              //выставляем флаг, что помпа выключена
    }

  if(clapan_up_flag && (millis()-dive_time_last_time) > dive_time){       //если верхний клапан закрыт и время затопления истекло
    digitalWrite(10, 0);                                                                 //открываем верхний клапан
    clapan_up_flag = 0;                                                                //выставляем флаг, что верхний клапан открыт
    digitalWrite(8, 1);                                                                   //закрываем нижний клапан
    clapan_down_flag = 1;                                                            //выставляем флаг, что нижний клапан закрыт
    dive_time_down_last_time = millis();  
    }

  if(clapan_down_flag && ((millis()-dive_time_down_last_time) > dive_time_down)){              //если нижний клапан закрыт и время нижнего затопления истекло
    digitalWrite(8, 0);                                                                                                  //Открываем нижний клапан
    clapan_down_flag = 0;                                                                                           //выставляем флаг, что нижний клапан открыт
    }
}


if (led_red == 2){                                                                     // все будет выполняться только вo 2 спец. режиме, т.е. принудительный слив
  digitalWrite(8, 0);                                                                   //открываем оба клапана
  digitalWrite(10, 0);
  digitalWrite(9, 0);                                                                   //выключаем помпу
  dive_freq_last_time = millis() - (float)86400000;                           // заставляем базовую программу думать, что последний полив был сутки назад
  }
 
if(!change){                                                //если не находимся в режиме смены привязки, значит меняем главные переменные
   x = analogRead(A3);
  if (current_mode == 1){ led_red = (int)(x/100) + 1;      //Меняем переменную, в зависимости от текущей привязки
      if(led_red > 2){led_red = 2;}                       // Если потенциометр накрутил больше 2, то все равно отображать 2
      }                                                       //Меняем переменную, в зависимости от текущей привязки

  
   if (current_mode == 2){ led_green = (int)(x/100) + 1;}   //Вот здесь важная формула, потенциометр на аналоговый вход выдает нам значение от 0 до 1024
   if (current_mode == 3){ led_blue = (int)(x/100) + 1;}    //Делим на 100, округляем и добавляем 1 (чтоб нуля не было), получается переменная может принимать значения
                                                            // от 1 до 11.
}


if(change && (millis()-change_last_time)>3000){             //Это момент выхода из режима привязки, обнуляются служебные переменные диодов, выключаются
  change = 0;                                              
  led_green_current = 0;
  led_red_current = 0;
  led_blue_current = 0;
  led_red_flag = 0;
  digitalWrite(5, 0);
  led_green_flag = 0;
  digitalWrite(6, 0);
  led_blue_flag = 0;
  digitalWrite(7, 0);
  }

if((millis()-y_last_time)>200){                     //Обработка нажатия на кнопку, добавил небольшой таймер 200мс, чтоб убрать "дребезг" - множественное срабатывание, кнопка будет срабатывать только если ее немного подержать (200мс)
  y = digitalRead(2);                               //читаем кнопочный выход
  if (y>0){                                         //если кнопка нажата
    current_mode++;                                 //инкрементируем текущий режим
    if(current_mode > 3) {current_mode = 1;}        //если получилось 4, то возвращаемся на 1
    change = 1;                                     //объявляем режим смены привязки
    change_last_time = millis();                    //засекаем для 3-секундного таймера выхода из режима смены
    digitalWrite(5, 0);                            //выключаем все диоды
    digitalWrite(6, 0);
    digitalWrite(7, 0);
    if (current_mode == 1){  digitalWrite(5, 1);}  //зажигаем только тот диод, к которому привязан потенциометр
    if (current_mode == 2){  digitalWrite(6, 1);}
    if (current_mode == 3){ digitalWrite(7, 1);}
    }
  y_last_time = millis();
  }

                                                          //Далее идут три блока моргания для каждого диода, они идентичны
                                                        
 if (!change && (millis()-led_red_last_time)>led_freq){   //Если не находимся в режиме смены привязки и время моргнуть наступило    
    led_red_flag = 1-led_red_flag;                        //Инвертируем флаг текущего состояния диода, если было 0, стало 1, было 1, стало 0
    digitalWrite(5, led_red_flag);                       //Включаем или выключаем диод в зависимости в текущего состояния флага
    led_red_last_time = millis();
    led_red_current++;                                    //инкрементируем текущий порядковый номер "мига"
    if (led_red_current > (led_red*2-1)){                 //если текущий порядковый номер "мига" превысил главную переменную, здесь идет умножение на 2, т.к. текущих мигов у нас будет в 2 раза больше (1для включения, 1 для выключения).
      led_red_current = 0;                                //обнуляем его
      led_red_last_time = millis() + (led_pause-led_freq);//делаем засчеку для следующего мига, но уже добавляем паузу
      led_red_flag = 0;                                   //ставим флаг в 0, т.к. в начале следующего цикла он инвертируется и станет 1
      }
    }

  if (!change && (millis()-led_green_last_time)>led_freq){
    led_green_flag = 1-led_green_flag;
    digitalWrite(6, led_green_flag);
    led_green_last_time = millis();
    led_green_current++;
    if (led_green_current > (led_green*2-1)){
      led_green_current = 0;
      led_green_last_time = millis() + (led_pause-led_freq);
      led_green_flag = 0;
      }
    }

  if (!change && (millis()-led_blue_last_time)>led_freq){
    led_blue_flag = 1-led_blue_flag;
    digitalWrite(7, led_blue_flag);
    led_blue_last_time = millis();
    led_blue_current++;
    if (led_blue_current > (led_blue*2-1)){
      led_blue_current = 0;
      led_blue_last_time = millis() + (led_pause-led_freq);
      led_blue_flag = 0;      }
    }
[\code]

чето не компилируется, ругается на выделенную красным строку пишет типа "exit status 1
'dive_flag' was not declared in this scope"  наврено я не првльно все это собрал в кучу :(
Название: Создание периодики на Arduino
Отправлено: Ann от 25 Июль 2016, 23:39:06
dive_flag не была объявлена
добавьте в начало
boolean dive_flag = 0;
Название: Создание периодики на Arduino
Отправлено: Ann от 25 Июль 2016, 23:40:23
Пардон, это моя вина забыл Вам 3 строки скопировать.
Их в начало.

boolean dive_flag = 0;                      //Флаг, который говорит включена помпа или нет. 1 - включена, 0 - нет.
boolean clapan_up_flag = 0;                      //Флаг, который говорит верхний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.
boolean clapan_down_flag = 0;                      //Флаг, который говорит нижний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.
Название: Создание периодики на Arduino
Отправлено: AlexYalta от 25 Июль 2016, 23:53:00
вроде скомпилировалась, но работает не корректно. Гляну завтра еще внимательней, не соображаю чтото сегодня совсем :(
Название: Создание периодики на Arduino
Отправлено: kido от 26 Июль 2016, 00:05:20
Цитировать
digitalWrite(10, 0);  //открываем верхний клапан
клапан же вроде НЗ, тогда это "закрыть"
или вы решили обыграть через инверсию?
зря, лучше сделать как надо сразу чем ломать голову потом.
Название: Создание периодики на Arduino
Отправлено: Ann от 26 Июль 2016, 00:09:51
Цитировать
digitalWrite(10, 0);  //открываем верхний клапан
клапан же вроде НЗ, тогда это "закрыть"
или вы решили обыграть через инверсию?
зря, лучше сделать как надо сразу чем ломать голову потом.
AlexYalta в начале говорил, что у него клапан НО, поэтому я и писал под НО.
Затем он сказал, что у него НЗ, я пока ему предложил ему через инверсию. Вообще да, лучше сразу правильно делать, но в принципе это по сути и не ошибка, и не блоха, которую потом трудно найти. В общем, захочет исправит. А не захочет и так сойдет.
Название: Создание периодики на Arduino
Отправлено: kido от 26 Июль 2016, 00:21:24
Ann, у меня вопрос к вам как к ведущему программисту проекта: почему так упорно цепляетесь за один резистор? Ведь есть же еще аналоговые входы, почему не сделать столько сколько нужно задатчиков парараметров? ИМХО, "пляски" с перепривязкой "задатчика" только усложняют и  загромождают проект.
Название: Создание периодики на Arduino
Отправлено: Ann от 26 Июль 2016, 00:40:13
Ann, у меня вопрос к вам как к ведущему программисту проекта: почему так упорно цепляетесь за один резистор? Ведь есть же еще аналоговые входы, почему не сделать столько сколько нужно задатчиков парараметров? ИМХО, "пляски" с перепривязкой "задатчика" только усложняют и  загромождают проект.
:D
Я вот сейчас смотрю на эту программу, чухаю репу, и думаю, почему я AlexYalta не посоветовал в начале взять простенький дисплейчик да жменю кнопок/потенциометров/энкодеров.  :D
А еще лучше инфракрасный приемник и пользоваться пультом от какого-нибудь авто-FM-модулятора, как я себе делал здесь (http://chile-forum.ru/index.php/topic,2318.255.html). Архиудобная штука.
Программа раза в три меньше получилась бы. А теперь приходится через то самое место  :).
Да в общем ладно, уже все написано. Ошибки я у него нашел, сейчас опубликую, исправит и все заработает.
Название: Создание периодики на Arduino
Отправлено: Ann от 26 Июль 2016, 00:43:28
int current_mode = 1;                       //Переменная, показывающая к какому параметру привязан потенциометр, может быть 1, 2, 3, которые соотв. "красному", "желтому" и "зеленому"
boolean change = 0;                         // Флаг, показывающий, что мы находимся в режиме изменения привязки потенциометра, 1-в режиме, 0-не в режиме
float change_last_time = 0;                 // для засечки 3 секундного таймера выхода из режима изменения привязки

int x=0;                                    //Переменная, в которой храним считанные показания потенциометра

int y = 0;                                  //Переменная, в которой храним считанные показания цифрового входа кнопки, 0 или 1, нажата или нет
float y_last_time = 0;                      //Для засечки таймера

int led_red = 1;                            //Наша главная "красная" переменная, к которой будем в дальнейшем привязывать исполняющие таймеры
boolean led_red_flag = 0;                   //Флаг для мигания
int led_red_current = 0;                    //Порядковый номер текущего "мига"
float led_red_last_time = 0;                //для засечки таймера

int led_green = 1;                          // Главная "зеленая" переменная
boolean led_green_flag = 0;                  // Далее все аналогично, как и у красной
int led_green_current = 0;
float led_green_last_time = 0;

int led_blue = 1;                           //Главная "желтая" переменная, назвал blue, но не важно
boolean led_blue_flag = 0;
int led_blue_current = 0;
float led_blue_last_time = 0;

int led_freq = 200;                         //Частота мигания, т.е. перерыв между каждым миганием в миллисекундах
int led_pause = 2000;                       //Пауза между сериями миганий в мс

float base_dive_freq = 2000;              //Базовый интервал между затоплениями, он затем будет умножаться на "зеленую" переменную, таким образом может быть от 10с до 110с
float dive_freq = 0;                           //Вычисленное реальное время между затоплениями. Служебная.
float dive_freq_last_time = 0;             //Засечка. Служебная

float dive_const = 1000;                  //Константа. Нужно будет замерять и занести сюда время, за которое физически наполняется труба до верха
float pereliv_const = 1000;               //Константа. Нужно будет замерять и занести сюда время, за которое физически из верхней трубы в нижнюю переливается раствор
                                        
float base_dive_time = 200;                //Базовый интервал для времени затопления. Мы его будем затем умножать на "желтую" переменную (led_blue)
float dive_time = 0;                           // Здесь будет уже вычисленное время продолжительности затопления. Служебная
float dive_time_last_time = 0;             //Засечка. Служебная

float dive_time_down = 0;                 // Здесь будет уже вычисленное время продолжительности затопления для нижней трубы. Служебная
float dive_time_down_last_time = 0;   //Засечка нижней трубы. Служебная

boolean dive_flag = 0;                      //Флаг, который говорит включена помпа или нет. 1 - включена, 0 - нет.
boolean clapan_up_flag = 0;                      //Флаг, который говорит верхний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.
boolean clapan_down_flag = 0;                      //Флаг, который говорит нижний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.

                    

void setup() {
  pinMode(4, INPUT);                        //Пин для кнопки
  pinMode(5, OUTPUT);                      //пины для диодов
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(A3, INPUT);                       //пин для потенциометра

  pinMode(8, OUTPUT);                       //пин для нижнего клапана
  pinMode(9, OUTPUT);                       //пин для реле, на которой будет помпа
  pinMode(10, OUTPUT);                      // пин для верхнего клапана
}

void loop() {


  if (led_red == 1){                                                      // Все это будет выполняться только в первом спец.режиме, т.е. обычный режим
  dive_freq = base_dive_freq * led_green;                      //вычисляем периоды между затоплениями. Наш базовый период умножаем на "зеленую" переменную
  dive_time = dive_const + base_dive_time * led_blue;     //Вычисляем продолжительность затопления. Берем нашу константу (время, за которое помпа наполняет трубу,
                                                                              //  и увеличиваем на базовый период, умноженный на нашу "желтую" переменную
  dive_time_down = pereliv_const + base_dive_time * led_blue;       //Вычисляем продолжительность затопления для нижней трубы.
                                                                                           //Берем нашу константу теперь уже перелива, и увеличиваем на базовый период, умноженный на нашу "желтую" переменную
 
 
  if((millis() - dive_freq_last_time) > dive_freq) {        //если время затопления наступило
    digitalWrite(9, 1);                                             //включаем помпу
  [b] [size=20pt] [color=red]digitalWrite(10, 1);[/color][/size][/b]                               //закрываем клапан
    dive_flag = 1;                                                  //выставляем флаг, что помпа включена
    clapan_up_flag = 1;                                          //выставляем флаг, что клапан закрыт
    dive_freq_last_time = millis();                             //засечка для вычисления времени следующего включения помпы
    dive_time_last_time = millis();                             //засечка для вычисления премени выключения помпы
    }

  if(dive_flag && (millis()-dive_time_last_time) > dive_const){  //если помпа включена и время выключения наступило
    digitalWrite(9, 0);                                                         //выключаем помпу
    dive_flag = 0;                                                              //выставляем флаг, что помпа выключена
    }

  if(clapan_up_flag && (millis()-dive_time_last_time) > dive_time){       //если верхний клапан закрыт и время затопления истекло
    digitalWrite(10, 0);                                                                 //открываем верхний клапан
    clapan_up_flag = 0;                                                                //выставляем флаг, что верхний клапан открыт
    digitalWrite(8, 1);                                                                   //закрываем нижний клапан
    clapan_down_flag = 1;                                                            //выставляем флаг, что нижний клапан закрыт
    dive_time_down_last_time = millis();
    }

  if(clapan_down_flag && ((millis()-dive_time_down_last_time) > dive_time_down)){              //если нижний клапан закрыт и время нижнего затопления истекло
    digitalWrite(8, 0);                                                                                                  //Открываем нижний клапан
    clapan_down_flag = 0;                                                                                           //выставляем флаг, что нижний клапан открыт
    }
}


if (led_red == 2){                                                                     // все будет выполняться только вo 2 спец. режиме, т.е. принудительный слив
  digitalWrite(8, 0);                                                                   //открываем оба клапана
  digitalWrite(10, 0);
  digitalWrite(9, 0);                                                                   //выключаем помпу
  dive_freq_last_time = millis() - (float)86400000;                           // заставляем базовую программу думать, что последний полив был сутки назад
  }
 
if(!change){                                                //если не находимся в режиме смены привязки, значит меняем главные переменные
   x = analogRead(A3);
  if (current_mode == 1){ led_red = (int)(x/100) + 1;      //Меняем переменную, в зависимости от текущей привязки
      if(led_red > 2){led_red = 2;}                       // Если потенциометр накрутил больше 2, то все равно отображать 2
      }                                                       //Меняем переменную, в зависимости от текущей привязки

  
   if (current_mode == 2){ led_green = (int)(x/100) + 1;}   //Вот здесь важная формула, потенциометр на аналоговый вход выдает нам значение от 0 до 1024
   if (current_mode == 3){ led_blue = (int)(x/100) + 1;}    //Делим на 100, округляем и добавляем 1 (чтоб нуля не было), получается переменная может принимать значения
                                                            // от 1 до 11.
}


if(change && (millis()-change_last_time)>3000){             //Это момент выхода из режима привязки, обнуляются служебные переменные диодов, выключаются
  change = 0;                                              
  led_green_current = 0;
  led_red_current = 0;
  led_blue_current = 0;
  led_red_flag = 0;
  digitalWrite(5, 0);
  led_green_flag = 0;
  digitalWrite(6, 0);
  led_blue_flag = 0;
  digitalWrite(7, 0);
  }

if((millis()-y_last_time)>200){                     //Обработка нажатия на кнопку, добавил небольшой таймер 200мс, чтоб убрать "дребезг" - множественное срабатывание, кнопка будет срабатывать только если ее немного подержать (200мс)
  y = digitalRead([size=28pt][b][color=red]4[/color][/b][/size]);                               //читаем кнопочный выход
  if (y>0){                                         //если кнопка нажата
    current_mode++;                                 //инкрементируем текущий режим
    if(current_mode > 3) {current_mode = 1;}        //если получилось 4, то возвращаемся на 1
    change = 1;                                     //объявляем режим смены привязки
    change_last_time = millis();                    //засекаем для 3-секундного таймера выхода из режима смены
    digitalWrite(5, 0);                            //выключаем все диоды
    digitalWrite(6, 0);
    digitalWrite(7, 0);
    if (current_mode == 1){  digitalWrite(5, 1);}  //зажигаем только тот диод, к которому привязан потенциометр
    if (current_mode == 2){  digitalWrite(6, 1);}
    if (current_mode == 3){ digitalWrite(7, 1);}
    }
  y_last_time = millis();
  }

                                                          //Далее идут три блока моргания для каждого диода, они идентичны
                                                        
 if (!change && (millis()-led_red_last_time)>led_freq){   //Если не находимся в режиме смены привязки и время моргнуть наступило    
    led_red_flag = 1-led_red_flag;                        //Инвертируем флаг текущего состояния диода, если было 0, стало 1, было 1, стало 0
    digitalWrite(5, led_red_flag);                       //Включаем или выключаем диод в зависимости в текущего состояния флага
    led_red_last_time = millis();
    led_red_current++;                                    //инкрементируем текущий порядковый номер "мига"
    if (led_red_current > (led_red*2-1)){                 //если текущий порядковый номер "мига" превысил главную переменную, здесь идет умножение на 2, т.к. текущих мигов у нас будет в 2 раза больше (1для включения, 1 для выключения).
      led_red_current = 0;                                //обнуляем его
      led_red_last_time = millis() + (led_pause-led_freq);//делаем засчеку для следующего мига, но уже добавляем паузу
      led_red_flag = 0;                                   //ставим флаг в 0, т.к. в начале следующего цикла он инвертируется и станет 1
      }
    }

  if (!change && (millis()-led_green_last_time)>led_freq){
    led_green_flag = 1-led_green_flag;
    digitalWrite(6, led_green_flag);
    led_green_last_time = millis();
    led_green_current++;
    if (led_green_current > (led_green*2-1)){
      led_green_current = 0;
      led_green_last_time = millis() + (led_pause-led_freq);
      led_green_flag = 0;
      }
    }

  if (!change && (millis()-led_blue_last_time)>led_freq){
    led_blue_flag = 1-led_blue_flag;
    digitalWrite(7, led_blue_flag);
    led_blue_last_time = millis();
    led_blue_current++;
    if (led_blue_current > (led_blue*2-1)){
      led_blue_current = 0;
      led_blue_last_time = millis() + (led_pause-led_freq);
      led_blue_flag = 0;      }
    }
}
[\code]




Вообще, тут я конечно сам протупил - показал как не надо делать.
Пины обычно в начале присваиваются константам/переменным, и в самой программе уже используются они. В случае чего просто меняешь их в объявлении в начале, а не лазишь по всей программе. Вот из-за этого и получилась вторая ошибка с пином.
Название: Создание периодики на Arduino
Отправлено: Ann от 26 Июль 2016, 00:59:46
Ann, у меня вопрос к вам как к ведущему программисту проекта: почему так упорно цепляетесь за один резистор? Ведь есть же еще аналоговые входы, почему не сделать столько сколько нужно задатчиков парараметров? ИМХО, "пляски" с перепривязкой "задатчика" только усложняют и  загромождают проект.
Кстати, очень юзабельно получилось. Это со стороны кажется, что там черт ногу сломит, но в реале уже через пару минут меняешь все эти параметры практически на автомате. AlexYalta это тоже подтверждает.
Название: Создание периодики на Arduino
Отправлено: vadkoff от 26 Июль 2016, 11:55:57
Отэта у вас тут писанина недоступная для среднестатистического любителя хапнуть на обед острого :D Скоро нужно уже будет отдельную тему создавать по Ардуино "Боремся с китайской микросхемой"
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 26 Июль 2016, 13:13:11
Вообще kido конечно прав, чем меньше управляющих элементов, тем сложнее и управление и более громоздкая программа.
В данный момент можно значительно улучшить управляемость добавив еще один потенциометр.
Будет один для периодов между затоплениями, один для продолжительности затопления, кнопка для слива.
Во-первых, и управлять будет удобнее, не нужно будет менять привязку, а во-вторых, глянув на положения потенциометров Вы сразу определите в каком режиме система находится, а диоды будут так, для контроля.
Гораздо лучше получится. Я чего-то подумал, что у Вас один потенциометр, когда писал программу, но, блин, это же не проблема, и купить можно и выдрать из какой-нибудь старой техники.
А на будущее, если не планируете "оставаться на достигнутом", обязательно прикупите какой-нибудь простенький дисплейчик, например такой:
(http://ledmaster.com.ua/image/cache/catalog/ARDUINO/LCD-1602-2-500x500.jpg)
И датчик температуры/влажности. Самый простой, типа DHT11. И инфракрасный датчик, чтобы сигналы с пульта принимал. Не для форсу, удобства ради, на пульте много кнопок, очень удобно им управлять, не нужно подпаивать кучу кнопок/потенциометров.
Название: Re: Создание периодики на Arduino
Отправлено: kido от 26 Июль 2016, 13:41:22
Ann, а такой не лучше будет?
(http://arduino-ua.com/products_pictures/large_LCDKeypadShield.jpg)
(я не сильно разбираюсь в этих конструкорах, мне ближе промышленная электроника :) )
Название: Re: Создание периодики на Arduino
Отправлено: Eschaton от 26 Июль 2016, 13:45:07
Отэта у вас тут писанина недоступная для среднестатистического любителя хапнуть на обед острого :D Скоро нужно уже будет отдельную тему создавать по Ардуино "Боремся с китайской микросхемой"

Я половину жизни в IT работаю, тоже ничего не понимаю :)
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 26 Июль 2016, 13:54:12
Ann, а такой не лучше будет?
(http://arduino-ua.com/products_pictures/large_LCDKeypadShield.jpg)
(я не сильно разбираюсь в этих конструкорах, мне ближе промышленная электроника :) )
Дык это такой самый, только обвязка в виде кнопок добавлена. Если кнопки не нужны (например, пульт есть), то и простой подойдет. Их куча видов, я предложил самый простой.
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 26 Июль 2016, 19:15:56
Отэта у вас тут писанина недоступная для среднестатистического любителя хапнуть на обед острого :D Скоро нужно уже будет отдельную тему создавать по Ардуино "Боремся с китайской микросхемой"


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

Насчет борьбы с микросхемой, на данном этапе все вполне логично и предсказуемо, а в случае дефектов, можно просто купить новую. Но если развить эту мысль по логике Остапа Бендера,то скоро нас ждут "Нью Перцы" с нанороботами что следят и ухаживают за перцими и по желанию регулируют характеристики сорта посредством нейтронно-цифрового интерфейса :)
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 26 Июль 2016, 19:31:03
Вообще kido конечно прав, чем меньше управляющих элементов, тем сложнее и управление и более громоздкая программа.
В данный момент можно значительно улучшить управляемость добавив еще один потенциометр.
Будет один для периодов между затоплениями, один для продолжительности затопления, кнопка для слива.
Во-первых, и управлять будет удобнее, не нужно будет менять привязку, а во-вторых, глянув на положения потенциометров Вы сразу определите в каком режиме система находится, а диоды будут так, для контроля.
Гораздо лучше получится. Я чего-то подумал, что у Вас один потенциометр, когда писал программу, но, блин, это же не проблема, и купить можно и выдрать из какой-нибудь старой техники.
А на будущее, если не планируете "оставаться на достигнутом", обязательно прикупите какой-нибудь простенький дисплейчик, например такой:
(http://ledmaster.com.ua/image/cache/catalog/ARDUINO/LCD-1602-2-500x500.jpg)
И датчик температуры/влажности. Самый простой, типа DHT11. И инфракрасный датчик, чтобы сигналы с пульта принимал. Не для форсу, удобства ради, на пульте много кнопок, очень удобно им управлять, не нужно подпаивать кучу кнопок/потенциометров.

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

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

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

Думаю пора заказывать клапана и помпу с али, думаю сразу под силовую часть закупиться, с расчетом на будущее. Типа взять под все это 12v блок питания ватт на 100, 10 уйдет на помпы клапаны, остальное можно будет на подсветку пустить. Типа такого http://led-portal.ru/drivers/U-100W-12V_8_3A
или маловато?

Название: Re: Создание периодики на Arduino
Отправлено: kido от 26 Июль 2016, 19:52:01
AlexYalta, зачем тратить деньги? Возьмите обычный БП от компа, по 12В он выдает 15А! (БП на 300Вт)
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 26 Июль 2016, 20:25:10
эти как правило компактней и имеют пассивное охлаждение, еще и какую никакакую гидроизоляцию...  тем боле что в чайне такие изделия в 2-3 раза дешевле.
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 26 Июль 2016, 20:56:45
... кроме жк экранов ...  Главное все это закодить :)
Так это вещи очень даже взаимосвязанные.  :) Будь у Вас ЖК-экран, вместо полсотни строк в программе, которые мало кто здесь разберет, потраченных всего лишь на мигание диодов, была бы пара очень простых строчек, понятных и новичку.


Если будет время и желание, запилите прогу под два потенциометра.
Это не сложно. Там скорее удалять код придется, нежели писать его  :)

закупиться, с расчетом на будущее...   ....остальное можно будет на подсветку пустить.
На подсветку, а это с большой долей вероятности будут диоды 445nm и 660nm, лучше будет уже специализированный драйвер купить. Поэтому берите любой БП на 12V от любой старой техники (как правило они меньше 1A не бывают), для Ардуины и клапанов хватит с головой. А сэкономленные деньги уже лучше на мощный драйвер для диодов потратите.

Для начала, проверьте работает ли код с исправленными ошибками (ошибки я выше выделил красным).
И вопрос: Вы уже умеете в той программе, в которой код на Ардуину пишете, включать монитор последовательного порта ? Нам это пригодится, посмотреть, что там наши часы выдают.
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 26 Июль 2016, 20:59:45
А впрочем, не надо старый код проверять, давайте, уже сразу с часами. К тому же, я тут его немного визуально разделил на блоки, чтоб проще было понять, где что. Пины тут уже Ваши, ничего корректировать не надо, сразу заливайте, и скажите, что Вы видите в мониторе последовательного порта.
//---------Часы и Serial-----------------------
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
float z_time = 0;
tmElements_t tm;
int z=0;

//--------------Интерфейс---------------------
int current_mode = 1;                       //Переменная, показывающая к какому параметру привязан потенциометр, может быть 1, 2, 3, которые соотв. "красному", "желтому" и "зеленому"
boolean change = 0;                         // Флаг, показывающий, что мы находимся в режиме изменения привязки потенциометра, 1-в режиме, 0-не в режиме
float change_last_time = 0;                 // для засечки 3 секундного таймера выхода из режима изменения привязки

int x=0;                                    //Переменная, в которой храним считанные показания потенциометра
int y = 0;                                  //Переменная, в которой храним считанные показания цифрового входа кнопки, 0 или 1, нажата или нет
float y_last_time = 0;                      //Для засечки таймера

int led_red = 1;                            //Наша главная "красная" переменная, к которой будем в дальнейшем привязывать исполняющие таймеры
boolean led_red_flag = 0;                   //Флаг для мигания
int led_red_current = 0;                    //Порядковый номер текущего "мига"
float led_red_last_time = 0;                //для засечки таймера

int led_green = 1;                          // Главная "зеленая" переменная
boolean led_green_flag = 0;                  // Далее все аналогично, как и у красной
int led_green_current = 0;
float led_green_last_time = 0;

int led_blue = 1;                           //Главная "желтая" переменная, назвал blue, но не важно
boolean led_blue_flag = 0;
int led_blue_current = 0;
float led_blue_last_time = 0;

int led_freq = 200;                         //Частота мигания, т.е. перерыв между каждым миганием в миллисекундах
int led_pause = 2000;                       //Пауза между сериями миганий в мс

//----------------Помпа и клапаны-------------------------
float base_dive_freq = 2000;              //Базовый интервал между затоплениями, он затем будет умножаться на "зеленую" переменную, таким образом может быть от 10с до 110с
float dive_freq = 0;                           //Вычисленное реальное время между затоплениями. Служебная.
float dive_freq_last_time = 0;             //Засечка. Служебная

float dive_const = 1000;                  //Константа. Нужно будет замерять и занести сюда время, за которое физически наполняется труба до верха
float pereliv_const = 1000;               //Константа. Нужно будет замерять и занести сюда время, за которое физически из верхней трубы в нижнюю переливается раствор
                                        
float base_dive_time = 200;                //Базовый интервал для времени затопления. Мы его будем затем умножать на "желтую" переменную (led_blue)
float dive_time = 0;                           // Здесь будет уже вычисленное время продолжительности затопления. Служебная
float dive_time_last_time = 0;             //Засечка. Служебная

float dive_time_down = 0;                 // Здесь будет уже вычисленное время продолжительности затопления для нижней трубы. Служебная
float dive_time_down_last_time = 0;   //Засечка нижней трубы. Служебная

boolean dive_flag = 0;                      //Флаг, который говорит включена помпа или нет. 1 - включена, 0 - нет.
boolean clapan_up_flag = 0;                      //Флаг, который говорит верхний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.
boolean clapan_down_flag = 0;                      //Флаг, который говорит нижний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.

//****************************************************************************************                    
//****************************************************************************************
void setup() {

  Serial.begin(9600);

  pinMode(4, INPUT);                        //Пин для кнопки
  pinMode(5, OUTPUT);                      //пины для диодов
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(A3, INPUT);                       //пин для потенциометра

  pinMode(8, OUTPUT);                       //пин для нижнего клапана
  pinMode(9, OUTPUT);                       //пин для реле, на которой будет помпа
  pinMode(10, OUTPUT);                      // пин для верхнего клапана
}
//*****************************************************************************************
//*****************************************************************************************
void loop() {

//-----------Часы и Serial-------------------------
  z++;
  if((millis() - z_time) > 1000){
    RTC.read(tm);
    String ho = "Time: "+String(tm.Hour)+":"+String(tm.Minute)+":"+String(tm.Second);
    Serial.println (ho);
    Serial.println ("Speed - "+String(z)+" iterations per sec");
    z=0;
    z_time = millis();
    }

  
//------------Вычисление времени работы------------------------
  if (led_red == 1){                                                      // Все это будет выполняться только в первом спец.режиме, т.е. обычный режим
  dive_freq = base_dive_freq * led_green;                      //вычисляем периоды между затоплениями. Наш базовый период умножаем на "зеленую" переменную
  dive_time = dive_const + base_dive_time * led_blue;     //Вычисляем продолжительность затопления. Берем нашу константу (время, за которое помпа наполняет трубу,
                                                                              //  и увеличиваем на базовый период, умноженный на нашу "желтую" переменную
  dive_time_down = pereliv_const + base_dive_time * led_blue;       //Вычисляем продолжительность затопления для нижней трубы.
                                                                                           //Берем нашу константу теперь уже перелива, и увеличиваем на базовый период, умноженный на нашу "желтую" переменную
 
//------------Работа помпы и клапанов------------------------------
  if((millis() - dive_freq_last_time) > dive_freq) {        //если время затопления наступило
    digitalWrite(9, 1);                                             //включаем помпу
    digitalWrite(10, 1);                                  //закрываем клапан
    dive_flag = 1;                                                  //выставляем флаг, что помпа включена
    clapan_up_flag = 1;                                          //выставляем флаг, что клапан закрыт
    dive_freq_last_time = millis();                             //засечка для вычисления времени следующего включения помпы
    dive_time_last_time = millis();                             //засечка для вычисления премени выключения помпы
    }

  if(dive_flag && (millis()-dive_time_last_time) > dive_const){  //если помпа включена и время выключения наступило
    digitalWrite(9, 0);                                                         //выключаем помпу
    dive_flag = 0;                                                              //выставляем флаг, что помпа выключена
    }

  if(clapan_up_flag && (millis()-dive_time_last_time) > dive_time){       //если верхний клапан закрыт и время затопления истекло
    digitalWrite(10, 0);                                                                 //открываем верхний клапан
    clapan_up_flag = 0;                                                                //выставляем флаг, что верхний клапан открыт
    digitalWrite(8, 1);                                                                   //закрываем нижний клапан
    clapan_down_flag = 1;                                                            //выставляем флаг, что нижний клапан закрыт
    dive_time_down_last_time = millis();
    }

  if(clapan_down_flag && ((millis()-dive_time_down_last_time) > dive_time_down)){              //если нижний клапан закрыт и время нижнего затопления истекло
    digitalWrite(8, 0);                                                                                                  //Открываем нижний клапан
    clapan_down_flag = 0;                                                                                           //выставляем флаг, что нижний клапан открыт
    }
}

//-------------------Слив----------------------------
if (led_red == 2){                                                                     // все будет выполняться только вo 2 спец. режиме, т.е. принудительный слив
  digitalWrite(8, 0);                                                                   //открываем оба клапана
  digitalWrite(10, 0);
  digitalWrite(9, 0);                                                                   //выключаем помпу
  dive_freq_last_time = millis() - (float)86400000;                           // заставляем базовую программу думать, что последний полив был сутки назад
  }

//===================Интерфейс===================================
//-----------Чтение потенциометра-------------------------------
if(!change){                                                //если не находимся в режиме смены привязки, значит меняем главные переменные
   x = analogRead(A3);
   if (current_mode == 1){ led_red = (int)(x/100) + 1;      //Меняем переменную, в зависимости от текущей привязки
      if(led_red > 2){led_red = 2;}}                       // Если потенциометр накрутил больше 2, то все равно отображать 2
   if (current_mode == 2){ led_green = (int)(x/100) + 1;}   //Вот здесь важная формула, потенциометр на аналоговый вход выдает нам значение от 0 до 1024
   if (current_mode == 3){ led_blue = (int)(x/100) + 1;}    //Делим на 100, округляем и добавляем 1 (чтоб нуля не было), получается переменная может принимать значения
  }                                                       // от 1 до 11.
//------------Выход из режима привязки
if(change && (millis()-change_last_time)>3000){             //Это момент выхода из режима привязки, обнуляются служебные переменные диодов, выключаются
  change = 0;                                              
  led_green_current = 0;
  led_red_current = 0;
  led_blue_current = 0;
  led_red_flag = 0;
  digitalWrite(5, 0);
  led_green_flag = 0;
  digitalWrite(6, 0);
  led_blue_flag = 0;
  digitalWrite(7, 0);
  }
//-------------Обработка кнопки и привязка-----------------------------
if((millis()-y_last_time)>200){                     //Обработка нажатия на кнопку, добавил небольшой таймер 200мс, чтоб убрать "дребезг" - множественное срабатывание, кнопка будет срабатывать только если ее немного подержать (200мс)
  y = digitalRead(4);                               //читаем кнопочный выход
  if (y>0){                                         //если кнопка нажата
    current_mode++;                                 //инкрементируем текущий режим
    if(current_mode > 3) {current_mode = 1;}        //если получилось 4, то возвращаемся на 1
    change = 1;                                     //объявляем режим смены привязки
    change_last_time = millis();                    //засекаем для 3-секундного таймера выхода из режима смены
    digitalWrite(5, 0);                            //выключаем все диоды
    digitalWrite(6, 0);
    digitalWrite(7, 0);
    if (current_mode == 1){  digitalWrite(5, 1);}  //зажигаем только тот диод, к которому привязан потенциометр
    if (current_mode == 2){  digitalWrite(6, 1);}
    if (current_mode == 3){ digitalWrite(7, 1);}
    }
  y_last_time = millis();
  }
                                                        
//-------------------Мигание диодов-------------------------
 if (!change && (millis()-led_red_last_time)>led_freq){   //Если не находимся в режиме смены привязки и время моргнуть наступило    
    led_red_flag = 1-led_red_flag;                        //Инвертируем флаг текущего состояния диода, если было 0, стало 1, было 1, стало 0
    digitalWrite(5, led_red_flag);                       //Включаем или выключаем диод в зависимости в текущего состояния флага
    led_red_last_time = millis();
    led_red_current++;                                    //инкрементируем текущий порядковый номер "мига"
    if (led_red_current > (led_red*2-1)){                 //если текущий порядковый номер "мига" превысил главную переменную, здесь идет умножение на 2, т.к. текущих мигов у нас будет в 2 раза больше (1для включения, 1 для выключения).
      led_red_current = 0;                                //обнуляем его
      led_red_last_time = millis() + (led_pause-led_freq);//делаем засчеку для следующего мига, но уже добавляем паузу
      led_red_flag = 0;                                   //ставим флаг в 0, т.к. в начале следующего цикла он инвертируется и станет 1
      }
    }

  if (!change && (millis()-led_green_last_time)>led_freq){
    led_green_flag = 1-led_green_flag;
    digitalWrite(6, led_green_flag);
    led_green_last_time = millis();
    led_green_current++;
    if (led_green_current > (led_green*2-1)){
      led_green_current = 0;
      led_green_last_time = millis() + (led_pause-led_freq);
      led_green_flag = 0;
      }
    }

  if (!change && (millis()-led_blue_last_time)>led_freq){
    led_blue_flag = 1-led_blue_flag;
    digitalWrite(7, led_blue_flag);
    led_blue_last_time = millis();
    led_blue_current++;
    if (led_blue_current > (led_blue*2-1)){
      led_blue_current = 0;
      led_blue_last_time = millis() + (led_pause-led_freq);
      led_blue_flag = 0;      }
    }
}[\code]
Название: Re: Создание периодики на Arduino
Отправлено: kido от 26 Июль 2016, 21:02:24
Цитировать
какую никакакую гидроизоляцию...
А зачем вам БП со степенью защиты >=IP54?
Вы же его поливать не будете! :D

Решать вам, но тратить лишние деньги на БП который просто "компактней и имеет пассивное охлаждение" не вижу смысла. Лучше их потратить на что-то действительно полезное в вашем проекте.
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 26 Июль 2016, 21:09:30
... кроме жк экранов ...  Главное все это закодить :)
Так это вещи очень даже взаимосвязанные.  :) Будь у Вас ЖК-экран, вместо полсотни строк в программе, которые мало кто здесь разберет, потраченных всего лишь на мигание диодов, была бы пара очень простых строчек, понятных и новичку.


Если будет время и желание, запилите прогу под два потенциометра.
Это не сложно. Там скорее удалять код придется, нежели писать его  :)

закупиться, с расчетом на будущее...   ....остальное можно будет на подсветку пустить.
На подсветку, а это с большой долей вероятности будут диоды 445nm и 660nm, лучше будет уже специализированный драйвер купить. Поэтому берите любой БП на 12V от любой старой техники (как правило они меньше 1A не бывают), для Ардуины и клапанов хватит с головой. А сэкономленные деньги уже лучше на мощный драйвер для диодов потратите.

Для начала, проверьте работает ли код с исправленными ошибками (ошибки я выше выделил красным).
И вопрос: Вы уже умеете в той программе, в которой код на Ардуину пишете, включать монитор последовательного порта ? Нам это пригодится, посмотреть, что там наши часы выдают.


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

насчет блока питания, поищю, у меня есть пара, но они 0.5А, маловато будет.

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

да, монитор ком порта пользую, я через него гоняю потенциометры и часы для проверки, тестовыми сетчами.
 
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 26 Июль 2016, 21:42:43
Вот на 2 потенциометра. Минус пара десятков строчек кода и плюс удобство благодаря добавлению всего лишь одного потенциометра.
Принцип тот же. Только нет никаких уже привязок. Какой потенциометр крутим, то и регулируем. Первый - частота затоплений, второй (я его повесил на A2) - продолжительность.
При нажатии на кнопку переходим в режим слива, об этом сигнализирует одновременно горящие все диоды. Еще раз нажали на кнопку - вышли в обычный режим. При выходе из режима слива в обычный режим так же, как и раньше происходит сразу же затопление.
Видео:
(http://img10.lostpic.net/2016/07/26/78d3414864dd3165e6ee136b9a2735ec.png) (https://youtu.be/L7oGoHsRUic)
//---------Часы и Serial-----------------------
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
float z_time = 0;
tmElements_t tm;
int z=0;

//--------------Интерфейс---------------------
boolean sliv_flag = 0;                         // Флаг, показывающий, что мы находимся в режиме слива, 1-в режиме, 0-не в режиме

float y_last_time = 0;                      //Для засечки таймера

int led_red = 1;                            //Наша главная "красная" переменная, к которой будем в дальнейшем привязывать исполняющие таймеры
boolean led_red_flag = 0;                   //Флаг для мигания
int led_red_current = 0;                    //Порядковый номер текущего "мига"
float led_red_last_time = 0;                //для засечки таймера

int led_green = 1;                          // Главная "зеленая" переменная
boolean led_green_flag = 0;                  // Далее все аналогично, как и у красной
int led_green_current = 0;
float led_green_last_time = 0;

int led_blue = 1;                           //Главная "желтая" переменная, назвал blue, но не важно
boolean led_blue_flag = 0;
int led_blue_current = 0;
float led_blue_last_time = 0;

int led_freq = 200;                         //Частота мигания, т.е. перерыв между каждым миганием в миллисекундах
int led_pause = 2000;                       //Пауза между сериями миганий в мс

//----------------Помпа и клапаны-------------------------
float base_dive_freq = 2000;              //Базовый интервал между затоплениями, он затем будет умножаться на "зеленую" переменную, таким образом может быть от 10с до 110с
float dive_freq = 0;                           //Вычисленное реальное время между затоплениями. Служебная.
float dive_freq_last_time = 0;             //Засечка. Служебная

float dive_const = 1000;                  //Константа. Нужно будет замерять и занести сюда время, за которое физически наполняется труба до верха
float pereliv_const = 1000;               //Константа. Нужно будет замерять и занести сюда время, за которое физически из верхней трубы в нижнюю переливается раствор
                                        
float base_dive_time = 200;                //Базовый интервал для времени затопления. Мы его будем затем умножать на "желтую" переменную (led_blue)
float dive_time = 0;                           // Здесь будет уже вычисленное время продолжительности затопления. Служебная
float dive_time_last_time = 0;             //Засечка. Служебная

float dive_time_down = 0;                 // Здесь будет уже вычисленное время продолжительности затопления для нижней трубы. Служебная
float dive_time_down_last_time = 0;   //Засечка нижней трубы. Служебная

boolean dive_flag = 0;                      //Флаг, который говорит включена помпа или нет. 1 - включена, 0 - нет.
boolean clapan_up_flag = 0;                      //Флаг, который говорит верхний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.
boolean clapan_down_flag = 0;                      //Флаг, который говорит нижний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.

//****************************************************************************************                    
//****************************************************************************************
void setup() {

  Serial.begin(9600);

  pinMode(4, INPUT);                        //Пин для кнопки
  pinMode(5, OUTPUT);                      //пины для диодов
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(A3, INPUT);                       //пин для потенциометра
  pinMode(A2, INPUT);                       //пин для потенциометра

  pinMode(8, OUTPUT);                       //пин для нижнего клапана
  pinMode(9, OUTPUT);                       //пин для реле, на которой будет помпа
  pinMode(10, OUTPUT);                      // пин для верхнего клапана
}
//*****************************************************************************************
//*****************************************************************************************
void loop() {

//-----------Часы и Serial-------------------------
  z++;
  
  if((millis() - z_time) > 1000){
    RTC.read(tm);
    String ho = "Time: "+String(tm.Hour)+":"+String(tm.Minute)+":"+String(tm.Second);
    Serial.println (ho);
    Serial.println ("Speed - "+String(z)+" iterations per sec");
    z=0;
    z_time = millis();
    }
  
//------------Вычисление времени работы------------------------
  if (!sliv_flag){        
  dive_freq = base_dive_freq * led_green;                      //вычисляем периоды между затоплениями. Наш базовый период умножаем на "зеленую" переменную
  dive_time = dive_const + base_dive_time * led_blue;     //Вычисляем продолжительность затопления. Берем нашу константу (время, за которое помпа наполняет трубу,
                                                                              //  и увеличиваем на базовый период, умноженный на нашу "желтую" переменную
  dive_time_down = pereliv_const + base_dive_time * led_blue;       //Вычисляем продолжительность затопления для нижней трубы.
                                                                                           //Берем нашу константу теперь уже перелива, и увеличиваем на базовый период, умноженный на нашу "желтую" переменную
 
//------------Работа помпы и клапанов------------------------------
  if((millis() - dive_freq_last_time) > dive_freq) {        //если время затопления наступило
    digitalWrite(9, 1);                                             //включаем помпу
    digitalWrite(10, 1);                                  //закрываем клапан
    dive_flag = 1;                                                  //выставляем флаг, что помпа включена
    clapan_up_flag = 1;                                          //выставляем флаг, что клапан закрыт
    dive_freq_last_time = millis();                             //засечка для вычисления времени следующего включения помпы
    dive_time_last_time = millis();                             //засечка для вычисления премени выключения помпы
    }

  if(dive_flag && (millis()-dive_time_last_time) > dive_const){  //если помпа включена и время выключения наступило
    digitalWrite(9, 0);                                                         //выключаем помпу
    dive_flag = 0;                                                              //выставляем флаг, что помпа выключена
    }

  if(clapan_up_flag && (millis()-dive_time_last_time) > dive_time){       //если верхний клапан закрыт и время затопления истекло
    digitalWrite(10, 0);                                                                 //открываем верхний клапан
    clapan_up_flag = 0;                                                                //выставляем флаг, что верхний клапан открыт
    digitalWrite(8, 1);                                                                   //закрываем нижний клапан
    clapan_down_flag = 1;                                                            //выставляем флаг, что нижний клапан закрыт
    dive_time_down_last_time = millis();
    }

  if(clapan_down_flag && ((millis()-dive_time_down_last_time) > dive_time_down)){              //если нижний клапан закрыт и время нижнего затопления истекло
    digitalWrite(8, 0);                                                                                                  //Открываем нижний клапан
    clapan_down_flag = 0;                                                                                           //выставляем флаг, что нижний клапан открыт
    }
}

//-------------------Слив----------------------------
if (sliv_flag){                                                                     // все будет выполняться только вo 2 спец. режиме, т.е. принудительный слив
  digitalWrite(8, 0);                                                                   //открываем оба клапана
  digitalWrite(10, 0);
  digitalWrite(9, 0);  
  digitalWrite(6, 1);
  digitalWrite(5, 1);
  digitalWrite(7, 1);
  dive_freq_last_time = millis() - (float)86400000;                           // заставляем базовую программу думать, что последний полив был сутки назад
  }

//===================Интерфейс===================================
//-----------Чтение потенциометров-------------------------------
   led_green = (int)(analogRead(A3)/100) + 1;  
   led_blue = (int)(analogRead(A2)/100) + 1;  
 
//-------------Обработка кнопки слива-----------------------------
if((millis()-y_last_time)>200){                     //Обработка нажатия на кнопку, добавил небольшой таймер 200мс, чтоб убрать "дребезг" - множественное срабатывание, кнопка будет срабатывать только если ее немного подержать (200мс)
  if (digitalRead(4)){sliv_flag = 1- sliv_flag;}
  y_last_time = millis();
  }
                                                        
//-------------------Мигание диодов-------------------------
 if (!sliv_flag && (millis()-led_red_last_time)>led_freq){   //Если не находимся в режиме смены привязки и время моргнуть наступило    
    led_red_flag = 1-led_red_flag;                        //Инвертируем флаг текущего состояния диода, если было 0, стало 1, было 1, стало 0
    digitalWrite(5, led_red_flag);                       //Включаем или выключаем диод в зависимости в текущего состояния флага
    led_red_last_time = millis();
    led_red_current++;                                    //инкрементируем текущий порядковый номер "мига"
    if (led_red_current > (led_red*2-1)){                 //если текущий порядковый номер "мига" превысил главную переменную, здесь идет умножение на 2, т.к. текущих мигов у нас будет в 2 раза больше (1для включения, 1 для выключения).
      led_red_current = 0;                                //обнуляем его
      led_red_last_time = millis() + (led_pause-led_freq);//делаем засчеку для следующего мига, но уже добавляем паузу
      led_red_flag = 0;                                   //ставим флаг в 0, т.к. в начале следующего цикла он инвертируется и станет 1
      }
    }

  if (!sliv_flag &&(millis()-led_green_last_time)>led_freq){
    led_green_flag = 1-led_green_flag;
    digitalWrite(6, led_green_flag);
    led_green_last_time = millis();
    led_green_current++;
    if (led_green_current > (led_green*2-1)){
      led_green_current = 0;
      led_green_last_time = millis() + (led_pause-led_freq);
      led_green_flag = 0;
      }
    }

  if (!sliv_flag &&(millis()-led_blue_last_time)>led_freq){
    led_blue_flag = 1-led_blue_flag;
    digitalWrite(7, led_blue_flag);
    led_blue_last_time = millis();
    led_blue_current++;
    if (led_blue_current > (led_blue*2-1)){
      led_blue_current = 0;
      led_blue_last_time = millis() + (led_pause-led_freq);
      led_blue_flag = 0;      }
    }
}[\code]
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 26 Июль 2016, 22:06:12
ок спасибо!

библиотеки нашел, ща попробую залить...
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 26 Июль 2016, 22:08:15

насчет блока питания, поищю, у меня есть пара, но они 0.5А, маловато будет.

Ну так по одному на каждый клапан - как раз, зачем еще покупать что-то ? Ардуина копейки потребляет, довесите ее на один из БП.
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 26 Июль 2016, 22:47:10
Я все таки дизайнер, мне чтоб красиво было еще надо. Одно коробка с двумя отделениями блок управления- силовой и второй герметичный с клапанами :) куча блоков питания это не по феншую :)

Залил новый скетч, вроде работает. ща сделаю типа нагрузку из диодов просмотр как реле отрабатывают.... 
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 26 Июль 2016, 22:51:40
Что Вы видите в мониторе последовательного порта?
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 26 Июль 2016, 23:16:26
Speed - 2476 iterations per sec
Time: 21:7:35

и тд, с интервалом в 1с .
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 26 Июль 2016, 23:32:47
Прекрасно.
Время, как я вижу Вы уже правильное выставили.
Speed - 2476 iterations per sec - это я хотел посмотреть на скорость Вашей Ардуины в реале. Это обозначает, что наш метод loop() и все, что в нем, выполняется 2400 раз в секунду. За это отвечает переменная z, можете убрать все строки, где она встречается (там их 4 всего), если хотите.

Так, время мы получили, теперь каким образом мы будем его использовать в нашей программе ?
Мои мысли:
вводим поправочный коэффициент (на него мы будем умножать нашу частоту затоплений и время затопления), который будет зависеть от текущего времени суток.
Если сейчас день, то нам нужно сократить перерывы между затоплениями, значит коэфф. будет меньше единицы, пускай 0.5. Если ночь - наоборот увеличить, пускай 1.5. Утром и вечером оставить по 1.

Например, если у нас выставлен период между затоплениями 2 часа, тогда раскладка в течение дня получится:
Время дняКоэффициентРеальные перерывы между затоплениями
8-1112 часа
12-180.51 час
19-2112 часа
22-071.53 часа

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

У Вас какие мысли ?
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 27 Июль 2016, 00:38:19
Сделал нагрузку в виде диодов, вроде работает и стало куда наглядней.   Правда я еще один светодиод спалил. Завтра, если буду по лучше себя чувствовать, воткну другой и попробую собрать по новой свою макетную схему. А то че то с температурой трудно мне все это дается...

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


По времени, все отлично! Но как я понимаю, помимо коэффициента времени, будет учтен и коэффициент с потенциометров? Ну например базовое время между затопленными днем  1 час, это соответствует 5ке с потенциометра, если крутим в сторону уменьшения,  то на 4ке уже 50мин, на 3ке 40... и в большую сторону соответственно 6-1.10 7-1.20....
.



Если все заработает как положено, то можно сказать что с софтом и макетом блока управления мы закончили, можно будет начинать все паять и собирать, в принципе для этого у меня есть все кроме клапанов, помпы и БП. Пока они будут ехать соберу все до кучи, пофоткаю, составлю спецификацию по материалам и комплектующим, нарисую норм схемы для распайки-сборки блока управления и общею принципиальную схему системы. Думаю должен получится отличный эксклюзивный для нашего сайта материал.  За одно можно будет и упрощенный вариант что предложил kido проработать, пока без фото, в виде схем и спецификаций....
Название: Re: Создание периодики на Arduino
Отправлено: kido от 27 Июль 2016, 00:59:10
Ну как-то так. Примерно что-то похожее и для продолжительности затопления, только наоборот - чем жарче, тем дольше затапливать.
"Неправильно ты, дядя Федор, бутерброд ешь."(с)
Нужно не увеличиватьпродолжительность затопления, а уменьшать паузы между ними!
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 27 Июль 2016, 01:01:54
По времени, все отлично! Но как я понимаю, помимо коэффициента времени, будет учтен и коэффициент с потенциометров?
Этот базовый интервал (как в примере 2 часа) мы будет выставлять как раз с помощью потенциометров.

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

В общем я сейчас набросаю эти коэффициенты выложу. Буду выкладывать уже программу для двух потенциометров, вы второй уже нашли ? Там, кстати, третий, красный диод нам уже не нужен, я его выкину из программы.
Название: Re: Создание периодики на Arduino
Отправлено: kido от 27 Июль 2016, 01:05:14
Я все таки дизайнер, 
а я разработчик систем АСУТП :)

мне чтоб красиво было еще надо. Одно коробка с двумя отделениями блок управления- силовой и второй герметичный с клапанами :)
и вот это уж точно не по феншую!
если делать правильно, по феншую, ;) то блок клапанов необходимо выносить отдельно, но уж никак не устанаваливать рядом с управляющей электроникой.
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 27 Июль 2016, 01:06:30
Ну как-то так. Примерно что-то похожее и для продолжительности затопления, только наоборот - чем жарче, тем дольше затапливать.
"Неправильно ты, дядя Федор, бутерброд ешь."(с)
Нужно не увеличиватьпродолжительность затопления, а уменьшать паузы между ними!
Ну так мы собираемся регулировать оба параметра: и уменьшать паузы между ними и увеличивать продолжительность.
Продолжительность минимальная будет равна 0, т.е. залил и сразу слил (большую часть суток), а во время дневной жары можно залить и подержать минут 20 (или сколько там для них безопасно), в это время они пьют как лошади, могут и не успевать напиться при коротком затоплении, даже если раз в полчаса затапливать.
Название: Re: Создание периодики на Arduino
Отправлено: kido от 27 Июль 2016, 01:09:11
Ann, дело же не в том чтобы дать им напиться, а в том, что бы не дать корням задохнуться.
Раствор ведь не аэрируется между затоплениями.
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 27 Июль 2016, 01:20:41
Ann, дело же не в том чтобы дать им напиться, а в том, что бы не дать корням задохнуться.
Раствор ведь не аэрируется между затоплениями.
Я в периодике не спец, рассуждаю чисто по ощущениям, сужу по своей хабанере, которая во время жары у меня по 1.5 л в сутки пила, просто очень сомневаюсь, что в период кратковременного затопления она успеет на пике жары напиться. Обезвоженное растение примерно полчаса восстанавливает тургор листьев, а в период сильной жары, когда скорость транспирации сумасшедшая, т.е. мало того, что ей нужно пить больше чем текущая транспирация, так еще и запас влаги делать, чтобы хватило на период между поливами, сомневаюсь что успеет.
Повторяю, это по личным ощущениям, не претендую на правоту. Как там правильно и по науке, пускай AlexYalta форумы гуглит. 
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 27 Июль 2016, 01:25:54
блок клапанов необходимо выносить отдельно, но уж никак не устанаваливать рядом с управляющей электроникой.
Совершенно спереди! Малейшая протечка и загубите всю электронику и перцы тоже (быстро купить новую ардуину вряд ли получится). Не стОит этот риск любого фэншуя.
Название: Re: Создание периодики на Arduino
Отправлено: kido от 27 Июль 2016, 01:29:13
"Предлагаю дружить домами!"(с)  :drinks:
Пусть AlexYalta на практике проверит различные варинты и отпишется, успевают пр жаре растения напиться или нет.
Тогда все точки над "i" расставятся сами собой.

Название: Re: Создание периодики на Arduino
Отправлено: Ann от 27 Июль 2016, 01:39:57
"Предлагаю дружить домами!"(с)  :drinks:
Пусть AlexYalta на практике проверит различные варинты и отпишется, успевают пр жаре растения напиться или нет.
Тогда все точки над "i" расставятся сами собой.
Да, единственно правильный вариант.
Я бы не только на жаре, но в обычных режимах (при разных температурах) замерял бы время между моментом полива и моментом, когда растение начнет опускать листья.
Тогда уже можно будет более предметно говорить о режимах. Не знаю, будет ли AlexYalta это делать, но я бы сделал обязательно.
Не удивлюсь, если окажется, что ночью при температуре 18-20 и ниже можно вообще всю ночь не затапливать.
 :drinks:
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 27 Июль 2016, 12:11:12
По времени, все отлично! Но как я понимаю, помимо коэффициента времени, будет учтен и коэффициент с потенциометров?
Этот базовый интервал (как в примере 2 часа) мы будет выставлять как раз с помощью потенциометров.

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

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


да, оба подключены,  диод выдерну. Вечерком этим все займусь, а то работать надо....
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 27 Июль 2016, 12:13:10
Я все таки дизайнер, 
а я разработчик систем АСУТП :)

мне чтоб красиво было еще надо. Одно коробка с двумя отделениями блок управления- силовой и второй герметичный с клапанами :)
и вот это уж точно не по феншую!
если делать правильно, по феншую, ;) то блок клапанов необходимо выносить отдельно, но уж никак не устанаваливать рядом с управляющей электроникой.

пока еще не решил как все организовать, но то что будет зашита электроники от протечек это 100%. возможно это будет два независимых блока оледененных в одно целое...
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 27 Июль 2016, 12:15:46
"Предлагаю дружить домами!"(с)  :drinks:
Пусть AlexYalta на практике проверит различные варинты и отпишется, успевают пр жаре растения напиться или нет.
Тогда все точки над "i" расставятся сами собой.
Да, единственно правильный вариант.
Я бы не только на жаре, но в обычных режимах (при разных температурах) замерял бы время между моментом полива и моментом, когда растение начнет опускать листья.
Тогда уже можно будет более предметно говорить о режимах. Не знаю, будет ли AlexYalta это делать, но я бы сделал обязательно.
Не удивлюсь, если окажется, что ночью при температуре 18-20 и ниже можно вообще всю ночь не затапливать.
 :drinks:


буду обязательно!  инфа будет полезна не только мне но и другим кто захочет делать переодику. 
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 27 Июль 2016, 17:59:27
Ну вот, пока окончательный вариант, дальнейшие изменения уже после запуска системы. В начале перечислил нерешенные проблемы, чтобы не забыть (запуск видимо будет не скоро?), и решить в случае, если будет необходимость (а может и не будет).
1. По продолжительности затопления нужно будет Вам погуглить форумы, нужно ли, на какой период безопасно и т.д. Затем уже отрегулируем
2. Программа написана для клапанов НО, у Вас НЗ, в случае необходимости нужно будет переделать, если инверсия на реле по какой-то причине не устроит.
3. В программе не обыграно закрытие клапанов в период между затоплениями. Нужно ли это делать станет ясно уже после знакомства с их работой, сколько потребляют, насколько греются.
4. Программа завязана на внутренний таймер, емкость которого 50 суток. По достижении верхнего предела он обнуляется, и логика программы нарушается. Такая себе "проблема 2000" локального масштаба. Пока не делал, т.к. есть несколько вариантов, пока не решил, какой лучше (ввести доп. переменные, обнулять последнее время вместе с обнулением системного таймера, программно перезапускать ардуину в начале каждого дня, а может и вовсе привязаться к внешним часам), в общем после запуска прояснится. Пока просто перезапускать ардуину раз в 50 дней.
/*
 1. Не установлен коэффициент для продолжительности затопления в зависимости от времени суток
 2. Инверсия клапанов
 3. Не обыграно нормальное положение клапанов - закрытое.
 4. Проблема обнуления таймера.
*/

//---------Часы и Serial-----------------------
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
float z_time = 0;
tmElements_t tm;
int current_hour = 0;                         //храним текущий час
float day_koef = 1;                           //коэффициент времени дня

//--------------Интерфейс---------------------
boolean sliv_flag = 0;                        // Флаг режима слива
float y_last_time = 0;                        //Для засечки таймера дребезга кнопки

int led_green = 1;                            // Главная "зеленая" переменная, частота затоплений
boolean led_green_flag = 0;                  
int led_green_current = 0;
float led_green_last_time = 0;

int led_blue = 1;                             //Продолжительность затопления
boolean led_blue_flag = 0;
int led_blue_current = 0;
float led_blue_last_time = 0;

[color=red]int led_freq = 200; [/color]                          //Частота мигания, т.е. перерыв между каждым миганием в миллисекундах
[color=red]int led_pause = 2000;[/color]                         //Пауза между сериями миганий в мс

//----------------Помпа и клапаны-------------------------
[color=red]float base_dive_freq = 2000;[/color]                  //Базовый интервал между затоплениями, он затем будет умножаться на "зеленую" переменную
float dive_freq = 0;                          //Вычисленное реальное время между затоплениями. Служебная.
float dive_freq_last_time = 0;                //Засечка. Служебная

[color=red]float dive_const = 1000;[/color]                       //Константа. Нужно будет замерять и занести сюда время, за которое физически наполняется труба до верха
[color=red]float pereliv_const = 1000;[/color]                    //Константа. Нужно будет замерять и занести сюда время, за которое физически из верхней трубы в нижнюю переливается раствор
                                        
[color=red]float base_dive_time = 200;[/color]                     //Базовый интервал для времени затопления. Мы его будем затем умножать на "желтую" переменную (led_blue)
float dive_time = 0;                            // Здесь будет уже вычисленное время продолжительности затопления. Служебная
float dive_time_last_time = 0;                  //Засечка. Служебная

float dive_time_down = 0;                       // Здесь будет уже вычисленное время продолжительности затопления для нижней трубы. Служебная
float dive_time_down_last_time = 0;             //Засечка нижней трубы. Служебная

boolean dive_flag = 0;                           //Флаг, который говорит включена помпа или нет. 1 - включена, 0 - нет.
boolean clapan_up_flag = 0;                      //Флаг, который говорит верхний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.
boolean clapan_down_flag = 0;                    //Флаг, который говорит нижний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.

//****************************************************************************************                    
//****************************************************************************************
void setup() {
  Serial.begin(9600);
  pinMode(4, INPUT);                        //Пин для кнопки
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(A3, INPUT);                       //пин для потенциометра
  pinMode(A2, INPUT);                       //пин для потенциометра
  pinMode(8, OUTPUT);                       //пин для нижнего клапана
  pinMode(9, OUTPUT);                       //пин для реле, на которой будет помпа
  pinMode(10, OUTPUT);                      //пин для верхнего клапана
}
//*****************************************************************************************
//*****************************************************************************************
void loop() {

//-----------Часы и Serial-------------------------
  if((millis() - z_time) > 1000){
    RTC.read(tm);
    //String ho = "Time: "+String(tm.Hour)+":"+String(tm.Minute)+":"+String(tm.Second);
    Serial.println ("Hour "+ String(tm.Second)+"   Koeff - " + String(day_koef));
    z_time = millis();

    current_hour = tm.Hour;
    //current_hour = tm.Second;                 //временная привязка к секундам для проверки правильности коэфф.
   [color=red] if (current_hour == 8 || current_hour == 9 || current_hour == 20 || current_hour == 21) day_koef = 1;           //коэфф. для часов дня
    if (current_hour == 10 || current_hour == 11 || current_hour == 18 || current_hour == 19) day_koef = 0.75;
    if (current_hour >=12 && current_hour <=17) day_koef = 0.5;
    if ((current_hour >=0 && current_hour <=7) || current_hour == 22 || current_hour == 23) day_koef = 2; [/color]
  }
  
//------------Вычисление времени работы------------------------
if (!sliv_flag){        
  dive_freq = base_dive_freq * led_green * day_koef;
  dive_time = dive_const + base_dive_time * led_blue;  
  dive_time_down = pereliv_const + base_dive_time * led_blue;    
                          
 
//------------Работа помпы и клапанов------------------------------
  if((millis() - dive_freq_last_time) > dive_freq) {        //если время затопления наступило
    digitalWrite(9, 1);                                     //включаем помпу
    digitalWrite(10, 1);                                    //закрываем клапан
    dive_flag = 1;                                          //выставляем флаг, что помпа включена
    clapan_up_flag = 1;                                     //выставляем флаг, что клапан закрыт
    dive_freq_last_time = millis();                         //засечка для вычисления времени следующего включения помпы
    dive_time_last_time = millis();                         //засечка для вычисления премени выключения помпы
    }

  if(dive_flag && (millis()-dive_time_last_time) > dive_const){  //если помпа включена и время выключения наступило
    digitalWrite(9, 0);                                          //выключаем помпу
    dive_flag = 0;                                               //выставляем флаг, что помпа выключена
    }

  if(clapan_up_flag && (millis()-dive_time_last_time) > dive_time){       //если верхний клапан закрыт и время затопления истекло
    digitalWrite(10, 0);                                                  //открываем верхний клапан
    clapan_up_flag = 0;                                                   //выставляем флаг, что верхний клапан открыт
    digitalWrite(8, 1);                                                   //закрываем нижний клапан
    clapan_down_flag = 1;                                                 //выставляем флаг, что нижний клапан закрыт
    dive_time_down_last_time = millis();
    }

  if(clapan_down_flag && ((millis()-dive_time_down_last_time) > dive_time_down)){  //если нижний клапан закрыт и время нижнего затопления истекло
    digitalWrite(8, 0);                                                            //Открываем нижний клапан
    clapan_down_flag = 0;                                                          //выставляем флаг, что нижний клапан открыт
    }
}

//-------------------Слив----------------------------
if (sliv_flag){                                                                    
  digitalWrite(8, 0);                                                              
  digitalWrite(10, 0);
  digitalWrite(9, 0);  
  digitalWrite(6, 1);
  digitalWrite(7, 1);
  led_green_current = 0;
  led_blue_current = 0;
  led_green_flag = 0;
  led_blue_flag = 0;
  dive_freq_last_time = millis() - (float)86400000;                           // заставляем базовую программу думать, что последний полив был сутки назад
  }

//===================Интерфейс===================================

//-----------Чтение потенциометра-------------------------------
   led_green = (int)(analogRead(A3)/100) + 1;  
   led_blue = (int)(analogRead(A2)/100) + 1;  
 
//-------------Обработка кнопки и привязка-----------------------------
if((millis()-y_last_time)>200){                    
  if (digitalRead(4)){sliv_flag = 1- sliv_flag;}
  y_last_time = millis();
  }
                                                        
//-------------------Мигание диодов-------------------------
  if (!sliv_flag &&(millis()-led_green_last_time)>led_freq){
    led_green_flag = 1-led_green_flag;
    digitalWrite(6, led_green_flag);
    led_green_last_time = millis();
    led_green_current++;
    if (led_green_current > (led_green*2-1)){
      led_green_current = 0;
      led_green_last_time = millis() + (led_pause-led_freq);
      led_green_flag = 0;
      }
    }

  if (!sliv_flag &&(millis()-led_blue_last_time)>led_freq){
    led_blue_flag = 1-led_blue_flag;
    digitalWrite(7, led_blue_flag);
    led_blue_last_time = millis();
    led_blue_current++;
    if (led_blue_current > (led_blue*2-1)){
      led_blue_current = 0;
      led_blue_last_time = millis() + (led_pause-led_freq);
      led_blue_flag = 0;
      }
    }
}

[\code]
Название: Re: Создание периодики на Arduino
Отправлено: kido от 27 Июль 2016, 23:24:41
4. Программа завязана на внутренний таймер, емкость которого 50 суток. По достижении верхнего предела он обнуляется, и логика программы нарушается. Такая себе "проблема 2000" локального масштаба.

Ann, а если попробовать так:
if(mills()>=0 && mills()<10){
dive_freq_last_time = dive_freq_last_time + interval - MAX_NUMBER;

где MAX_NUMBER - максимальное значение внутреннего счетчика миллисекунд
возможно придется вилочку подкорректировать таким образом, чтобы в нее программа гарантированно попала только один(!) раз
просто я не знаю быстродействия программы
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 27 Июль 2016, 23:59:00
4. Программа завязана на внутренний таймер, емкость которого 50 суток. По достижении верхнего предела он обнуляется, и логика программы нарушается. Такая себе "проблема 2000" локального масштаба.

Ann, а если попробовать так:
if(mills()>=0 && mills()<10){
dive_freq_last_time = dive_freq_last_time + interval - MAX_NUMBER;

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


Ну, предположим, что таймер у нас обнуляется при 1000, последняя засечка была сделана при 990, интервал 100. Тогда следующее срабатывание (включение помпы) должно произойти при 90 (после обнуления)
Ваша строка присвоит
dive_freq_last_time = 990 + 100 - 1000
Получится 90. dive_freq_last_time станет равно 90.
Но следующее срабатывание произойдет, когда текущее будет на 100 больше, чем dive_freq_last_time, т.е. при 190.
Таким образом произойдет пропуск одного цикла.

Отследить переполнение таймера можно строчкой
if((millis()-dive_freq_last_time) < 0){

А дальше можно тупо присвоить dive_freq_last_time = 0. Но здесь тоже один цикл будет большего интервала, чем нужно, примерно на 1-99% (в зависимости куда попала прошлая засечка).
Либо выставить флаг, что произошло обнуление счетчика, в этот момент один раз использовать Вашу же строчку
dive_freq_last_time = dive_freq_last_time + interval - MAX_NUMBER;
Но interval на одну итерацию приравнять нулю, затем убрать флаг, и вернуть interval его рабочее значение.

Да, честно говоря, поленился. Особой необходимости как-бы и нет, а вариантов несколько, а какой лучше, непонятно.
Я больше склоняюсь с ресету Ардуину каждые сутки программным путем. Дело в том, что эти коэфф. будут не совсем стабильно работать. Интервалы большие между затоплениями, коэффициенты будут меняться чаще, чем пройдет пауза между одним затоплением, в общем небольшой разброд и шатай получится. Думаю может просто жестко привязать начало суточного цикла к 8 утра например. Более предсказуемее работа получится. Тогда и проблема обнуления сама собой отпадет.
Но это все потом, пускай уже запустит сначала, а там в процессе будет виднее.


P.S. Опа! Этот форум тег [ code ] понимает ?! А я тут простыни выкладываю! Спасибо за подсказку.
Название: Re: Создание периодики на Arduino
Отправлено: kido от 28 Июль 2016, 01:00:35
тогда так: dive_freq_last_time = dive_freq_last_time - MAX_NUMBER;
значение получится отрицательное, но при if((millis() - dive_freq_last_time) > dive_freq) { должно сработать без пропуска цикла

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


p.s. а вот и тэг! ;)
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 28 Июль 2016, 01:12:02
тогда так: dive_freq_last_time = dive_freq_last_time - MAX_NUMBER;
значение получится отрицательное, но при if((millis() - dive_freq_last_time) > dive_freq) { должно сработать без пропуска цикла

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


p.s. а вот и тэг! ;)
:D Блин, действительно! Как обычно, в голову лезут куча всевозможных решений, кроме самого элементарного :)

Там есть пин на ней под названием RESET, при подаче на него +5V, происходит он же. Вроде так, сам не пробовал.
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 30 Июль 2016, 12:53:20
Прошу прощения что пропал на пару дней, не до гидропоники было :(

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

Попозже попробую залить последнею версию скетча от Ann....
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 30 Июль 2016, 23:18:16
Так вроде все собрал, поправил чутка код и вроде все заработало.

только есть два вопроса:

1 клапана во время интервала между затоплениями, постоянно "открыты", это так и должно быть?
2 часы пока как я понял не пашут, не выставлены интервалы?

скетч после моих манипуляций:
/*
 1. Не установлен коэффициент для продолжительности затопления в зависимости от времени суток
 2. Инверсия клапанов
 3. Не обыграно нормальное положение клапанов - закрытое.
 4. Проблема обнуления таймера.
*/

//---------Часы и Serial-----------------------
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
float z_time = 0;
tmElements_t tm;
int current_hour = 0;                         //храним текущий час
float day_koef = 1;                           //коэффициент времени дня

//--------------Интерфейс---------------------
boolean sliv_flag = 0;                        // Флаг режима слива
float y_last_time = 0;                        //Для засечки таймера дребезга кнопки

int led_green = 1;                            // Главная "зеленая" переменная, частота затоплений
boolean led_green_flag = 0;                 
int led_green_current = 0;
float led_green_last_time = 0;

int led_blue = 1;                             //Продолжительность затопления
boolean led_blue_flag = 0;
int led_blue_current = 0;
float led_blue_last_time = 0;

int led_freq = 200;                         //Частота мигания, т.е. перерыв между каждым миганием в миллисекундах
int led_pause = 2000;                         //Пауза между сериями миганий в мс

//----------------Помпа и клапаны-------------------------
float base_dive_freq = 15000;           //Базовый интервал между затоплениями, он затем будет умножаться на "зеленую" переменную
float dive_freq = 0;                          //Вычисленное реальное время между затоплениями. Служебная.
float dive_freq_last_time = 0;                //Засечка. Служебная

float dive_const = 5000;                     //Константа. Нужно будет замерять и занести сюда время, за которое физически наполняется труба до верха
float pereliv_const = 5000;                  //Константа. Нужно будет замерять и занести сюда время, за которое физически из верхней трубы в нижнюю переливается раствор
                                         
float base_dive_time = 3000;                   //Базовый интервал для времени затопления. Мы его будем затем умножать на "желтую" переменную (led_blue)
float dive_time = 0;                            // Здесь будет уже вычисленное время продолжительности затопления. Служебная
float dive_time_last_time = 0;                  //Засечка. Служебная

float dive_time_down = 0;                       // Здесь будет уже вычисленное время продолжительности затопления для нижней трубы. Служебная
float dive_time_down_last_time = 0;             //Засечка нижней трубы. Служебная

boolean dive_flag = 0;                           //Флаг, который говорит включена помпа или нет. 1 - включена, 0 - нет.
boolean clapan_up_flag = 0;                      //Флаг, который говорит верхний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.
boolean clapan_down_flag = 0;                    //Флаг, который говорит нижний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.

//****************************************************************************************                     
//****************************************************************************************
void setup() {
  Serial.begin(9600);
  pinMode(4, INPUT);                        //Пин для кнопки
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(A3, INPUT);                       //пин для потенциометра
  pinMode(A2, INPUT);                       //пин для потенциометра
 
 
 
  pinMode(8, OUTPUT);                         //пин для нижнего клапана
  pinMode(9, OUTPUT);                       //пин для реле, на которой будет помпа       
  pinMode(10, OUTPUT);                       //пин верхнего клапана
  digitalWrite(9,HIGH);

}
//*****************************************************************************************
//*****************************************************************************************
void loop() {
 


//-----------Часы и Serial-------------------------
  if((millis() - z_time) > 1000){
    RTC.read(tm);
    //String ho = "Time: "+String(tm.Hour)+":"+String(tm.Minute)+":"+String(tm.Second);
    Serial.println ("Hour "+ String(tm.Second)+"   Koeff - " + String(day_koef));
    z_time = millis();

    current_hour = tm.Hour;
    //current_hour = tm.Second;                 //временная привязка к секундам для проверки правильности коэфф.
    if (current_hour == 8 || current_hour == 9 || current_hour == 20 || current_hour == 21) day_koef = 1;           //коэфф. для часов дня
    if (current_hour == 10 || current_hour == 11 || current_hour == 18 || current_hour == 19) day_koef = 0.75;
    if (current_hour >=12 && current_hour <=17) day_koef = 0.5;
    if ((current_hour >=0 && current_hour <=7) || current_hour == 22 || current_hour == 23) day_koef = 2;
  }
 
//------------Вычисление времени работы------------------------
if (!sliv_flag){         
  dive_freq = base_dive_freq * led_green * day_koef;
  dive_time = dive_const + base_dive_time * led_blue;   
  dive_time_down = pereliv_const + base_dive_time * led_blue;     
                         
 
//------------Работа помпы и клапанов------------------------------
  if((millis() - dive_freq_last_time) > dive_freq) {        //если время затопления наступило
    digitalWrite(9, 0);                                     //включаем помпу
    digitalWrite(10, 1);                                    //закрываем клапан
    dive_flag = 1;                                          //выставляем флаг, что помпа включена
    clapan_up_flag = 1;                                     //выставляем флаг, что клапан закрыт
    dive_freq_last_time = millis();                         //засечка для вычисления времени следующего включения помпы
    dive_time_last_time = millis();                         //засечка для вычисления премени выключения помпы
    }

  if(dive_flag && (millis()-dive_time_last_time) > dive_const){  //если помпа включена и время выключения наступило
    digitalWrite(9, 1);                                          //выключаем помпу
    dive_flag = 0;                                               //выставляем флаг, что помпа выключена
    }

  if(clapan_up_flag && (millis()-dive_time_last_time) > dive_time){       //если верхний клапан закрыт и время затопления истекло
    digitalWrite(10, 0);                                                  //открываем верхний клапан
    clapan_up_flag = 0;                                                   //выставляем флаг, что верхний клапан открыт
    digitalWrite(8, 1);                                                   //закрываем нижний клапан
    clapan_down_flag = 1;                                                 //выставляем флаг, что нижний клапан закрыт
    dive_time_down_last_time = millis();
    }

  if(clapan_down_flag && ((millis()-dive_time_down_last_time) > dive_time_down)){  //если нижний клапан закрыт и время нижнего затопления истекло
    digitalWrite(8, 0);                                                            //Открываем нижний клапан
    clapan_down_flag = 0;                                                          //выставляем флаг, что нижний клапан открыт
    }
}

//-------------------Слив----------------------------
if (sliv_flag){                                                                     
  digitalWrite(8, 0);                                                               
  digitalWrite(10, 0);
  digitalWrite(9, 1); 
  digitalWrite(5, 1);
  digitalWrite(6, 1);
  led_green_current = 0;
  led_blue_current = 0;
  led_green_flag = 0;
  led_blue_flag = 0;
  dive_freq_last_time = millis() - (float)86400000;                           // заставляем базовую программу думать, что последний полив был сутки назад
  }

//===================Интерфейс===================================

//-----------Чтение потенциометра-------------------------------
   led_green = (int)(analogRead(A3)/100) + 1; 
   led_blue = (int)(analogRead(A2)/100) + 1;   
 
//-------------Обработка кнопки и привязка-----------------------------
if((millis()-y_last_time)>200){                     
  if (digitalRead(4)){sliv_flag = 1- sliv_flag;}
  y_last_time = millis();
  }
                                                       
//-------------------Мигание диодов-------------------------
  if (!sliv_flag &&(millis()-led_green_last_time)>led_freq){
    led_green_flag = 1-led_green_flag;
    digitalWrite(5, led_green_flag);
    led_green_last_time = millis();
    led_green_current++;
    if (led_green_current > (led_green*2-1)){
      led_green_current = 0;
      led_green_last_time = millis() + (led_pause-led_freq);
      led_green_flag = 0;
      }
    }

  if (!sliv_flag &&(millis()-led_blue_last_time)>led_freq){
    led_blue_flag = 1-led_blue_flag;
    digitalWrite(6, led_blue_flag);
    led_blue_last_time = millis();
    led_blue_current++;
    if (led_blue_current > (led_blue*2-1)){
      led_blue_current = 0;
      led_blue_last_time = millis() + (led_pause-led_freq);
      led_blue_flag = 0;
      }
    }
}

Название: Re: Создание периодики на Arduino
Отправлено: Ann от 31 Июль 2016, 01:53:11
 1. Ну да, я же писал, что когда подключите клапаны, понаблюдаете, если будет необходимость, будем закрывать.
2. Почему не работают. Если хотите увидеть часы, раскомментируйте (удалите косые черты в начале) следующую строку
//String ho = "Time: "+String(tm.Hour)+":"+String(tm.Minute)+":"+String(tm.Second);
Эта строка создает строку со временем и присваивает ее переменной ho.
А следующая строка напечатает ее в мониторе порта:
Serial.println (ho);
Добавьте ее следом ниже.
Я просто убрал ее, часы мы уже проверили, работают, нет необходимости на них смотреть.

Покажите видео, как это выглядит в реале.

Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 31 Июль 2016, 09:35:26
Спасибо!
А слона то я и не заметил :)

 Вечерком отсниму. А то я на "нагрузку" не совсем подходящий резистор впаял, они еле светятся, днем не видно толком нифига... 

зы. В скетче были куски от кода форума. Долго думал что за [колор ред] нафига он нужен и почему не компилируется. :)
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 11 Август 2016, 12:12:14
AlexYalta, как там продвигается создание Вашей установки, не забросили еще идею ?
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 11 Август 2016, 12:35:35
Конечно нет. Жду посылки из Китая, с клапанами-помпами(я с запасом взял :))  вроде получилось заказать.

Мало того, еще и управление светильником нужно будет заделать :)

зы. Видео никак отснять не могу, гребенный планшет не имеет экпокорекции, нифига не видно.
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 19 Август 2016, 12:13:42
заказывал племяшку на амперке  конструктор электронный, а себе под шумок заказал дисплейчик простенький:

http://amperka.ru/product/text-lcd-8x2

думаю можно будет попробовать его применить....

2 строки по 8 символов

верхняя - ИЗ(интервал затоплений)  индикация в минутах, пробел, последние два символа индикация режима Д(день) Н (ночь) УВ(утро-вечер)
нижняя - ПЗ (продолжительность затопления) индикация в минутах, пробел, последние два символа коофицент.

в режиме промывки корней, можно написать типа "промывка корней" в две строки... 



Название: Re: Создание периодики на Arduino
Отправлено: Ann от 23 Август 2016, 20:59:04
заказывал племяшку на амперке  конструктор электронный, а себе под шумок заказал дисплейчик простенький:
Как придет, маякните, попробуем разобраться с ним.
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 07 Сентябрь 2016, 21:51:54
Начал потихоньку паять. Не нравится как работают тактовые кнопки, да и монтировать их в корпус не с руки. Решил заменить за переключатели. Придется править код. И учитывая, что я как всегда сделал все через одно место, придется освещение пихать на реле ардуины. Я взял 12v переключатели. Не думаю что он выдержит нагрузку  драйвера :(

Вижу все как,  один переключатель №1  делает то что делала тактовая кнопка, 0 стандартный(рабочий) режим, 1 принудительное затопление-промывка.  Переключатель  №2 принудительное выключение света.
Сам свет будет включен постоянно на принижении скажем 10-12 часов в сутки. Под полный цикл "активной" работы системы затопления.



Дисплей приехал, впаял его первым, были сомнения:  
// Подключаем стандартную библиотеку LiquidCrystal
#include <LiquidCrystal.h>
 
// Инициализируем объект-экран, передаём использованные
// для подключения контакты на Arduino в порядке:
// RS, E, DB4, DB5, DB6, DB7
LiquidCrystal lcd(6, 7, 3, 2, 5, 4);
 
void setup()
{
    // устанавливаем размер (количество столбцов и строк) экрана
    lcd.begin(8, 2);
    // печатаем первую строку
    lcd.print("  \xAB""\xA5""\xA7""\xA5");
    // устанавливаем курсор в колонку 0, строку 1. То есть на
    // самом деле это вторая строка, т.к. нумерация начинается с нуля
    lcd.setCursor(0, 1);
    // печатаем вторую строку
    lcd.print(" \xAA""\x4F""\x50""\xA9""\x4D");
}
 
void loop()
{}


Немного как всегда через одно место(в плане последовательности пинов). Но вписал эту последовательность в представленный скетчь, Показывает все корректно, "Чили форум" если быть точным. Хотел сфоткать но фотик на работе, завтра этим займусь.

Короче пока выходит

A5 SCL  для модуля часов
А4 SDA для модуля часов
А3 Потенциометр №1
А2 Потенциометр №2

D2-D7 дисплей.

d8 выкл №1
d9 выкл №2

D10-D13  выходы на реле.


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

по комплектухе почти все приехало, правда  гребенные китайцы отправили 3 комплекта поворотников в для мопеда, вместо клапанов, придется подождать. Помпы просто зверь машина, диоды, драйвер, блок питания на 2А 12v, все сеть. завтра забираю радиаторный профиль для светильника и термоклей, мелочевка типа, розетки,  клейники, провода, штекера , все тоже уже пришло. Думаю за выходные смогу собрать блок управления и нагрузки. Правда корпус под это пока делается, будет фанера 4мм с вентиляцией и отверстиями под все входы,  переключатели, дисплей.
 

Схемы тоже в работе, нарисую уже по факту, максимально подробно по уже работающему устройству.  

ps. даташит на дисплей:

  http://files.amperka.ru/datasheets/MT-08S2A.pdf







Название: Re: Создание периодики на Arduino
Отправлено: Ann от 08 Сентябрь 2016, 02:04:16
Не нравится как работают тактовые кнопки,
Чем именно ?

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

Цитировать
Я взял 12v переключатели. Не думаю что он выдержит нагрузку  драйвера :(
Что за переключатели ?
Если через Ардуину, то переключатель будет включать реле, а реле уже включать свет. Нагрузки на нем не будет.

Цитировать
на принижении
?

Цитировать
Дисплей приехал, впаял его первым, были сомнения:
 
В нем все символы с помощью кодов отображаются или только русские ?
Как например вывести такую строку:
T: 24.5

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

Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 08 Сентябрь 2016, 08:49:59
Кнопку монтировать в корпус не удобно.  пожалуй это главный недостаток.

переключатель вот такой http://www.chipdip.ru/product/asw-15-d-green/  Пихал его уже на макетку вместо кнопки, немного изменив код, все работает без проблем. Если на аржуину его пихать, думал именно так как вы описали, по сути он будет управлять реле. Разве что по схемотехнике непонятно, под тактовую кнопку рекомендуют ставить 10кОм резистор на землю. типа чтоб отсечь полностью сигнал, если кнопка не полностью размыкает и чутка коротит. На переключатель, думаю его пихать уже смысла нет?


На протяжении :)))


цифры, стандартные символы, и латинские буквы выводятся на прямую, ваш текст в коде выглядит так:  lcd.print("T:24.5");
кирилица кодом, расшифровка есть в даташите.


Диоды да, отпадают, при наличии дисплея смысла в них просто нет.





Название: Re: Создание периодики на Arduino
Отправлено: Ann от 08 Сентябрь 2016, 17:35:51
Подправил немного скетч. Убрал диоды и сделал отображение на дисплее наших главных переменных, которые меняем потенциометрами. Ну и тумблеры. Правил вслепую, без проверки (поленился ставить Proteus и шаманить там дисплей), проверьте, работает ли, надеюсь ничего не забыл.
Потом уже сделаем более красивое отображение данных на дисплее и тайминг лампы.

//---------Часы и Serial-----------------------
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <LiquidCrystal.h>

float z_time = 0;
tmElements_t tm;
int current_hour = 0;                         //храним текущий час
float day_koef = 1;                           //коэффициент времени дня
boolean svet_flag = 0;                        // Флаг света

//--------------Интерфейс---------------------
LiquidCrystal lcd(6, 7, 3, 2, 5, 4);
float display_last_time = 0;                        //Для засечки таймера обновления дисплея

boolean sliv_flag = 0;                        // Флаг режима слива
float y_last_time = 0;                        //Для засечки таймера дребезга кнопки

int led_green = 1;                            // Главная "зеленая" переменная, частота затоплений
int led_blue = 1;                             //Продолжительность затопления

//----------------Помпа и клапаны-------------------------
float base_dive_freq = 2000;                  //Базовый интервал между затоплениями, он затем будет умножаться на "зеленую" переменную
float dive_freq = 0;                          //Вычисленное реальное время между затоплениями. Служебная.
float dive_freq_last_time = 0;                //Засечка. Служебная

float dive_const = 1000;                       //Константа. Нужно будет замерять и занести сюда время, за которое физически наполняется труба до верха
float pereliv_const = 1000;                    //Константа. Нужно будет замерять и занести сюда время, за которое физически из верхней трубы в нижнюю переливается раствор
                                        
float base_dive_time = 200;                     //Базовый интервал для времени затопления. Мы его будем затем умножать на "желтую" переменную (led_blue)
float dive_time = 0;                            // Здесь будет уже вычисленное время продолжительности затопления. Служебная
float dive_time_last_time = 0;                  //Засечка. Служебная

float dive_time_down = 0;                       // Здесь будет уже вычисленное время продолжительности затопления для нижней трубы. Служебная
float dive_time_down_last_time = 0;             //Засечка нижней трубы. Служебная

boolean dive_flag = 0;                           //Флаг, который говорит включена помпа или нет. 1 - включена, 0 - нет.
boolean clapan_up_flag = 0;                      //Флаг, который говорит верхний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.
boolean clapan_down_flag = 0;                    //Флаг, который говорит нижний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.

//****************************************************************************************                    
//****************************************************************************************
void setup() {
  Serial.begin(9600);
  lcd.begin(8, 2);
  
  pinMode(8, INPUT);                        //Пин для тумблера режимов
  pinMode(9, INPUT);                        //Пин для тумблера света
  
  pinMode(A3, INPUT);                       //пин для потенциометра
  pinMode(A2, INPUT);                       //пин для потенциометра
  
  pinMode(11, OUTPUT);                       //пин для нижнего клапана
  pinMode(12, OUTPUT);                       //пин для реле, на которой будет помпа
  pinMode(10, OUTPUT);                      //пин для верхнего клапана
  pinMode(13, OUTPUT);                      //пин для света
}
//*****************************************************************************************
//*****************************************************************************************
void loop() {

//-----------Часы и Serial-------------------------
  if((millis() - z_time) > 1000){
    RTC.read(tm);
    //String ho = "Time: "+String(tm.Hour)+":"+String(tm.Minute)+":"+String(tm.Second);
    Serial.println ("Hour "+ String(tm.Second)+"   Koeff - " + String(day_koef));
    z_time = millis();

    current_hour = tm.Hour;
    //current_hour = tm.Second;                 //временная привязка к секундам для проверки правильности коэфф.
    if (current_hour == 8 || current_hour == 9 || current_hour == 20 || current_hour == 21) day_koef = 1;           //коэфф. для часов дня
    if (current_hour == 10 || current_hour == 11 || current_hour == 18 || current_hour == 19) day_koef = 0.75;
    if (current_hour >=12 && current_hour <=17) day_koef = 0.5;
    if ((current_hour >=0 && current_hour <=7) || current_hour == 22 || current_hour == 23) day_koef = 2;
  }
  
//------------Вычисление времени работы------------------------
if (!sliv_flag){        
  dive_freq = base_dive_freq * led_green * day_koef;
  dive_time = dive_const + base_dive_time * led_blue;  
  dive_time_down = pereliv_const + base_dive_time * led_blue;    
                          
 
//------------Работа помпы и клапанов------------------------------
  if((millis() - dive_freq_last_time) > dive_freq) {        //если время затопления наступило
    digitalWrite(12, 1);                                     //включаем помпу
    digitalWrite(10, 1);                                    //закрываем клапан
    dive_flag = 1;                                          //выставляем флаг, что помпа включена
    clapan_up_flag = 1;                                     //выставляем флаг, что клапан закрыт
    dive_freq_last_time = millis();                         //засечка для вычисления времени следующего включения помпы
    dive_time_last_time = millis();                         //засечка для вычисления премени выключения помпы
    }

  if(dive_flag && (millis()-dive_time_last_time) > dive_const){  //если помпа включена и время выключения наступило
    digitalWrite(12, 0);                                          //выключаем помпу
    dive_flag = 0;                                               //выставляем флаг, что помпа выключена
    }

  if(clapan_up_flag && (millis()-dive_time_last_time) > dive_time){       //если верхний клапан закрыт и время затопления истекло
    digitalWrite(10, 0);                                                  //открываем верхний клапан
    clapan_up_flag = 0;                                                   //выставляем флаг, что верхний клапан открыт
    digitalWrite(11, 1);                                                   //закрываем нижний клапан
    clapan_down_flag = 1;                                                 //выставляем флаг, что нижний клапан закрыт
    dive_time_down_last_time = millis();
    }

  if(clapan_down_flag && ((millis()-dive_time_down_last_time) > dive_time_down)){  //если нижний клапан закрыт и время нижнего затопления истекло
    digitalWrite(11, 0);                                                            //Открываем нижний клапан
    clapan_down_flag = 0;                                                          //выставляем флаг, что нижний клапан открыт
    }
}

//-------------------Слив----------------------------
if (sliv_flag){                                                                    
  digitalWrite(11, 0);                                                              
  digitalWrite(10, 0);
  digitalWrite(12, 0);  
  dive_freq_last_time = millis() - (float)86400000;                           // заставляем базовую программу думать, что последний полив был сутки назад
  }

//===================Интерфейс===================================

//-----------Чтение потенциометра-------------------------------
   led_green = (int)(analogRead(A3)/100) + 1;  
   led_blue = (int)(analogRead(A2)/100) + 1;  
 
//-------------Обработка тумблеров-----------------------------
if((millis()-y_last_time)>200){                    
  if (digitalRead(8)){sliv_flag = 1;}
  else {sliv_flag = 0;}
  if (digitalRead(9)){svet_flag = 1;}
  else {svet_flag = 0;}
  y_last_time = millis();
  }
                                                        
//-------------------Дисплей-------------------------
  if ((millis()-display_last_time)>500){
    lcd.setCursor(0, 0);
    lcd.print((String)led_green);
    lcd.setCursor(0, 1);
    lcd.print((String)led_blue);
    display_last_time = millis();
    }

 
}
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 08 Сентябрь 2016, 17:43:58
под тактовую кнопку рекомендуют ставить 10кОм резистор на землю. типа чтоб отсечь полностью сигнал, если кнопка не полностью размыкает и чутка коротит. На переключатель, думаю его пихать уже смысла нет?
Резистор этот (называется "подтягивающий") ставят не из-за того, что "коротит", а из-за того, что на пине могут гулять паразитные токи и чувствительная ардуина может их воспринять за сигнал. Поэтому и "подтягивают" через резистор к земле, чтобы все они в землю и уходили, и всегда по умолчанию на пине был железный ноль.
Тумблеры в этом смысле ничем не отличаются.
Но в Ардуине есть возможность подключить внутренние подтягивающие резисторы.
Для этого в методе setup добавьте пару строк:
digitalWrite(8, LOW);    
digitalWrite(9, LOW);

P.S. Там в скетче вместо смайлика         8 )               должно быть :)
  
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 08 Сентябрь 2016, 20:54:20
Понял, мне их впаять не проблема. Скетч, как только допаяю, залью проверим...

не удержался залил.  на потенциометры экран реагирует корректно  крутит от 01 до 11

зы. не корректно.  не убирает второй символ, кручу потенциометр пишет 11, далее 10, 90 80... и потом вместо 1, 10...  
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 09 Сентябрь 2016, 03:10:37
Понял, мне их впаять не проблема. Скетч, как только допаяю, залью проверим...

не удержался залил.  на потенциометры экран реагирует корректно  крутит от 01 до 11

зы. не корректно.  не убирает второй символ, кручу потенциометр пишет 11, далее 10, 90 80... и потом вместо 1, 10...  
Понятно, видимо особенность дисплея, меняет только те символы, которые необходимы для отображения строки. Если строка состоит из одного символа, то и меняет только первый символ, а второй "0" остается с отображаемой ранее "10".
Ну тогда давайте просто добавим по пробелу в конец строки, и если строка будет состоять только из одной цифры, то пробел сотрет второй, который остался от десятки.
Вот так:

    lcd.setCursor(0, 0);
    lcd.print((String)led_green + " ");
    lcd.setCursor(0, 1);
    lcd.print((String)led_blue + " ");

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

lcd.clear();
lcd.print((String)led_green);
lcd.setCursor(0, 1);
lcd.print((String)led_blue);

Попробуйте, если во втором варианте мигание не будет заметно глазу (промежуток между очисткой и выводом новых данных), то проще использовать второй, чтоб в будущем не беспокоиться о длине строк.
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 09 Сентябрь 2016, 19:50:00
Понял, спасибо! Завтра попробую.

 Забрал детальки для светильника, завтра у меня день пайки. Доделаю ардуинуку и попробую спаять светильник.....
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 10 Сентябрь 2016, 18:17:22
Допаял ардуину.  Беда печаль, спомнил что глючит 1 из четерех каналов на релейном модуле. Придется пока доводить систему без управления светильником.  

в остальном вроде все пашет нормально. Кроме часов.

экрану ваше лекарство помогло

только нужно поубирать пробелы перед и за +

    lcd.print((String)led_green+" ");
    lcd.setCursor(0, 1);
    lcd.print((String)led_blue+" ");

Тумблеры пашут исправно.  Осталось совсем немного, спаять блок нагрузки и светильник. и можно будет приступать к сборке рабочих емкостей,  и блока управления в корпусе.
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 10 Сентябрь 2016, 22:02:53
Допаял ардуину.  Беда печаль, спомнил что глючит 1 из четерех каналов на релейном модуле.
Так вроде ж причина была, что Вы ее на Tx повесили ? Или опять глючит ?

Цитировать
Кроме часов.
Там раньше я писал как выводить часы в Serial monitor

Цитировать
экрану ваше лекарство помогло
А второй вариант не моргает ?

Цитировать
только нужно поубирать пробелы перед и за +
А что, с пробелами не пашет ? Компилятор по идее реагирует только на разделители (; , {} ()), пробелы он должен игнорировать.
 
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 10 Сентябрь 2016, 22:54:36
убрал пробелы и все заработало. Видимо при выводе текста на экран пробелы все же учитываются.


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

Часы я пока не трогал особо,  Завтра поэкспериментирую с ними.

Название: Re: Создание периодики на Arduino
Отправлено: eddy от 27 Октябрь 2016, 13:16:19
"Если есть еще какие варианты по теме клапанов, предлагайте, буду признателен."


Стиральная машинка автомат источник всего необходимого. На пунктах приема чермета все нежелезное можно взять бесплатно или за пузырь.
Клапаны, помпа, датчик уровня воды пневматический кстати , датчик температуры даже тэн может прикодиться. 99,9 все исправное .
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 06 Декабрь 2016, 14:09:48
В стиралках, клапана работают только под давлением, для системы где раствор самотеком стекает в емкость хранения, они не пригодны. Нужны  те что работают без давления, типа как в кулерах для воды и тп. Позже скину ссылку какие я брал в китае.
Название: Re: Создание периодики на Arduino
Отправлено: AlexYalta от 06 Декабрь 2016, 14:11:25
К новому году, должны появиться выходные, буду продолжать сборку системы. Все необходимое приобрел, осталось только собрать.
Название: Re: Создание периодики на Arduino
Отправлено: Ouroboros от 23 Август 2017, 11:00:45
Подскажите такой вот момент. Начал задумываться о периодике, гуглю вот для начала ардуинку для этой темы. Нашел на алике вот такой лот https://ru.aliexpress.com/store/product/UNO-R3-CH340G-ATmega328P-compatible-for-Arduino-UNO-R3/1950989_32523366108.html?spm=a2g0v.12010612.0.0.47d739c1586kW
Такое исполнение подойдет для наших дел? Просто в местных интернет-магазинах оригинал (вроде как) продается вчетверо дороже. Возникает вопрос - все ли с китайским клоном норм или я что-то не вкуриваю?

Вопрос 2: что еще понадобится для обвеса ардуины в минимальном сетапе периодики? Твердотельное реле для коммутации 220в насоса либо просто 12в насос? Что-то еще?
Название: Re: Создание периодики на Arduino
Отправлено: КРОТ от 23 Август 2017, 12:57:59
1. Нет неообходимости покупать оригинал. Китай вполне подходит. Единственное отличие это дрова для связи с компом для китайских плат отдельно скачать придется.
2. Реле и насос 12 вольт тоже китайские. Там же куча датчиков к ардуине подешёвке.
 
Название: Re: Создание периодики на Arduino
Отправлено: Ouroboros от 23 Август 2017, 13:59:51
1. Нет неообходимости покупать оригинал. Китай вполне подходит. Единственное отличие это дрова для связи с компом для китайских плат отдельно скачать придется.
2. Реле и насос 12 вольт тоже китайские. Там же куча датчиков к ардуине подешёвке.
 
Реле я так понимаю нужно для комутации насоса 12в из-за того, что ардуинка юзает 5в?
Название: Re: Создание периодики на Arduino
Отправлено: kido от 23 Август 2017, 16:28:39
для начала опишите "хотелки", что ждете от того о чем "начали задумываться"
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 24 Август 2017, 11:59:36
Подскажите такой вот момент. Начал задумываться о периодике, гуглю вот для начала ардуинку для этой темы. Нашел на алике вот такой лот https://ru.aliexpress.com/store/product/UNO-R3-CH340G-ATmega328P-compatible-for-Arduino-UNO-R3/1950989_32523366108.html?spm=a2g0v.12010612.0.0.47d739c1586kW
Такое исполнение подойдет для наших дел? Просто в местных интернет-магазинах оригинал (вроде как) продается вчетверо дороже. Возникает вопрос - все ли с китайским клоном норм или я что-то не вкуриваю?

Вопрос 2: что еще понадобится для обвеса ардуины в минимальном сетапе периодики? Твердотельное реле для коммутации 220в насоса либо просто 12в насос? Что-то еще?
Для периодики в простейшем варианте (периодическое включение помпы) можно применить что угодно: от ATTINY13 за пару центов до Raspberry за 50+$.
Выбранная Вами Ардуино Уно (либо её аналог в меньшем форм-факторе Ардуино Нано) - самый оптимальный вариант по соотношению простоты и цены. Нану за 3-4 доллара не сложно найти даже в оффлайне. За оригиналом гнаться смысла нет, работают они на одинаковых микросхемах, а больше там ломаться нечему.
Можно еще глянуть в сторону Wemos D1 mini - почти то же самое, но плюс ВайФай на борту и за ту же цену. В будущем, если планируется апгрейд, позволит упростить и удешевить конструкцию устройства (весь интерфейс, т.е. отображение информации и управление, можно будет перевести в телефон или компьютер, что избавит от необходимости приобретения кнопок, энкодеров, дисплеев и т.д.). Тут уже на желания/возможности ориентироваться нужно.
Обвес зависит от выбраной (имеющейся в наличии) помпы.
Если это 220V, то я бы взял OMRON G3MB-202P (https://mysku.ru/blog/aliexpress/36014.html), очень приятная штука.
Если 12V, то: транзистор, сборка Дарлингтона (http://amperka.ru/product/uln2003-darlington-assembly), либо обычное механическое (http://zelectro.cc/Content/Uploads/72/Files/relay_module_photo.jpg). Последнее можно и для 220V, но OMRON лучше (проще подключать, не нужно тянуть питание, бесшумное, долговечное).
Название: Re: Создание периодики на Arduino
Отправлено: kido от 24 Август 2017, 13:50:51
Цитировать
Для периодики в простейшем варианте
Для периодики в простейшем варианте хватит и обычного электро-механического реле.
В сторону attiny даже  не смотрите, Уно или нано - ваше всё!
Если в программировании ни бельмеса, то про Вемос забудьте.
Твердотельное реле - супер, ну, а нет, то и обычное норм.
Название: Re: Создание периодики на Arduino
Отправлено: PowerTech от 25 Август 2017, 11:07:46
"Если есть еще какие варианты по теме клапанов, предлагайте, буду признателен."
Себе взял на пробу пару 12 вольтовых - нормально закрытые, для газов, воды, материал анодированный алюминий.
http://www.ebay.com/itm/12V-1-4-2-Ways-Normally-Closed-Pneumatic-Aluminum-Electric-Solenoid-Air-Valve-/282456619845?hash=item41c3b9fb45:g:cboAAOSw-89ZO6Cc

Есть пластиковый по дешевле, но 1/2 дюйма -
http://www.ebay.com/itm/1-12V-Electric-Solenoid-Valve-Magnetic-DC-N-C-Water-Air-Inlet-Flow-Switch-WW-/263104484695?hash=item3d423fd557:g:mhAAAOSweWVXe3yy

http://www.ebay.com/itm/Mini-2-Position-3-Way-Electric-Control-Solenoid-Valve-Gas-Air-Pump-DC-5V-6V-PYSK-/122609196665?hash=item1c8c13de79:g:BREAAOSwHwpZcBbI

На алиэкспресс не знаю, так как беру всё с ёбы.
Название: Re: Создание периодики на Arduino
Отправлено: Ouroboros от 29 Август 2017, 18:55:50
для начала опишите "хотелки", что ждете от того о чем "начали задумываться"
Хотелки - запилить свой коллайдер. Поднять сервер с рест-интерфейсом/ui и БД на, скажем, Heroku. Повесить на ардуину/вемос пяток датчиков (температура, тдс, освещенность, етц). Подключить к ней помпу для затопления  (думаю лучше взять на 12в, неохота возиться с 220). Учитывая то, что зима близко - отдельно докупить фито-светильники, и управлять ими с той же платы.
В железе - без экрана и кнопочек, все через вебъ.
Беспокоит один момент - пайка. С этим все плохо, получается жесть и уродство. Так что есть желание взять те мозги, куда в плане датчиков нужно просто повставлять в плату штекеры (тдс-метр отдельная тема).
А также чтоб в мозгах хватило портов на все датчики и реле.
Название: Re: Создание периодики на Arduino
Отправлено: Ouroboros от 11 Сентябрь 2017, 19:14:58
Подскажите такой вот момент. Начал задумываться о периодике, гуглю вот для начала ардуинку для этой темы. Нашел на алике вот такой лот https://ru.aliexpress.com/store/product/UNO-R3-CH340G-ATmega328P-compatible-for-Arduino-UNO-R3/1950989_32523366108.html?spm=a2g0v.12010612.0.0.47d739c1586kW
Такое исполнение подойдет для наших дел? Просто в местных интернет-магазинах оригинал (вроде как) продается вчетверо дороже. Возникает вопрос - все ли с китайским клоном норм или я что-то не вкуриваю?

Вопрос 2: что еще понадобится для обвеса ардуины в минимальном сетапе периодики? Твердотельное реле для коммутации 220в насоса либо просто 12в насос? Что-то еще?
Для периодики в простейшем варианте (периодическое включение помпы) можно применить что угодно: от ATTINY13 за пару центов до Raspberry за 50+$.
Выбранная Вами Ардуино Уно (либо её аналог в меньшем форм-факторе Ардуино Нано) - самый оптимальный вариант по соотношению простоты и цены. Нану за 3-4 доллара не сложно найти даже в оффлайне. За оригиналом гнаться смысла нет, работают они на одинаковых микросхемах, а больше там ломаться нечему.
Можно еще глянуть в сторону Wemos D1 mini - почти то же самое, но плюс ВайФай на борту и за ту же цену. В будущем, если планируется апгрейд, позволит упростить и удешевить конструкцию устройства (весь интерфейс, т.е. отображение информации и управление, можно будет перевести в телефон или компьютер, что избавит от необходимости приобретения кнопок, энкодеров, дисплеев и т.д.). Тут уже на желания/возможности ориентироваться нужно.
Обвес зависит от выбраной (имеющейся в наличии) помпы.
Если это 220V, то я бы взял OMRON G3MB-202P (https://mysku.ru/blog/aliexpress/36014.html), очень приятная штука.
Если 12V, то: транзистор, сборка Дарлингтона (http://amperka.ru/product/uln2003-darlington-assembly), либо обычное механическое (http://zelectro.cc/Content/Uploads/72/Files/relay_module_photo.jpg). Последнее можно и для 220V, но OMRON лучше (проще подключать, не нужно тянуть питание, бесшумное, долговечное).

По поводу реле - вот эта штука подойдет http://geekmatic.in.ua/ua/relay/modul_tverdotelnogo_rele ?
У меня уже в руках есть nodeMCU, он юзает 3.3в (хотя есть порт microUSB который подразумевает поддержку 5в). И пока что не особо понятно будет ли оно в связке из коробки работать.
На модуле реле есть 2 контакта для силовой части - тут все понятно. И есть 3 контакта для управления - 5в, земля и сигнал. И чот я пока не могу понять как с ними быть. С сигналом понятно - вешаем на какой-нибудь GPIO. На ноде есть контакт 5в - подойдет ли он для питания реле?

Почитал интернет, пишут что 5в на ней это прямиком от USB идет. Т.е. по идее вышеперечисленная схема коннекта должна работать?
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 11 Сентябрь 2017, 19:31:39
По поводу реле - вот эта штука подойдет http://geekmatic.in.ua/ua/relay/modul_tverdotelnogo_rele ?
Да, это оно. Можно без модуля взять, чистую (http://geekmatic.in.ua/ua/relay/tverdotelnoe_rele_G3MB_202P) Правда она подразумевает пайку.

У меня уже в руках есть nodeMCU, он юзает 3.3в (хотя есть порт microUSB который подразумевает поддержку 5в).
Wemos (http://geekmatic.in.ua/ua/wifi_modules/NodeMcu_ESP8266_WeMos) что ли ? В нем стоит стабилизатор LM1117, который снижает 5 вольт до 3.3 вольт, на котором работает вся логика модуля.

И пока что не особо понятно будет ли оно в связке из коробки работать.
На модуле реле есть 2 контакта для силовой части - тут все понятно. И есть 3 контакта для управления - 5в, земля и сигнал. И чот я пока не могу понять как с ними быть. С сигналом понятно - вешаем на какой-нибудь GPIO. На ноде есть контакт 5в - подойдет ли он для питания реле?
Не понял о каких 3 контактах идет речь. Это реле имеет 4 контакта, 2 силовая часть и 2 управляющая. Подаете на управляющую часть землю и 3-5 вольт - диодик во внутреннем оптроне зажегся, реле замкнуло, подали меньше 2.5 вольт - диодик потух, реле разомкнуло. Оптрон потребляет 7мА, т.е. можно управлять напрямую цифровыми выходами Wemos. Всё очень просто и удобно. У меня сейчас такое в связке с Wemos (http://geekmatic.in.ua/ua/wifi_modules/NodeMcu_ESP8266_WeMos)  работает, больше полугода, нареканий никаких, маленькое, бесшумное и долговечное. Управляю им 3.3 вольтами.
Название: Re: Создание периодики на Arduino
Отправлено: Ouroboros от 11 Сентябрь 2017, 19:43:36
Само реле - да, по 2 контакта. Но конкретно этот модуль - хз, ибо я вот здесь https://mysku.ru/blog/aliexpress/38586.html увидел вроде как тот же модуль, только с другой стороны, поэтому и подумал про 3 контакта для управления.

Wemos (http://geekmatic.in.ua/ua/wifi_modules/NodeMcu_ESP8266_WeMos) что ли ? В нем стоит стабилизатор LM1117, который снижает 5 вольт до 3.3 вольт, на котором работает вся логика модуля.
Ну почти, вот такое - http://geekmatic.in.ua/ua/NodeMcu_WIFI_ESP8266 (http://geekmatic.in.ua/ua/NodeMcu_WIFI_ESP8266)

Название: Re: Создание периодики на Arduino
Отправлено: Ann от 11 Сентябрь 2017, 19:51:18
Само реле - да, по 2 контакта. Но конкретно этот модуль - хз, ибо я вот здесь https://mysku.ru/blog/aliexpress/38586.html увидел вроде как тот же модуль, только с другой стороны, поэтому и подумал про 3 контакта для управления.
Понятно, здесь они дополнительно сделали управление через транзистор. Зачем - не понятно, реле и так управляется мизерным током 7мА, может для каких других микросхем, которые и 7мА потянуть не могут. Такое обычно делается в механических реле, там ток работы катушек не маленький.

Ну почти, вот такое - http://geekmatic.in.ua/ua/NodeMcu_WIFI_ESP8266 (http://geekmatic.in.ua/ua/NodeMcu_WIFI_ESP8266)
Ну да, почти то же самое. На плате только кучу пустых и ненужных выводов повыводили зачем-то. Маркетинг...
Название: Re: Создание периодики на Arduino
Отправлено: Ouroboros от 11 Сентябрь 2017, 19:57:13
Ну почти, вот такое - http://geekmatic.in.ua/ua/NodeMcu_WIFI_ESP8266 (http://geekmatic.in.ua/ua/NodeMcu_WIFI_ESP8266)
Ну да, почти то же самое. На плате только кучу пустых и ненужных выводов повыводили зачем-то. Маркетинг...
Для меня основным фактором было наличие microUSB для питания и отсутствие нужды паять. А маркетологи идут лесом, твари :)

Алсо, если подключу это хрень удачно для насоса, наверно еще один возьму для управления светом. Может стоило двойное сразу брать, хз
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 11 Сентябрь 2017, 20:07:56
Алсо, если подключу это хрень удачно для насоса, наверно еще один возьму для управления светом. Может стоило двойное сразу брать, хз
Да там нечему быть неудачным :D Один управляющий пин и земля. Если по скетчу чего помочь - обращайтесь.
Название: Re: Создание периодики на Arduino
Отправлено: Ouroboros от 11 Сентябрь 2017, 22:04:27
Алсо, если подключу это хрень удачно для насоса, наверно еще один возьму для управления светом. Может стоило двойное сразу брать, хз
Да там нечему быть неудачным :D Один управляющий пин и земля. Если по скетчу чего помочь - обращайтесь.
Та основы я уже вгрузил - коннекшн к wi-fi отправку тестовых данных на сервер. И конкретно тормознул на вопросе старта двух разных джоб (1- опрос датчиков с отсылкой на сервер, 2 - старт/стоп насоса) с разными кронами. Неохота руками писать свой собственный таймер/scheduler. Видать придется юзать прошивку nodeMCU.
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 11 Сентябрь 2017, 22:24:55
Та основы я уже вгрузил - коннекшн к wi-fi отправку тестовых данных на сервер. И конкретно тормознул на вопросе старта двух разных джоб (1- опрос датчиков с отсылкой на сервер, 2 - старт/стоп насоса) с разными кронами. Неохота руками писать свой собственный таймер/scheduler. Видать придется юзать прошивку nodeMCU.
Вот куски моего кода отвечающего за помпу


#define D0 16  //TDS
#define D1 5   //SCL
#define D2 4   //SDA
#define D3 0   
#define D4 2   //LED помпа
#define D5 14  // 3 реле
#define D6 12  // DHT
#define D7 13  // 2 реле
#define D8 15  // 1 реле
#define TX 1
#define RX 3

//--------------------Pompa----------------------------
long freq=60; //периодичность включения в минутах
long dlit=5;   //длительность работы в минутах
long freq_last_time;
boolean flag_pompa=false;

//********************SETUP*********************************************************
void setup(void){
        pinMode(D4, OUTPUT);
}

//**********************LOOP**************************************************************
void loop(void){
      Pompa();
}

//----------Помпа-------------------------------------------------
void Pompa(){
  if(  (millis()-freq_last_time)>(freq*60000) && !flag_pompa ){
     digitalWrite(D4, HIGH);
     flag_pompa=true;
     freq_last_time=millis();
    }
  if(  (millis()-freq_last_time)>(dlit*60000) && flag_pompa ){
     digitalWrite(D4, LOW);
     flag_pompa=false;
    }
  }


По датчикам смотреть нужно, на каждый датчик свой подход.
Название: Re: Создание периодики на Arduino
Отправлено: vadkoff от 11 Сентябрь 2017, 22:45:16
Вы слушайте-слушайте и внемлите информацию от Ann, он за бутылку, правда хорошую, сам того не зная, забабахал автоматику на аквариумное освещение с рассветами и закатами; не стесняйтесь, он сумасшедший  :D
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 11 Сентябрь 2017, 22:52:12
Вы слушайте-слушайте и внемлите информацию от Ann, он за бутылку, правда хорошую, сам того не зная, забабахал автоматику на аквариумное освещение с рассветами и закатами; не стесняйтесь, он сумасшедший  :D
Ну, не без этого, конечно, бабахи были, куда ж без них  :D

Название: Re: Создание периодики на Arduino
Отправлено: Ouroboros от 12 Сентябрь 2017, 18:58:05
Та основы я уже вгрузил - коннекшн к wi-fi отправку тестовых данных на сервер. И конкретно тормознул на вопросе старта двух разных джоб (1- опрос датчиков с отсылкой на сервер, 2 - старт/стоп насоса) с разными кронами. Неохота руками писать свой собственный таймер/scheduler. Видать придется юзать прошивку nodeMCU.
Вот куски моего кода отвечающего за помпу


#define D0 16  //TDS
#define D1 5   //SCL
#define D2 4   //SDA
#define D3 0   
#define D4 2   //LED помпа
#define D5 14  // 3 реле
#define D6 12  // DHT
#define D7 13  // 2 реле
#define D8 15  // 1 реле
#define TX 1
#define RX 3

//--------------------Pompa----------------------------
long freq=60; //периодичность включения в минутах
long dlit=5;   //длительность работы в минутах
long freq_last_time;
boolean flag_pompa=false;

//********************SETUP*********************************************************
void setup(void){
        pinMode(D4, OUTPUT);
}

//**********************LOOP**************************************************************
void loop(void){
      Pompa();
}

//----------Помпа-------------------------------------------------
void Pompa(){
  if(  (millis()-freq_last_time)>(freq*60000) && !flag_pompa ){
     digitalWrite(D4, HIGH);
     flag_pompa=true;
     freq_last_time=millis();
    }
  if(  (millis()-freq_last_time)>(dlit*60000) && flag_pompa ){
     digitalWrite(D4, LOW);
     flag_pompa=false;
    }
  }


По датчикам смотреть нужно, на каждый датчик свой подход.
Интересно. Я правда хотел сделать привязку именно к часам, но то такое. Перфекционизм, ёпт.

Есть вопросы по поводу датчиков. Присматриваюсь к DHT-22 & HC-SR04 (для определения уровня компота в емкости). По первому - в том же магазе есть датчик, а есть типа модуль с этим же датчиком "с подтягивающим резистором" - оно вообще надо?
По датчику расстояния я пока вообще хз, какой-то он стремный.
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 12 Сентябрь 2017, 19:32:50
Интересно. Я правда хотел сделать привязку именно к часам, но то такое. Перфекционизм, ёпт.
Да можно и по часам, в чем проблема. Можно использовать внутренний таймер (есть минус, при включении нужно выставлять время и при выключении сбиваются, либо делать синхронизацию по интернету) либо купить модуль часов (http://geekmatic.in.ua/ua/modules/Clock_Module_DS3231SN).
Есть вопросы по поводу датчиков. Присматриваюсь к DHT-22 & HC-SR04 (для определения уровня компота в емкости). По первому - в том же магазе есть датчик, а есть типа модуль с этим же датчиком "с подтягивающим резистором" - оно вообще надо?
По датчику расстояния я пока вообще хз, какой-то он стремный.
Подтягивающий резистор нужен обязательно, это его схема включения по даташиту, поэтому если проблема с пайкой, лучше купить уже с ним.
HC-SR04 у меня работал пару месяцев. Понравился, на удивление точный и легко программируется. Да и крайне полезная штука, когда летом взрослые расстения начинают глушить по 3+ литра в сутки, очень помогает не забывать подливать раствор.
Название: Re: Создание периодики на Arduino
Отправлено: Ouroboros от 11 Октябрь 2017, 14:17:26
Вылезла проблема. Засетапил бета-версию, вроде даже работает. Правда пока не все датчики вкрутил и с тдс-метром из вилки пока не разобрался (нужен ман от Ann). Еспшка шлет данные с датчиков в админку каждые 5 минут и вроде бы все работает. Но стоит ей побегать сутки и чуть-чуть, начинается фигня какая-то: есп пытается слать репорт каждые 5 минут, а на хост данные приходят каждые 20, т.е. по дороге ~ 3 из 4 репортов теряются.
В консольке есп, куда выкидывается всякий дебаг, я вижу что отсылка данных нормально триггерится каждые 5 минут (т.е. проблема не внутреннего таймера/кривых рук работы со временем), а вот коннекшн установить не может.
Появилась мысля, что падает хост, но нет. В то время, когда есп не может законнектится, руками заходишь - и работает.
Думал было еспшка теряет соединение wifi - но если бы она его теряла, плата бы просто уходила в тотальное радиомолчание, а она, скотина, просто не может приконнектится в 75% случаев.
const char* host = "...smth...";
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host.port)) {
    serial.println("Cant connect");
}
WiFi инициализируется в режиме WIFI_STA.
Перед каждой отправкой чекаем статус коннекта вайфая, если не WL_CONNECTED то переподключаемся - это попытка пофиксить возможный отвал вайфая, но не помогло.
Название: Re: Создание периодики на Arduino
Отправлено: PowerTech от 11 Октябрь 2017, 14:25:18
У себя подобное наблюдал при нестабильном/грязном питании esp(помогает электролит по питанию), также редко наблюдаю что рутер не справляется, у меня 20+ устройств онлайн.
Название: Re: Создание периодики на Arduino
Отправлено: Ouroboros от 11 Октябрь 2017, 15:02:54
У себя подобное наблюдал при нестабильном/грязном питании esp(помогает электролит по питанию), также редко наблюдаю что рутер не справляется, у меня 20+ устройств онлайн.
Да как бы хз, питание/железо сразу бы морочило голову, имхо. А тут только через сутки, а переподключил - снова работает как часы. Не покидает стойкое чувство, что это софтовая/прошивковая проблема. Мож flush() какой-то не делаю там, где его делать стоило бы.
В любом случае питание идет по юсб от стационарника, попробую воткнуть в зарядку для смарта и в розетку. Посмотрим что изменится от смены железа питания.
И наверное надо в дебаг сделать вывод всей-всей вайфай-релейтед инфы при каждой отправке данных.
Как вариант возможно стоит подумать чтобы еспшка себя ребутала раз в сутки (ну самый крайний вариант)
Название: Re: Создание периодики на Arduino
Отправлено: Ann от 11 Октябрь 2017, 16:02:04
Проблемы с подключением и у меня были и я их так и не решил окончательно.
Вначале даже ставил ватчдог (принудительный ребут в случае неудачной отправки двух пакетов подряд).
Потом просто сделал переподключение в случае неудачной отправки. И 1-2 раза в сутки такие переподключения случаются. В принципе не критично, поэтому не стал заморачиваться дальнейшим выяснением, списал всё на роутер, он у меня старичок.

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

По ТДС-метру.
Там есть два варианта: один простейший (через делитель напряжения на аналоговый порт), второй по науке - переменное напряжение на электродах частотой 1кГц. У меня первый, по нему могу помочь.