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

dimon8519
Offline
Зарегистрирован: 22.02.2016

Здраствуйте немогли Вы сказать номер поста или скиуть код (если есть такой)

где использавон один канал полива и 2 строчный дисплей.

а то замучился искать. спасибо.

dimon8519
Offline
Зарегистрирован: 22.02.2016

все нашел в 42 пост походу последняя с 2 строчным дисплеем

я блин с конца искал

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

dimon8519 пишет:

Здраствуйте немогли Вы сказать номер поста или скиуть код (если есть такой)

где использавон один канал полива и 2 строчный дисплей.

а то замучился искать. спасибо.

Извини дорогой - телепаты все в отпуске %(

КАКОЙ дисплей? А что значит "КАНАЛ ПОЛИВА" ?

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

С праздиком всех!

dimon8519
Offline
Зарегистрирован: 22.02.2016

спасибо за ответ 

дисплей 16*02 

канал полива у автора их 4 мне нужен один.

сори ошибся у автора называется: 1 линия полива 

нашел в 42 посте на 2 строчный дисплей но там нет (как я понял) автоматического полива только автомат на заполнения бака 

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

1)мне нужно регулировка температуры и 

2)автоматический полив по времени и по датчику влажности для начала 

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

dimon8519 пишет:
спасибо за ответ 

дисплей 16*02

Есть куча готовых библиотек. Просто я не покупал эту железку - и не проверял.

dimon8519 пишет:
канал полива у автора их 4 мне нужен один.

сори ошибся у автора называется: 1 линия полива 

нашел в 42 посте на 2 строчный дисплей но там нет (как я понял) автоматического полива только автомат на заполнения бака

Не совсем понял. Причем линии полива к индикатору?

Я когда лепил свой проект - я его поделил отдельно на блоки

- индикатор

- клавиатура

- ТМ-считыватель

- работа с еепром

- ну и далее.

Потом просто делал отдельные скетчи на каждый блок.

Потом собрал в кучу.

dimon8519 пишет:
к сожелению не умею програмировать сам давно уже написал.

Ну так учись! Ничего сложного! Поверь!

dimon8519 пишет:
1)мне нужно регулировка температуры и 

2)автоматический полив по времени и по датчику влажности для начала 

Гугль, форум, поиск.... Чтение основ - Керниган и Ритчи, Кнут...... И все получится!

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

at0mix пишет:

Гугль, форум, поиск.... Чтение основ - Керниган и Ритчи, Кнут...... И все получится!

А я бы добавил Норберта Винера ;)))
Все-таки, кагбе он основоположник кибернетики и искуственного интеллекта.
Который ТУТ нам нужен!

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Jaar пишет:

Вопрос адресован Вам и dachniku

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

З.Ы. Сегодня добавил управление по Wi-Fi, пока первую версию, примитивную: https://www.forumhouse.ru/threads/341712/page-51#post-15167980

А конкретно по железкам - так уйма их разных. Вкратце если: DS18B20, DHT22, Neoway M590, DS3231, ESP8266, BH1750, DHT11, любые модули реле, включаемые по низкому уровню - это то, что сейчас поддерживается из железок в моей прошивке. Остальное, типа э/м клапанов и приводов окон - идёт уже после реле, и для прошивки вообще неважно. В общем, работа потихоньку идёт, если что - пишите в форум по второй ссылке, я там чаще бываю.

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

dimon8519
Offline
Зарегистрирован: 22.02.2016

DIYMan пишет:

Jaar пишет:

Вопрос адресован Вам и dachniku

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

З.Ы. Сегодня добавил управление по Wi-Fi, пока первую версию, примитивную: https://www.forumhouse.ru/threads/341712/page-51#post-15167980

А конкретно по железкам - так уйма их разных. Вкратце если: DS18B20, DHT22, Neoway M590, DS3231, ESP8266, BH1750, DHT11, любые модули реле, включаемые по низкому уровню - это то, что сейчас поддерживается из железок в моей прошивке. Остальное, типа э/м клапанов и приводов окон - идёт уже после реле, и для прошивки вообще неважно. В общем, работа потихоньку идёт, если что - пишите в форум по второй ссылке, я там чаще бываю.

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

 

как я понял в ардуино УНО ваш проэкт не влезит?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

dimon8519 пишет:

 

как я понял в ардуино УНО ваш проэкт не влезит?

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

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

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

dimon8519 пишет:

как я понял в ардуино УНО ваш проэкт не влезит?

 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Олег М. пишет:

Как я понял, проблема корректного дистанционного измерения влажности почвы в долговременной перспективе так и не решена?

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

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

Самопальный тензиометр можно по простому "прикрутить" к ардуино с помощью датчика MPX5050DP
http://ru.aliexpress.com/af/MPX5050DP.html?ltype=wholesale&d=y&origin=n&...
В 800р. можно уложиться. Из достоинств - на концентрацию солей не реагирует.

Для информации... есть ещё датчики влажности почвы. Дорогущие ... а толку...  http://www.greentalk.ru/topic/3538-rastvornyj-uzel-dlya-nebolshih-teplitc/page-12#entry42635

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

Pyotr пишет:

Олег М. пишет:
Как я понял, проблема корректного дистанционного измерения влажности почвы в долговременной перспективе так и не решена?

...

А вы пробовали смотреть сюда?

Самопальный тензиометр можно по простому "прикрутить" к ардуино с помощью датчика MPX5050DP
...

...

Для информации... есть ещё датчики влажности почвы. Дорогущие ... а толку...  http://www.greentalk.ru/topic/3538-rastvornyj-uzel-dlya-nebolshih-teplitc/page-12#entry42635

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

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

Vad33
Vad33 аватар
Offline
Зарегистрирован: 02.06.2015

Еще один "велосипед"

для теплицы. :)

Из того что планируется:

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

часы датчик уровня, ЖК экран, датчик освещенности, 2 датчика влажности, вместо кнопок энкодер(но можно и три кнопки).

Для возможности обмена можно подключать что ни будь коммуникационное по UART, типа RS485.

Пока продумана только схема и печатная плата.

Все будет крутится на Nano.

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

Vad33 пишет:

Еще один "велосипед"

для теплицы. :)

 

Из того что планируется:

2 -датчика температуры ( возможно увеличичить) форточка,

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

Vad33
Vad33 аватар
Offline
Зарегистрирован: 02.06.2015

Чтобы у рядового пользователя проблем было меньше.

Kintar0
Offline
Зарегистрирован: 07.12.2015

Vad33 пишет:

Еще один "велосипед"

для теплицы. :)

 

это в планах, или уже крутится такая штуковина на железе???

bwn
Offline
Зарегистрирован: 25.08.2014

Vad33 пишет:
Чтобы у рядового пользователя проблем было меньше.

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

Vad33
Vad33 аватар
Offline
Зарегистрирован: 02.06.2015

Цитата:

это в планах, или уже крутится такая штуковина на железе???

Именно такая - нет. Это компиляция предыдущих вещей.

 

bwn пишет:

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

 

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

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

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

Vad33 пишет:

bwn пишет:

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

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

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

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

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Pyotr пишет:

...
Самопальный тензиометр можно по простому "прикрутить" к ардуино с помощью датчика MPX5050DP
http://ru.aliexpress.com/af/MPX5050DP.html?ltype=wholesale&d=y&origin=n&...
В 800р. можно уложиться. Из достоинств - на концентрацию солей не реагирует.

...

Почитал немного про тензиометры и заказал на Али MPX5100 с бОльшим диапазоном и керамические наконечники. Сами голые датчики стоят чуть меньше 800 р, но к ним нужна обвязка и руки.

 

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Probelzaelo пишет:

...

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

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


Что-то подсказывает мне, что чисто карбоновые "прутки" применяются в электросварке и обычных карандашах Koh-i-Noor и "Конструктор ТМ".
А про удочки корректнее говорить "угле+пластиковые". Угля там мало будет, да еще нечестные производители частенько вместо угля стекло кладут и маскируют его под уголь. Сам лично знавал такого.
Поэтому прежде, чем использовать "карбон", оцените хотя-бы приблизительно его электропроводность.

Как то так.
 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Олег М. пишет:

Почитал немного про тензиометры и заказал на Али MPX5100 с бОльшим диапазоном и керамические наконечники. Сами голые датчики стоят чуть меньше 800 р, но к ним нужна обвязка и руки.

Керамические наконечники брал в ЛеруаМерлен около 15-20 р/шт.
Данный датчик давления уже содержит усилитель с термокомпенсацией, поэтому дорогой.
Есть без усилителя -- в несколько раз дешевле. К таким ОУ надо "прикручивать".

А вообще есть задумка сделать  супердатчик:)

Alex-t1987
Offline
Зарегистрирован: 26.02.2016

ДОБРОВО ВРЕМЕНИ СУТОК DACHNIK. у меня давноесть задумки на автоматизацию теплички много есть компонентов но с програьированием невлодах. Если вам скинуть все что я хочу и материалы которые имеются в наличии смогли бы вы уделить мне время и помочь с кодом. НЕ безвоздмездно. 

С УВАЖЕНИЕМ от Alex-t1987

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

Кидай что есть на johny_stu@bk.ru

Maximus71
Offline
Зарегистрирован: 16.03.2016

Добрый день, коллеги! Задумался над автоматизацией проветривания теплицы. В электронике и программированиии разберусь самостоятельно. Есть вопрос по механике исполнительного механизма открывания/закрывания форточек.

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

Допустим, есть шпилька с резьбой M6. (Диаметр 6 мм, шаг резьбы 1 мм). Моторчик 28BYJ-48  (максимальный момент по паспорту 34 мН*м).

Я понимаю так, что на шпильке будет усилие 0.034 (Н*м)/0.003 (м) = 11.3 (Н). 

Это вроде правильно. Далее вращение шпильки преобразуется в поступательное движение гайки. При этом за один оборот вала точка на резьбе шпильки проходит Pi*D = 3.14 * 6 (мм)=18.8 (мм), а гайка подвинется на 1 мм. Как я понимаю, по закону сохранения усилие на этой гайке будет в 18.8 раз выше, т.е. 11.3 Н *18.8 = 213 Н.

Т.е. с учетом потерь на трение и т.п. такая система может поднимать груз 20 кг? Я правильно понимаю?

Просто моторчики такие у меня уже есть. Хочется понимать, подходят ли они для моих задач. 

Vad33
Vad33 аватар
Offline
Зарегистрирован: 02.06.2015

Maximus71 пишет:

Добрый день, коллеги! Задумался над автоматизацией проветривания теплицы. В электронике и программированиии разберусь самостоятельно. Есть вопрос по механике исполнительного механизма открывания/закрывания форточек.

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

Допустим, есть шпилька с резьбой M6. (Диаметр 6 мм, шаг резьбы 1 мм). Моторчик 28BYJ-48  (максимальный момент по паспорту 34 мН*м).

Я понимаю так, что на шпильке будет усилие 0.034 (Н*м)/0.003 (м) = 11.3 (Н). 

Это вроде правильно. Далее вращение шпильки преобразуется в поступательное движение гайки. При этом за один оборот вала точка на резьбе шпильки проходит Pi*D = 3.14 * 6 (мм)=18.8 (мм), а гайка подвинется на 1 мм. Как я понимаю, по закону сохранения усилие на этой гайке будет в 18.8 раз выше, т.е. 11.3 Н *18.8 = 213 Н.

Т.е. с учетом потерь на трение и т.п. такая система может поднимать груз 20 кг? Я правильно понимаю?

Просто моторчики такие у меня уже есть. Хочется понимать, подходят ли они для моих задач. 

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

и трение сведено к минимуму.

Кроме этого, посчитайте сколько времени ваша система будет перемещать гайку скажем на пол-метра?

Maximus71
Offline
Зарегистрирован: 16.03.2016

Vad33 пишет:
сколько времени ваша система будет перемещать гайку скажем на пол-метра?
Этот мотор делает 1 оборот за 2 секунды. Тогда полметра гайка пройдёт за 17 минут. Долго, конечно. Но в принципе приемлемо. Просто дело в том, что для поворота форточки на 90°, в зависимости от плеча рычага, гайке будет достаточно пройти не полметра, а, например 10 см... или 5 см. А это уже меньше 2 минут. Насколько короткое плечо я могу применить зависит от усилия на гайке, которое я и хочу узнать. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Maximus71 пишет:

Моторчик 28BYJ-48  (максимальный момент по паспорту 34 мН*м).

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

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

Так что если учесть все эти требования, то указанный моторчик - годится только для опытов, и только в стерильных домашних условиях. Имхо, конечно - никто вам не запрещает пользовать его где угодно, я лишь высказал своё мнение ;) А то опять сейчас набегут ораторы и будут верещать "DIYMan - вам бы только загнобить!". Нет, не загнобить - а заставить задуматься. Потому как не получится за три копейки сделать серьёзную вещь, как ни крути.

 

 

 

Andrey12
Andrey12 аватар
Онлайн
Зарегистрирован: 26.12.2014

DIYMan пишет:

Мотор просто ни о чём, сразу говорю. 

Про 28BYJ-48 полностью согласен, вы его разберите, все шестерни пластик, очень тонкие.

Как вариант купить что то из этого там есть с редукторами понижающими обороты можно и 30RPM найти можно и 1000RPM. Можно их будет упаковать в термоусадку, то есть защитить от влаги и пыли.

Maximus71 Шпилька М6 тоже как бы ни о чем. Тоже делаю подобную конструкцию, у меня шпилька М16. Двигатель подберу . В наличии пока есть на 60RPM  и на 120RPM.

Если ставить 60RPM то 1 оборот 2мм хода, то есть в минуту 120мм хода. У меня ход максимум 450 мм  то есть полное открываение / закрывание ~4 минуты.

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

Maximus71
Offline
Зарегистрирован: 16.03.2016

DIYMan пишет:
Вы забываете многие вещи: вес фрамуги, рычаг, ветровая нагрузка 
С чего Вы взяли? Нет, ничего из этого я не забыл. Меня пока интересует так сказать теория вопроса. Правильно ли я понял, что если крутить шпильку М6 моментом 0,034 Н*м, то гайка будет тянуть с силой 213 Н ? (трение на резьбе не учитываем).

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

Про пылевлагозащиту двигателя тоже понятно.

DIYMan пишет:
никто вам не запрещает пользовать его где угодно, я лишь высказал своё мнение ;)
Спасибо!

 

Maximus71
Offline
Зарегистрирован: 16.03.2016

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

Andrey12 пишет:
Шпилька М6 тоже как бы ни о чем. Тоже делаю подобную конструкцию, у меня шпилька М16.
А вот тут не согласен. М6 вполне нормальная шпилька.

Andrey12
Andrey12 аватар
Онлайн
Зарегистрирован: 26.12.2014

Maximus71 пишет:

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

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

Maximus71 пишет:

Andrey12 пишет:
Шпилька М6 тоже как бы ни о чем. Тоже делаю подобную конструкцию, у меня шпилька М16.
А вот тут не согласен. М6 вполне нормальная шпилька.

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

Maximus71
Offline
Зарегистрирован: 16.03.2016

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

Возьмем двигатель по Вашей ссылке (120 rpm, 2.5 кг*см). Если я правильно понимаю, то он с Вашей шпилькой (М16 шаг 2мм) сможет поднимать груз максимум 78,5 кг со скоростью 24 см/мин. Этот же двигатель с моей шпилькой (М6 шаг 1мм) смог бы поднимать уже 157 кг, но со скоростью 12 см/мин.

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

ВН
Онлайн
Зарегистрирован: 25.02.2016

Maximus71 пишет:
Этот же двигатель с моей шпилькой (М6 шаг 1мм) смог бы поднимать уже 157 кг, но со скоростью 12 см/мин.

формально там и момент возрастает более чем в 2 раза.

Но дело в том, чтобы эта шпилька не изогнулась, т.к. тогда крайне проблемно рассчитать, какие дополнительные нагрузки возникнут. То народ и имеет в виду, когда говорит, что М6 слаба. 

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

moty79
Offline
Зарегистрирован: 17.03.2016
Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

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

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


Не только кинематику, а еще, ИМХО, на устойчивость при сжимающих усилиях проверить, если шпилька длинная.

Лёвчег
Offline
Зарегистрирован: 07.02.2016

Приветствую народ.

Помогите кому не трудно. Никак не выходит запилить датчик влажности почвы в скетч.

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


#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
int relay = 3;  //Питание на датчик влажности пином 3
int open_motor = 8; //открыть актуатор пином 8
int close_motor = 9; //закрыть актуатор пином 9
int del_time = 12; //задержка открытия закрытия
int t_max = 30; //Верхний предел температуры при котором открывается форточка
int t_min = 25; //Нижний предел температуры при котором закрывается форточка
/*
const int min_level = 5; //пин датчика нижнего уровня воды
const int max_level = 6; //пин датчика верхенго уровня воды
const int nasos = 3; // пин насоса
int min_water_level_sensor_state = 1;
int max_water_level_sensor_state = 1;
*/

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


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

#define DHTPIN 4 //пин датчика дхт
#define DHTTYPE DHT11 // тип датчика дхт
//#define DHTTYPE DHT22 // тип датчика дхт (ИЗ ОРИГЕНАЛЬНОГО СКЕТЧА)
// Setup a oneWire instance to communicate with any OneWire devices 
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);


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

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

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

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


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

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


Serial.print("Temp_out: ");
Serial.print(t_out);
Serial.print("Temp_in: ");
Serial.print(t);
Serial.print("Hum: ");
Serial.print(h);
Serial.print("\n");
//Serial.print("min_level=");
//Serial.print(min_water_level_sensor_state);
//Serial.print("Max_level");
//Serial.print(max_water_level_sensor_state);



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

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

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

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


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

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

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

}

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

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

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

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

}

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

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

void start_relay() //автополив  ТУТ РАЗОБРАТЬСЯ 
{                             //ТУТ РАЗОБРАТЬСЯ
  digitalWrite(relay, HIGH);  //ТУТ РАЗОБРАТЬСЯ
  delay(8000);                //ТУТ РАЗОБРАТЬСЯ
  digitalWrite(relay, LOW);   //ТУТ РАЗОБРАТЬСЯ
  delay(8000);                //ТУТ РАЗОБРАТЬСЯ
}


/*void start_nasos() //прототип автонаполнения бочки наполнения 
{
  min_water_level_sensor_state = digitalRead(min_level);
  max_water_level_sensor_state = digitalRead(max_level);
  
  if (min_water_level_sensor_state == LOW) {
    digitalWrite(nasos, HIGH);} 

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

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

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

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


}

И такой вопрос. Можно ли сделать, чтоб температуру на открывание он брал ДХТ 11? А то далосы хрен знает когда придут. 

Vad33
Vad33 аватар
Offline
Зарегистрирован: 02.06.2015

Лёвчег пишет:

Приветствую народ.

Помогите кому не трудно. Никак не выходит запилить датчик влажности почвы в скетч.

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

.........

И такой вопрос. Можно ли сделать, чтоб температуру на открывание он брал ДХТ 11? А то далосы хрен знает когда придут. 

Так нет же входа датчика влажности почвы и задержки на 3 часа или подключенных часов реального времени.

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

Лёвчег
Offline
Зарегистрирован: 07.02.2016

Так я знаю, что нет входа датчика влажности. Я хотел по простому его подключить. Датчик сам может включать и выключать реле полива и без ардуины. Нужен алгоритм включения на короткое время. Мне так проще. Я в програмирование не силён. По этому хотел реализовать всё на схеме. 

Задержку хотел сделать по 


 void start_relay() //автополив  ТУТ РАЗОБРАТЬСЯ
195
{                             //ТУТ РАЗОБРАТЬСЯ
196
  digitalWrite(relay, HIGH);  //ТУТ РАЗОБРАТЬСЯ
197
  delay(8000);                //ТУТ РАЗОБРАТЬСЯ
198
  digitalWrite(relay, LOW);   //ТУТ РАЗОБРАТЬСЯ
199
  delay(8000);                //ТУТ РАЗОБРАТЬСЯ
200
}
201
 

Это тестовый режим по 8 секунд. В планах было поставить Включать на 1.5 минуты раз в 3 часа. Ну или подобрать более точно опытным путем.

 

Vad33
Vad33 аватар
Offline
Зарегистрирован: 02.06.2015

Лёвчег пишет:

Так я знаю, что нет входа датчика влажности. Я хотел по простому его подключить. Датчик сам может включать и выключать реле полива и без ардуины. Нужен алгоритм включения на короткое время. Мне так проще. Я в програмирование не силён. По этому хотел реализовать всё на схеме. 

Задержку хотел сделать по 


 void start_relay() //автополив  ТУТ РАЗОБРАТЬСЯ
195
{                             //ТУТ РАЗОБРАТЬСЯ
196
  digitalWrite(relay, HIGH);  //ТУТ РАЗОБРАТЬСЯ
197
  delay(8000);                //ТУТ РАЗОБРАТЬСЯ
198
  digitalWrite(relay, LOW);   //ТУТ РАЗОБРАТЬСЯ
199
  delay(8000);                //ТУТ РАЗОБРАТЬСЯ
200
}
201
 

Это тестовый режим по 8 секунд. В планах было поставить Включать на 1.5 минуты раз в 3 часа. Ну или подобрать более точно опытным путем.

Получается relay это насос полива? И он каждые 8 сек включается и выключается?

KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016
[code]


 /*                                             
 ************************************************************************************************************************
 *        LCD         |  Датчик температуры   | Влажности почвы |     Джойстик      | Концевые выкючатели |     Pеле    *
 ************************************************************************************************************************   
 * GND          GND   |      "-"      GND     |  "-"      GND   |   GND        GND  |  SENSOR_OPEN    D3  |  OPEN  D12  * 
 * VCC          +5    |      "+"      +5      |  "+"      +5    |   +5V        5V   |  SENSOR_CLOSE   D4  |  CLOSE D11  *
 * SDA          А4    |       S       D5      |   S       A3    |   VRx        A0   |                     |  WATER D10  * 
 * SCL          А5    |                       |                 |   VRy        A1   |                     |             *
 *                    |                       |                 |   SW         D2   |                     |             * 
 ************************************************************************************************************************
*/  
  


 #define UD A0                    // Кнопки вверх/вниз подключена к Analog 0
 #define LR A1                    // Кнопки влево/вправо подключена к Analog 1
 #define WATER_SENSOR A3          // Вход от датчика полива подключена к Analog 3 
 #define OK 2                     // Кнопка ОК подключена к Digital 2
 #define OPEN 12                  // Выход на реле ОТКРЫТИЕ подключен к Digital 12
 #define CLOSE 11                 // Выход на реле ЗАКРЫТИЕ подключен к Digital 11
 #define SENSOR_OPEN 3            // Вход от концевого ОТКРЫТИЕ подключен к Digital 3 
 #define SENSOR_CLOSE 4           // Вход от концевого ЗАКРЫТИЕ подключен к Digital 4
 #define OUT_WATER 10             // Выход на реле ПОЛИВ
 #define DHT11_PIN 5              // Датчик DHT11 подключен к Digital 5

 
  volatile int Btn_UD = 0, Btn_LR = 0,Btn_OK = 1,      // Переменные для хранения значений кнопок управления,
  Sensor_Open = 0, Sensor_Close = 0;                   //   и состояния концевых выключателей
                                     
  int sleepLCD = 10;                                   // Спяший режим LCD
  int setTmpOpen = 0,setTmpClose = 0;                  // Хранение значений уставок по температуре


                       //**___Счетчик___**//
    boolean BtnWasUp_OK = true;   // была ли кнопка отпущена?
    boolean EditEnabled = false;  // включено ли редактирование
    int OK_Click = 0;
   


 #include <Wire.h>                           // Добавляем необходимые библиотеки
 #include <dht11.h>
 #include <EEPROM2.h>                        // Заданная температура будет храниться по адресу 0 и 1
 #include <LiquidCrystal_I2C.h> 
 dht11 DHT;                                  // Объявление переменной класса dht11




byte degree[8] ={ B01110, B01010,            // Битовая маска символа градуса
                  B01110, B00000,
                  B00000, B00000,
                  B00000}; 
                 
byte up[8] =   { B00100, B01010,             // Битовая маска символа стрелка вверх  
                 B10101, B00100,
                 B00100, B00100,
                 B00100};       
              
byte dw[8] =   { B00100, B00100,             // Битовая маска символа стрелка вниз
                 B00100, B00100,
                 B10101, B01010,
                 B00100};       

LiquidCrystal_I2C lcd(0x27,16,2);            // Задаем адрес и размерность дисплея

//=================================================================================================================================================================================

void setup()
{
  pinMode(OK,INPUT_PULLUP);              // Кнопка ОК
  pinMode(OPEN, OUTPUT);                 // Выход на реле ОТКРЫТИЕ
  pinMode(CLOSE, OUTPUT);                // Выход на реле ЗАКРЫТИЕ
  pinMode(SENSOR_OPEN, INPUT);           // Вход от концевого ОТКРЫТИЕ
  pinMode(SENSOR_CLOSE, INPUT);          // Вход от концевого ЗАКРЫТИЕ
  pinMode(WATER_SENSOR, INPUT);          // Вход от датчика Влажности почвы 
  pinMode(OUT_WATER, OUTPUT);            // Выход на реле ПОЛИВ  
  pinMode(DHT11_PIN, INPUT);             // Вход от датчика температуры и влажности 
  
  pinMode(13, OUTPUT);
  digitalWrite(1, HIGH);                 // Не завис - мигаем светодиодом
  digitalWrite(2, HIGH);                 // Подключаем встроенный подтягивающий резистор 

  setTmpOpen=EEPROM_read_byte(0);        // Считывание значения уставки открытие из памяти 
  setTmpClose=EEPROM_read_byte(1);       // Считывание значения уставки закрытие из памяти
  lcd.clear();                           // очистка экрана
  lcd.init();                            // Инициализация дисплея
  lcd.backlight();                       // Включаем подсветку
  lcd.createChar(1, degree);             // Создаем символы под № 1..
  lcd.createChar(2, up);                 // ..2
  lcd.createChar(3, dw);                 // ..3
  
 // красивая "загрузка" программы при старте :)
  lcd.begin(16, 2);
  lcd.print("Loading");
  delay(500);                            // ждем 0.5 секунды
  lcd.print(".");
  delay(500);                            // ждем 0.5 секунды
  lcd.print(".");
  delay(500);                            // ждем 0.5 секунды
  lcd.print(".");
  delay(500);                            // ждем 1 секунду
  lcd.clear();
  
// Выведем на дисплей стартовое сообщение на 2 секунды
  lcd.begin(16, 2);
  lcd.setCursor(0, 0); 
  lcd.print("Temp. Controller");
  lcd.setCursor(0, 1);
  lcd.print("   v.1.0  ");
  delay(2000);
 


  // Выводим значение уставки
  lcd.begin(16, 2);
  lcd.print("Temp open ");
  lcd.setCursor(11, 0);
  lcd.print(setTmpOpen);                           // Отображение значения уставки
  lcd.print("\1C");
  lcd.setCursor(0, 1);
  lcd.print("Temp clos ");
  lcd.setCursor(11, 1);
  lcd.print(setTmpClose);                          // Отображение значения уставки 
  lcd.print("\1C");
  delay(2500);
  lcd.clear();
  lcd.begin(16, 2); 

}


void int_Delay(unsigned int Delay)                 // Задержка 
   {
   for (float i = 0; i < Delay; i++)
        delayMicroseconds(500);
   }



void loop()

 { 
  Btn_UD = analogRead(UD);                       // Считывание с аналогового входа А0
  Btn_LR = analogRead(LR);                       // Считывание с аналогового входа А1
  Sensor_Close = digitalRead(SENSOR_CLOSE);      // Считывание с цифрового входа D4
  Sensor_Open = digitalRead(SENSOR_OPEN);        // Считывание с цифрового входа D3
     
   //==================Контроль состояния работы программы=========
                 digitalWrite(13, HIGH);
                 int_Delay(1); digitalWrite(13, LOW);
   //===============================================================     
 if (((Btn_UD) > 500)|(Btn_UD < 480)|    // Проверка нажата ли
     (Btn_LR > 500)|(Btn_LR < 480)|       // какая либо из
     (Btn_OK  != 1));                     // кнопок   "Up+-/Down+-/L+-/R+-/OK"
else
 {
  sleepLCD++;                            // Таймер спящего режима LCD
  if (sleepLCD >= 14 ){                   // Контроль таймера спящего режима для LCD
  lcd.clear();                             // Очистим дисплей и 
  lcd.noBacklight();                       // выключим подсветку
  }
  //Включение реле ОТКРЫТИЕ                          
 if ((DHT.temperature) >=(setTmpOpen)&&(Sensor_Open == 0))      // Проверка уставки и состояния концевого выключателя ОТКРЫТИЕ
      digitalWrite(12, HIGH);
  else 
      digitalWrite(12, LOW);
      
  //Включение реле ЗАКРЫТИЕ
if (DHT.temperature == 0)                                       // Если ошибка чтения данных с датчика то состояние неизменно
      digitalWrite(11, LOW);
 else
if ((DHT.temperature) <= (setTmpClose)&&(Sensor_Close == 0))    // Проверка уставки и состояния концевого выключателя ЗАКРЫТИЕ 
      digitalWrite(11, HIGH);
  else 
      digitalWrite(11, LOW);      


 }
 
//                                      ** Переход в режим настройки:_OPEN **                               //
 

                                                            // Уменьшаем уставку ОТКРЫТИЕ " setTmpOpen-- "
if   ((Btn_UD < 3)&&(Btn_LR > 480)&&(Btn_LR < 520 )) 
 {
   int_Delay(50);                                           // Ускоримся :)
   lcd.backlight();                                         // Включим подсветку    
   setTmpOpen = max(setTmpOpen,1);                          // Контроль переполнения 
 
   if (sleepLCD >= 5);                                      // Если спящий режим или просмотр - то ни чего не делаем
 else                                                       //   иначе ...
  setTmpOpen--;                                             //   уменьшаем уставку. 
  EEPROM_write_byte(0, setTmpOpen);                         // Запись значения уставки в память
  lcd.setCursor(0, 0);  
  lcd.print("  Set.Temp.open");                             // Вывод на дисплей "Настройка Температуры "Открытие"
  lcd.setCursor(0,1);                                       // Переведем курсор вовторую строку
  lcd.print("    \3   ");                                   // Символ стрелкa вниз
  lcd.setCursor(6,1);
  lcd.print(setTmpOpen);                                    // Отображение значения  срабатывания реле ОТКРЫТИЕ
  lcd.print("\1C     ");                                    // Символ градуса и стираем символ стрелкa вверх
  Btn_OK = 1;                                               // И переключимся
 }
  
  

   if ((Btn_UD > 1020)&&(Btn_LR > 480)&&(Btn_LR < 520))     // Увеличиваем уставку ОТКРЫТИЕ " setTmpOpen++ "
 { 
   int_Delay(50);                                           // Ускоримся :)
   lcd.backlight();                                         // Включим подсветку    
   setTmpOpen = min(setTmpOpen,59);                         // Контроль переполнения

   if (sleepLCD >= 5);                                      // Если спящий режим или просмотр - то ни чего не делаем
 else                                                       //   иначе ...
  setTmpOpen++;                                             //   yвеличиваем уставку. 
  EEPROM_write_byte(0, setTmpOpen);                         // Запись значения уставки в память  
  lcd.setCursor(0, 0);  
  lcd.print("  Set.Temp.open");                             // Вывод на дисплей "Настройка Температуры "Открытие"
  lcd.setCursor(0,1);                                       // Переведем курсор вовторую строку
  lcd.print("       ");                                     // Стираем символ стрелкa вниз
  lcd.setCursor(6,1);
  lcd.print(setTmpOpen);                                    // Отображение значения  срабатывания реле ОТКРЫТИЕ
  lcd.print("\1C \2   ");                                   // Символ градуса и символ стрелкa вверх
  Btn_OK = 1;                                               // И переключимся
 }
 
    
//                                      ** Переход в режим настройки:_CLOSE **                                       //


if ((Btn_LR < 3)&&(Btn_UD > 480)&&(Btn_UD < 520))           // Уменьшаем уставку ЗАКРЫТИЕ " setTmpOpen-- " 
 {
   int_Delay(50);                                           // Ускоримся :)
   lcd.backlight();                                         // Включим подсветку    
   setTmpClose = max(setTmpClose,1);                        // Контроль переполнения 

   if (sleepLCD >= 5);                                      // Если спящий режим или просмотр - ни чего не делаем
 else                                                       //   иначе ... 
  setTmpClose--;                                            //   yменьшаем уставку.
  EEPROM_write_byte(1, setTmpClose);                        // Запись значения уставки в память
  lcd.setCursor(0, 0);  
  lcd.print(" Set.Temp.Close ");                            // Вывод на дисплей "Настройка Температуры "Закрытие"
  lcd.setCursor(0,1);                                       // Переведем курсор вовторую строку
  lcd.print("    \3     ");                                 // Символ стрелкa вниз
  lcd.setCursor(6,1);
  lcd.print(setTmpClose);                                   // Отображение значения  срабатывания реле ЗАКРЫТИЕ
  lcd.print("\1C   ");                                      // Символ градуса и стираем символ стрелкa вверх
  Btn_OK = 1;                                               // И переключимся                                               
 }
                                  
    
if ((Btn_LR > 1020)&&(Btn_UD > 480)&&(Btn_UD < 520))        // Увеличиваем уставку ЗАКРЫТИЕ " setTmpOpen++ "
  {
   int_Delay(50);                                           // Ускоримся :)
   lcd.backlight();                                         // Включим подсветку    
   setTmpClose = min(setTmpClose,59);                       // Контроль переполнения 
 
   if (sleepLCD >= 5);                                      // Если спящий режим или просмотр - ни чего не делаем
 else                                                       //   иначе ... 
  setTmpClose++;                                            //   yвеличиваем уставку 
  EEPROM_write_byte(1, setTmpClose);                        // Запись значения уставки в память                  
  lcd.setCursor(0, 0);  
  lcd.print(" Set.Temp.Close ");                            // Вывод на дисплей "Настройка Температуры "Закрытие"
  lcd.setCursor(0,1);                                       // Переведем курсор вовторую строку
  lcd.print("       ");                                     // Стираем символ стрелкa вниз
  lcd.setCursor(6,1);                                       // Переведем курсор 
  lcd.print(setTmpClose);                                   // Отображение значения  срабатывания реле ЗАКРЫТИЕ
  lcd.print("\1C \2     ");                                 // Символ градуса и символ стрелкa вверх
  Btn_OK = 1;                                               // И переключимся
}   


                                                                                                    
                    //** Счетчик для корректной работы кнопки ОК **//
  
                     boolean BtnIsUp_OK = digitalRead(OK);                    
                        if (BtnWasUp_OK && !BtnIsUp_OK)
                        {int_Delay(10);BtnIsUp_OK = digitalRead(OK);
                        if (!BtnIsUp_OK)
                               {OK_Click = !OK_Click; 
                       digitalWrite(OK_Click, EditEnabled);
                                }
                         }
     
                         BtnWasUp_OK = BtnIsUp_OK;                     
                        if (OK_Click == 1) 
                           {Btn_OK++;
                            OK_Click = 0;} 
                        if (Btn_OK > 2) Btn_OK = 1; 
                                                    // "Btn_OK" переменная для выбора режимов
                                                    // редактирования работает как триггер если 
                                                    // (Btn_OK > 3) то будет счетчик
    

//==================================================================================================

  
   

 if(Btn_OK == 2)  // Кнопка ОК выводит значение текущего состояния влажности и температуры.
  { 
 //                 Обнулим таймер и включим подсветку .
                           sleepLCD = 0;
                           lcd.backlight();
                           
  //                Информация о текущей температуре и влажности   
  
  lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print("Humidity =    % ");    // Выводим текст
  lcd.setCursor(11, 0);             // Переместим курсор и
  lcd.print(DHT.humidity, 1);       // выводим влажность
  lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print("Temp     =   \1C ");   // Выводим текст, "\1" - значок градуса
  lcd.setCursor(11, 1);             // Передвигаем курсор             
  lcd.print(DHT.temperature,1);     // Выведим значения температуры 
    Btn_OK = 1;                     // И переключимся
 }
 
 
//**Мониторинг ошибок**//
 int chk;                                       // Переменная текущего значения температуры 
  chk = DHT.read(DHT11_PIN);                    // Чтение данных
  switch (chk)
 {
  case DHTLIB_OK:                               // Обработка ошибки  
    break;
  case DHTLIB_ERROR_CHECKSUM:  
    lcd.clear(); 
    lcd.print("Checksum error");
    lcd.backlight();// Включим подсветку
    DHT.temperature = 0;  
    break;
  case DHTLIB_ERROR_TIMEOUT:
    lcd.clear(); 
    lcd.print("Time out error");
    lcd.backlight();// Включим подсветку
    DHT.temperature = 0;
    break;
  default:
    lcd.clear(); 
    lcd.print("Unknown error");
    lcd.backlight();// Включим подсветку
    DHT.temperature = 0;
    break; 
 
 } 
 
   int_Delay(500);// задержка для обработки данных с датчиков

  }

[/code]
//Может кому пригодится, я так реализовал управление теплицей, возможно что то необходимо оптимизтровать.
Лёвчег
Offline
Зарегистрирован: 07.02.2016

relay - это питание на датчик влажности через мосфет (специальный датчик вилка, либо две пластинки из нержавейки и транзистор)

Да, каждые 8 секунд в тестовом режиме. Потом хотел поставит 90000 и 10800000 миллисекунд.  В принципе всё работает, но он чередует циклы. Получается он проводит цикл по включению, потом в сириал скидывает.  Мне кажется, что это не нормально. 

Vad33
Vad33 аватар
Offline
Зарегистрирован: 02.06.2015

Лёвчег пишет:

relay - это питание на датчик влажности через мосфет (специальный датчик вилка, либо две пластинки из нержавейки и транзистор)

Да, каждые 8 секунд в тестовом режиме. Потом хотел поставит 90000 и 10800000 миллисекунд.  В принципе всё работает, но он чередует циклы. Получается он проводит цикл по включению, потом в сириал скидывает.  Мне кажется, что это не нормально. 

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

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

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

Но тут есть несколько моментов.

- половину времени датчик под напряжением, а значит окисляется.

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

Лёвчег
Offline
Зарегистрирован: 07.02.2016

Конечно нет. Я об этом и говорю.

Совершенно верно. Цикл можно подобрать. 

Почему половину? Я же говорю, 8 секунд это чтоб плату отладить. В рабочем образце будет допустим 90 секунд включен и 3 часа выключен. Тут принцип прост. Так как датчик и без МК может рулить реле, то от МК ножен только как таймер включения чтоб вилочка как можно менее окислялась. Допусти МК дает команду раз в 3 часа включить датчик на 1.5 минуты (если мало, тогда можно увиличить это время). Растение поливается и когда уровень влаги доходит до нужного, датчик отключает реле. Вот и всё.

Лёвчег
Offline
Зарегистрирован: 07.02.2016

[quote=KOMAPbI4]

<span style="font-size:12px;">//<strong>Может кому пригодится, я так реализовал управление теплицей, возможно что то необходимо оптимизтровать.</strong></span>

[/quote]

Во! То что мне нужно)))

Два вопроса по вашему скетчу:

Почему он не видит датчик полива?

И почему на нано 168 он непонимает джостик? Хотя я думаю, что джостик не виден из-за того, что питалова мало...

KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016

1)ах да в этой версии датчик влажности почвы я не прикрутил !2) проверяйте правильность подключения  и работоспособность джойстика

Лёвчег
Offline
Зарегистрирован: 07.02.2016

KOMAPbI4 пишет:

1)ах да в этой версии датчик влажности почвы я не прикрутил !2) проверяйте правильность подключения  и работоспособность джойстика

Я так и подумал) А будет версия с полным функционало?)

Да, и если кто будет делать из NANO, обратите внимание на стабилизатор. Если трёх ногий 1117, тогда джост работает нормально. А если как у меня непонятный пяти ногий, то скорее всего придеться ставить отдельно стаб.

KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016

Лёвчег пишет:

KOMAPbI4 пишет:

1)ах да в этой версии датчик влажности почвы я не прикрутил !2) проверяйте правильность подключения  и работоспособность джойстика

Я так и подумал) А будет версия с полным функционало?)

Да, и если кто будет делать из NANO, обратите внимание на стабилизатор. Если трёх ногий 1117, тогда джост работает нормально. А если как у меня непонятный пяти ногий, то скорее всего придеться ставить отдельно стаб.

Конечно будет только вот ардуинку с алибабайки дождусь, а то вчера моя "UNO" умерла и теперь весь процесс остановился

 

Лёвчег
Offline
Зарегистрирован: 07.02.2016

KOMAPbI4 пишет:

Конечно будет только вот ардуинку с алибабайки дождусь, а то вчера моя "UNO" умерла и теперь весь процесс остановился

 

От  чего умерла? Дабы мне не повторить подобных ошибок.

Спасибо, что делетесь своими трудами. Удачи!!!

KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016

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