измерительный сигнал нужно подавать двуполярный - синусоиду. Тогда датчик будет великолепно себя вести и не будет столь сильно деградировать. А так вы сделали ему "травилку" постоянным током = вот он у вас и вытавился.
Если не боитесь 220 вольт - то рекомендую проверенную годами вещь - электроклапан от стиральной машины...
Найти их за копейки можно в любом городе, достаточно найти тех, кто стиралки на запчасти распродает... Я за 300 рублей купил 4клапанный от Brandt - 4Wx180, с запиткой через реле
Из своего опыта выращивания томатов - их достаточно поливать по таймеру раз в неделю. Главное не лить воду сверху.
У меня в грядке, на глубине 15см, проложена ПП труба с маленьким отверстиями. Клапан открывает подачу воды на время, соответствующее "жаркости" воздуха вне парника. И этого достаточно. А ежели сверху почва замульчирована, то и "жаркостью" можно не интересоваться. Еще надо учесть, что вода постепенно забивает солями всяческие капельные трубочки. Они непрактичны без водоподготовки. А измерение влажности электродами в парнике считаю извращением - это чистые понты. Все это уже проходил:
А измерение влажности электродами в парнике считаю извращением - это чистые понты.
никаких понтов. Очень удобно. У меня, например, участок с приличным южным склоном. Подпочвенные воды очень сильно влияют на влажность почвы внутри теплицы.
С таймером мне пришлось бы играться после каждого дождика.
Если не боитесь 220 вольт - то рекомендую проверенную годами вещь - электроклапан от стиральной машины...
Найти их за копейки можно в любом городе, достаточно найти тех, кто стиралки на запчасти распродает... Я за 300 рублей купил 4клапанный от Brandt - 4Wx180, с запиткой через реле
Эти клапана рассчитаны на высокое давление, когда система на самотёке они бесполезны
А измерение влажности электродами в парнике считаю извращением - это чистые понты.
никаких понтов. Очень удобно. У меня, например, участок с приличным южным склоном. Подпочвенные воды очень сильно влияют на влажность почвы внутри теплицы.
С таймером мне пришлось бы играться после каждого дождика.
Согласен, что на открытой и возвышенной грядке влага быстрее накапливается и исчезает, но в парнике этот процесс очень инерционный даже с подпочвенными водами. Так что ритм полива в парнике от дождя мало зависит. Если затяжные дожди можно просто разрывать цепь таймера.
Я контролирую влажность только при выращивании рассады в боксе, потому что у рассады маленькие корни сильно зависят от влажности верхнего слоя почвы. А томат в парнике найдет воду ВСЕГДА-у него корни до 2хметров вглубь. А кондуктометрические датчики уровня это усложненный анахронизм по сравнению с герконом.
А можно обновленный скеч, с поливом по датчику влажности? и еще подскажите, смотрю схему на первой странице, вижу что в схеме используются сопротивления, а как узнать где и какого номинала использовать? С
А можно обновленный скеч, с поливом по датчику влажности? и еще подскажите, смотрю схему на первой странице, вижу что в схеме используются сопротивления, а как узнать где и какого номинала использовать? С
Кода пока нет, есть опробованные функции,
В ф-цию boolean drip_irrigation() в качестве аргументов передаём - (вкл или выкл полива, аналоговый пин датчика влажности земли, канал реле, мин влажность земли и макс влажность земли. функция int h_pochva(int ch) берёт аргумент из ф-ции drip_irrigation аналоговый пин.
Код на три контура полива и один насос, при включении хотя бы одного контура одновременно включается насос.
Единственное у меня датчики влажности почему то наооборот работают, у всех когда влажно у меня по этим параметрам сухо, поэтому менял команды LOW и HIGH, датчик временно сделал самодельный из медной проволоки, и подсоединил к плате к с которой шел датчик, данные брал с цифрового выхода.
Добрый день. Выложите пожалуйсто фотки как шток закреплен, и в каком положении он при закрытом окне и при открытом ну и с далека как выглядит открытое окно. Буду Вам очень благодарен.
Просто поставил себе цепной электро редуктор но он намного дороже стоит чем шток.
Добрый день. Выложите пожалуйсто фотки как шток закреплен, и в каком положении он при закрытом окне и при открытом ну и с далека как выглядит открытое окно. Буду Вам очень благодарен.
Просто поставил себе цепной электро редуктор но он намного дороже стоит чем шток.
Шток который держит актуатор? На саморезах по металу вроде ничего сложного... ну если надо фото то сделаю на выходных
Ну на фотке я так вроде расмотрел, сделайте фотки открытого и закрытого окна. А на сколько актуатор высовывается?
Длину высовывания можно регулировать колёсиками(хз как их обозвать=) ) в коробке актуатора, которые нажимают концевые выключатели. Шток актуатора вылазит примерно на 80% длинны
Вопросы для опытных банальные, но я даже в руках такие платы не держал.
Хотел бы спросить, что надо приборести для создания следующего "проекта".
Требования:
1)
2 разовый полив в определенное время, посредством открытия клапана, чтоб каждый шланг поливался одинаково. (например в 9.00 и 21.00 - независимо от влажности земли, т.к. датчик влажности установленный в одном месте - не может гарантировать что через 30 см уровень влажности будет такой же)
2)
- Открытие/закрытие 2 форточек по температуре внутри теплицы. Например чтоб при +30 градусах открылись обе форточки, при +25 одна из форточек закрывалась, при +20 закрывалась вторая форточка.
- Включение/отключение кулеров 4 шт.*120 мм на подачу воздуха, и вытягивание. (так кстати можно создать постоянный микроклимат, без открытия форточек, по крайней мере мне так кажется)
Общий вопрос по открытию дверерй/форточек, а как поступать с ситуацией, когда человек сам заходит в теплицу? Отключать привод? И насколько широко вообще открывать окно?
я планирую, открывать дверь на определенное время по нажатию кнопки (например минуту). как поеду к родителям испытаю в действии. кнопки сделаю две, одна с наружи одна внутри
я планирую, открывать дверь на определенное время по нажатию кнопки (например минуту). как поеду к родителям испытаю в действии. кнопки сделаю две, одна с наружи одна внутри
Минута это мало думаю...тут имел ввиду вопрос о том как работа автоматики будет сказываться на человеке?
Я вижу решение в том чтоб системой рычагов - отталкивать дверь, т.е. толкатель не будет соеденяться жестко с дверью.
Шток вышел - окно открылось, шток зашел - окно закрылось.
Так можно избежать ситуаций - когда дачные гости решат заглянуть посмотреть в теплицу, тем самым вырвав вю автоматику с корнем.
у меня отец приделал двигатели, которые открывали закрывали жалюзи на старой элетростанции. они идеально подошли так как и конечники есть у них, которыми настраиваешь угол открытия, как поеду к ним сфоткую, а так код простенький написал, будем пробовать все соединить вместе, как откатаю все выложу, так что я опка такой вариант для себя придумал, при их исползовании только напряжением откроешь дверь.
Добрый день. Выложите пожалуйсто фотки как шток закреплен, и в каком положении он при закрытом окне и при открытом ну и с далека как выглядит открытое окно. Буду Вам очень благодарен.
Просто поставил себе цепной электро редуктор но он намного дороже стоит чем шток.
[/quote]
Кстати в тему как открывать верхнии форточки, сфоткал на выставке домов у МЕГи:
Теперь вообще весело) При включение ардуино: включаються все релле(т.к почва сухая датчики не куда не воткнуты ), при замыкание датчиков влажности релле выключаються, но обратно включаеться только релле насоса при размыкание 3 датчика аналогово
Теперь вообще весело) При включение ардуино: включаються все релле(т.к почва сухая датчики не куда не воткнуты ), при замыкание датчиков влажности релле выключаються, но обратно включаеться только релле насоса при размыкание 3 датчика аналогово
По-идее не должно быть такого, т.к. "сухая почва" - это одно значение, а обрыв датчика - это авария и по ней реле включать не нужно. Иначе в результате обрыва - зальете все напрочь.
вставьте Serial.print(soilMoisture); и посмотрите: меняется ли результат при помещении датчика в сухую и влажную почву. Навскидку - не срабатывает условие для включения клапанов.
Не уверен, но попробуйте в 35 строке digitalWrite(relayPin, HIGH); заменить HIGT на глобальную переменную, например valveState=1; или объявленную внутри функции voidcheckSoil() static valveState=1;
Одно предложение вместо клапанов можно использовать краны с сервоприводом от системы антипротечек работают надежно, для меня это актуально бочка стоит очень низко.
Не уверен, но попробуйте в 35 строке digitalWrite(relayPin, HIGH); заменить HIGT на глобальную переменную, например valveState=1; или объявленную внутри функции voidcheckSoil() static valveState=1;
Не, так дело не пойдёт. Описывайте подробно какой датчик, как изменяется напряжение на выходе в зависимости от влажности, какие модули реле... Попытайтесь сами поправить скетч и тогда будем смотреть...
Не, так дело не пойдёт. Описывайте подробно какой датчик, как изменяется напряжение на выходе в зависимости от влажности, какие модули реле... Попытайтесь сами поправить скетч и тогда будем смотреть...
Вот так вот выглядит вся моя система. если почва влажная то релле отключаеться, но вместе с ним отключаеться и насос (даже если другие датчики говорят что сухо. если на всех датчиках сухо то насос включен, если хоть на одном любом влажно то насос выключен)
Sim, скоро серьёзные парни над нами начнут прикалываться...
По алгоритму понятно, только я бы поставил клапан на каждую зону и поливал где сухо.
Монтажная схема, что на фото мне не нужна.
Pyotr пишет:
Описывайте подробно какой датчик, как изменяется напряжение на выходе в зависимости от влажности, какие модули реле... Попытайтесь сами поправить скетч и тогда будем смотреть...
Реле на модуле включается при подаче на вход "1" или "0"??? Своими словами или ссылку на схему модуля.
При увеличении влажности почвы напряжение на выходе модуля датчика влажности увеличивается или уменьшается?? Своими словами или ссылку на схему модуля.
Ну если своими словами то при подаже - (gnd) релле включаеться. Если выводить значения влажности почвы то когда датчики не воткнуты в землю значения показывают около 1000(+- ) при замыкание или (втыканию их впочву ) значения уменьшаються. вы это имелли в виду?
Нужно изменить самую малость скетч из поста #443. строка 25
Подсказка http://arduino.ru/Reference/Boolean
Вам нужно самому над этим подумать, полезно для будущего. Показывайте что получилось.
измерительный сигнал нужно подавать двуполярный - синусоиду. Тогда датчик будет великолепно себя вести и не будет столь сильно деградировать. А так вы сделали ему "травилку" постоянным током = вот он у вас и вытавился.
Если не боитесь 220 вольт - то рекомендую проверенную годами вещь - электроклапан от стиральной машины...
Найти их за копейки можно в любом городе, достаточно найти тех, кто стиралки на запчасти распродает... Я за 300 рублей купил 4клапанный от Brandt - 4Wx180, с запиткой через реле
Из своего опыта выращивания томатов - их достаточно поливать по таймеру раз в неделю. Главное не лить воду сверху.
У меня в грядке, на глубине 15см, проложена ПП труба с маленьким отверстиями. Клапан открывает подачу воды на время, соответствующее "жаркости" воздуха вне парника. И этого достаточно. А ежели сверху почва замульчирована, то и "жаркостью" можно не интересоваться. Еще надо учесть, что вода постепенно забивает солями всяческие капельные трубочки. Они непрактичны без водоподготовки. А измерение влажности электродами в парнике считаю извращением - это чистые понты. Все это уже проходил:
www.forumhouse.ru/useralbums/9440/view
никаких понтов. Очень удобно. У меня, например, участок с приличным южным склоном. Подпочвенные воды очень сильно влияют на влажность почвы внутри теплицы.
С таймером мне пришлось бы играться после каждого дождика.
а так - подсмотрел удачную конструкцию http://we.easyelectronics.ru/antonluba/prostoy-datchik-urovnya-vody-dlya-kolodca.html и на основе этого решения датчик работает вполне прилично.
Если не боитесь 220 вольт - то рекомендую проверенную годами вещь - электроклапан от стиральной машины...
Найти их за копейки можно в любом городе, достаточно найти тех, кто стиралки на запчасти распродает... Я за 300 рублей купил 4клапанный от Brandt - 4Wx180, с запиткой через реле
Эти клапана рассчитаны на высокое давление, когда система на самотёке они бесполезны
Об этом в теме уже писали.
никаких понтов. Очень удобно. У меня, например, участок с приличным южным склоном. Подпочвенные воды очень сильно влияют на влажность почвы внутри теплицы.
С таймером мне пришлось бы играться после каждого дождика.
а так - подсмотрел удачную конструкцию http://we.easyelectronics.ru/antonluba/prostoy-datchik-urovnya-vody-dlya-kolodca.html и на основе этого решения датчик работает вполне прилично.
Согласен, что на открытой и возвышенной грядке влага быстрее накапливается и исчезает, но в парнике этот процесс очень инерционный даже с подпочвенными водами. Так что ритм полива в парнике от дождя мало зависит. Если затяжные дожди можно просто разрывать цепь таймера.
Я контролирую влажность только при выращивании рассады в боксе, потому что у рассады маленькие корни сильно зависят от влажности верхнего слоя почвы. А томат в парнике найдет воду ВСЕГДА-у него корни до 2хметров вглубь. А кондуктометрические датчики уровня это усложненный анахронизм по сравнению с герконом.
та не. Вы неправильно поняли.
Основная идея = датчик работает в переменном токе, полученное выпрямленное напряжение уже можно измерять на АЦП и определять момент включения полива.
Добрый день.
А можно обновленный скеч, с поливом по датчику влажности? и еще подскажите, смотрю схему на первой странице, вижу что в схеме используются сопротивления, а как узнать где и какого номинала использовать? С
Добрый день.
А можно обновленный скеч, с поливом по датчику влажности? и еще подскажите, смотрю схему на первой странице, вижу что в схеме используются сопротивления, а как узнать где и какого номинала использовать? С
Кода пока нет, есть опробованные функции,
В ф-цию boolean drip_irrigation() в качестве аргументов передаём - (вкл или выкл полива, аналоговый пин датчика влажности земли, канал реле, мин влажность земли и макс влажность земли. функция int h_pochva(int ch) берёт аргумент из ф-ции drip_irrigation аналоговый пин.
01
void
drip_irrigation(boolean on_off,
int
analog_pin,
int
ch_rele,
int
hum_min,
int
hum_max) {
02
boolean i = EEPROM.read(on_off);
03
if
(i) {
04
int
_min = EEPROM.read(hum_min);
05
int
_max = EEPROM.read(hum_max);
06
// boolean val = 0;
07
if
(h_pochva(analog_pin) < _min){digitalWrite(ch_rele, LOW); }
//val = 1;
08
// Serial.print("drip ch_rele="); Serial.print(ch_rele); Serial.print(val);}
09
if
(h_pochva(analog_pin) > _max){digitalWrite(ch_rele, HIGH);}
// val = 0;
10
// Serial.print("drip ch_rele="); Serial.print(ch_rele); Serial.print(val);}
11
12
}
1
//функция преобразования аналогового значения влажности почвы в проценты влажности
2
byte
h_pochva(
int
ch){
3
int
val=analogRead(ch);
4
val =constrain(val, 200, 700);
5
val =map(val, 200, 700, 100, 0);
6
return
val;
//}
Резисторы в схеме нужны для подтяжки кнопок и датчиков. Номиналы для кнопок и DHT датчика 10кОм, для DS18b20 4,7кОм
А можете дать часть кода которая работает с датчиками влажности почвы и релле?
Всем привет. Я дома пока пробую вот такой код
датчик временно сделал самодельный из медной проволоки
Лучше нержавейку или нихром, медные быстро скушает. И почитайте по вставке кода
Добрый день. Выложите пожалуйсто фотки как шток закреплен, и в каком положении он при закрытом окне и при открытом ну и с далека как выглядит открытое окно. Буду Вам очень благодарен.
Просто поставил себе цепной электро редуктор но он намного дороже стоит чем шток.
Добрый день. Выложите пожалуйсто фотки как шток закреплен, и в каком положении он при закрытом окне и при открытом ну и с далека как выглядит открытое окно. Буду Вам очень благодарен.
Просто поставил себе цепной электро редуктор но он намного дороже стоит чем шток.
Шток который держит актуатор? На саморезах по металу вроде ничего сложного... ну если надо фото то сделаю на выходных
Ну на фотке я так вроде расмотрел, сделайте фотки открытого и закрытого окна. А на сколько актуатор высовывается?
Ну на фотке я так вроде расмотрел, сделайте фотки открытого и закрытого окна. А на сколько актуатор высовывается?
Длину высовывания можно регулировать колёсиками(хз как их обозвать=) ) в коробке актуатора, которые нажимают концевые выключатели. Шток актуатора вылазит примерно на 80% длинны
А я вот сейчас подумаыаю только над подобным!
Только совсем не разбираюсь в этом.
Вопросы для опытных банальные, но я даже в руках такие платы не держал.
Хотел бы спросить, что надо приборести для создания следующего "проекта".
Требования:
1)
2 разовый полив в определенное время, посредством открытия клапана, чтоб каждый шланг поливался одинаково. (например в 9.00 и 21.00 - независимо от влажности земли, т.к. датчик влажности установленный в одном месте - не может гарантировать что через 30 см уровень влажности будет такой же)
2)
- Открытие/закрытие 2 форточек по температуре внутри теплицы. Например чтоб при +30 градусах открылись обе форточки, при +25 одна из форточек закрывалась, при +20 закрывалась вторая форточка.
- Включение/отключение кулеров 4 шт.*120 мм на подачу воздуха, и вытягивание. (так кстати можно создать постоянный микроклимат, без открытия форточек, по крайней мере мне так кажется)
Что подскажите? С чего начать?
А кто нибудь пробовал открывать дверь сервой, напримор такой
http://ru.aliexpress.com/item/Servos-Digital-MG996R-Servo-Metal-Gear-for...
Мож кому понравятся мои варианты привода для фрамуг/дверей в теплице..
http://www.greentalk.ru/forum/blog/83/entry-573-sistema-ventilyatcii-dly...
Общий вопрос по открытию дверерй/форточек, а как поступать с ситуацией, когда человек сам заходит в теплицу? Отключать привод? И насколько широко вообще открывать окно?
я планирую, открывать дверь на определенное время по нажатию кнопки (например минуту). как поеду к родителям испытаю в действии. кнопки сделаю две, одна с наружи одна внутри
я планирую, открывать дверь на определенное время по нажатию кнопки (например минуту). как поеду к родителям испытаю в действии. кнопки сделаю две, одна с наружи одна внутри
Минута это мало думаю...тут имел ввиду вопрос о том как работа автоматики будет сказываться на человеке?
Я вижу решение в том чтоб системой рычагов - отталкивать дверь, т.е. толкатель не будет соеденяться жестко с дверью.
Шток вышел - окно открылось, шток зашел - окно закрылось.
Так можно избежать ситуаций - когда дачные гости решат заглянуть посмотреть в теплицу, тем самым вырвав вю автоматику с корнем.
у меня отец приделал двигатели, которые открывали закрывали жалюзи на старой элетростанции. они идеально подошли так как и конечники есть у них, которыми настраиваешь угол открытия, как поеду к ним сфоткую, а так код простенький написал, будем пробовать все соединить вместе, как откатаю все выложу, так что я опка такой вариант для себя придумал, при их исползовании только напряжением откроешь дверь.
[/quote]
Добрый день. Выложите пожалуйсто фотки как шток закреплен, и в каком положении он при закрытом окне и при открытом ну и с далека как выглядит открытое окно. Буду Вам очень благодарен.
Просто поставил себе цепной электро редуктор но он намного дороже стоит чем шток.
[/quote]
Кстати в тему как открывать верхнии форточки, сфоткал на выставке домов у МЕГи:
Ребят помогите немогу разобраться ... Пытаюсь сделать полив по 3 датчикам влажности почвы и 4 релле (1 для включения насоса)
Вот так вот код работает более менее
01
void
setup
()
02
{
03
pinMode( 5 , OUTPUT);
04
pinMode( 4 , OUTPUT);
05
pinMode( 3 , OUTPUT);
06
pinMode( 2 , OUTPUT);
07
}
08
09
10
void
loop
()
11
{
12
13
digitalWrite(5,(analogRead(2) > 200));
14
digitalWrite(2,(analogRead(2) > 200));
15
digitalWrite(4,(analogRead(1) > 200));
16
digitalWrite(2,(analogRead(1) > 200));
17
digitalWrite(3,(analogRead(3) > 200));
18
digitalWrite(2,(analogRead(3) > 200));
19
20
21
22
}
А вот если вставлять его во весь код то както некорректо... Как правильнее будет написать?
001
#include <DS1307.h>
002
#include <Adafruit_GFX.h>
003
#include <Adafruit_PCD8544.h>
004
#include <SPI.h>
005
#include <dht11.h>
006
007
// pin 7 - Serial clock out (SCLK)
008
// pin 6 - Serial data out (DIN)
009
// pin 5 - Data/Command select (D/C)
010
// pin 4 - LCD chip select (CS)
011
// pin 3 - LCD reset (RST)
012
013
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);
014
DS1307 rtc(A4, A5);
// Инициализация библиотеки с указанием
015
016
017
018
Time t;
// Инициализация струк
019
020
int
d, Counter=0;
021
dht11 sensor;
022
023
void
setup
()
024
{
025
display.begin();
// Инициализация дисплея
026
display.setContrast(55);
027
display.setTextSize(1);
028
rtc.halt(
false
);
// Установка режимов
029
// rtc.writeProtect(false); // работы часов
030
// Следующих три строки нужно закомментировать после
031
// установки времени и загрузить скетч в плату повторно
032
//rtc.setDOW(7); // Установка дня недели
033
//rtc.setTime(14, 25, 00); // Установка времени 10:59:10
034
//rtc.setDate(01, 03, 2015); // Установка даты 20 июля 2013
035
pinMode( 2 , OUTPUT);
036
pinMode( 3 , OUTPUT);
037
pinMode( 4 , OUTPUT);
038
pinMode( 5 , OUTPUT);
039
}
040
041
void
loop
()
042
{
043
t = rtc.getTime();
// Получение времени и его запись в структуру t
044
display.setTextSize(1);
// Установка набора символов
045
display.clearDisplay();
// Очистка экрана
046
if
(
int
(t.hour)<10)
047
{
048
display.setCursor(42,0);
049
display.print(
"0"
);
050
display.setCursor(48,0);
051
display.print(t.hour);}
// Вывод часов
052
else
{
053
display.setCursor(42,0);
054
display.print(t.hour);}
055
display.setCursor(53,0);
056
display.print(
"."
);
057
058
display.setCursor(68,0);
059
display.print(
"."
);
060
061
if
(
int
(t.min)<10){
062
display.setCursor(57,0);
063
display.print(
"0"
);
064
display.setCursor(63,0);
065
display.print(
int
(t.min));
// Вывод минут
066
}
067
else
{
068
display.setCursor(57,0);
069
display.print(
int
(t.min));}
070
071
display.setTextSize(1);
// Установка набора символов
072
if
(
int
(t.sec)<10){
073
display.setCursor(72, 0);
074
display.print(
"0"
);
075
display.setCursor(79, 0);
076
display.print(
int
(t.sec));}
// Вывод секунд
077
else
{
078
display.setCursor(72, 0);
079
display.print((t.sec));}
// Вывод секунд
080
081
082
// display.setCursor(13,17);
083
//display.print(rtc.getDateStr()); // Вывод даты
084
sensor.read(6);
085
display.setTextSize(1);
// Установка набора символов
086
display.setCursor(7, 0);
087
display.print(sensor.temperature);
088
display.setCursor(0, 0);
089
display.print(
"С"
);
090
091
display.setCursor(27, 0);
092
display.print(sensor.humidity);
093
display.setCursor(21, 0);
094
display.print(
"%"
);
095
display.setCursor(15, 37);
096
display.print(
"Влаж.%"
);
097
display.setCursor(60, 37);
098
display.print(analogRead(3));
099
display.setCursor(15, 27);
100
display.print(
"Влаж.%"
);
101
display.setCursor(60, 27);
102
display.print(analogRead(2));
103
display.setCursor(15, 17);
104
display.print(
"Влаж.%"
);
105
display.setCursor(60, 17);
106
display.print(analogRead(1));
107
108
109
digitalWrite(5,(analogRead(2) > 200));
110
digitalWrite(2,(analogRead(2) > 200));
111
digitalWrite(4,(analogRead(1) > 200));
112
digitalWrite(2,(analogRead(1) > 200));
113
digitalWrite(3,(analogRead(3) > 200));
114
digitalWrite(2,(analogRead(3) > 200));
115
116
117
118
display.display();
// Вывод вместимого буфера на дисплей
119
delay (1000);
// Задержка 1 с
120
}
Почему analogRead(2)? Это мы читаем состояние цифрового пина D2, т.е. будет всегда или 0 или 1023.
пин 2 - это насос, остальные клапаны?
01
// это перед setup
02
#define PUMP_PIN 2 // пин для подключения реле и насоса
03
#define VALVE1_PIN 3 // пин для подключения реле и клапана
04
#define VALVE2_PIN 4 // эти синонимы в коде не используются, они для наглядности - как писать в будущем
05
#define VALVE3_PIN 5
06
const
int
soilTreshhold = 200;
// порог включения/выключения по влажности почвы
07
08
// это вместо строк 109-114
09
checkSoil(A1, 3);
// проверка влажности почвы на аналоговом пине A1, при необходимости включаем реле на пине 3.
10
checkSoil(A2, 4);
11
checkSoil(A3, 5);
12
13
// это после loop
14
void
checkSoil(
byte
sensorPin,
byte
relayPin)
// Входные значения - номер проверяемого пина и номер включаемого пина
15
{
16
int
soilMoisture = analogRead(sensorPin);
// читаем влажность почвы
17
if
(soilMoisture < soilTreshhold)
// если сухо
18
{
19
digitalWrite(relayPin, HIGH);
// открываем заданный клапан
20
digitalWrite(PUMP_PIN, HIGH);
// включаем насос
21
// delay (20000); // отключение полива по времени (если датчик сгнил :)
22
// stopPoliv();
23
}
24
else
stopPoliv();
25
}
26
27
void
stopPoliv(
byte
sensorPin)
// отключение полива
28
{
29
// отключаем насос, если он не используется другими каналами, иначе будет его постоянное дерганье
30
if
(digitalRead(3) && (!digitalRead(4) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW);
31
if
(digitalRead(4) && (!digitalRead(3) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW);
32
if
(digitalRead(5) && (!digitalRead(3) || !digitalRead(4) )) digitalWrite(PUMP_PIN, LOW);
33
digitalWrite(relayPin, LOW);
// закрываем заданный клапан
34
}
"Почему analogRead(2)? Это мы читаем состояние цифрового пина D2" по чему цифрового если analogRead?
Да пин 2 это насос а остальные клапана
Что-то у меня не сходиться всю голову уж сломал(((
001
#include <DS1307.h>
002
#include <Adafruit_GFX.h>
003
#include <Adafruit_PCD8544.h>
004
#include <SPI.h>
005
#include <dht11.h>
006
007
// pin 7 - Serial clock out (SCLK)
008
// pin 6 - Serial data out (DIN)
009
// pin 5 - Data/Command select (D/C)
010
// pin 4 - LCD chip select (CS)
011
// pin 3 - LCD reset (RST)
012
013
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);
014
DS1307 rtc(A4, A5);
// Инициализация библиотеки с указанием
015
016
#define PUMP_PIN 2 // пин для подключения реле и насоса
017
#define VALVE1_PIN 3 // пин для подключения реле и клапана
018
#define VALVE2_PIN 4 // эти синонимы в коде не используются, они для наглядности - как писать в будущем
019
#define VALVE3_PIN 5
020
const
int
soilTreshhold = 200;
// порог включения/выключения по влажности почвы
021
022
023
Time t;
// Инициализация струк
024
025
int
d, Counter=0;
026
dht11 sensor;
027
028
void
setup
()
029
{
030
display.begin();
// Инициализация дисплея
031
display.setContrast(55);
032
display.setTextSize(1);
033
rtc.halt(
false
);
// Установка режимов
034
// rtc.writeProtect(false); // работы часов
035
// Следующих три строки нужно закомментировать после
036
// установки времени и загрузить скетч в плату повторно
037
//rtc.setDOW(7); // Установка дня недели
038
//rtc.setTime(14, 25, 00); // Установка времени 10:59:10
039
//rtc.setDate(01, 03, 2015); // Установка даты 20 июля 2013
040
pinMode( 2 , OUTPUT);
041
pinMode( 3 , OUTPUT);
042
pinMode( 4 , OUTPUT);
043
pinMode( 5 , OUTPUT);
044
}
045
046
void
loop
()
047
{
048
t = rtc.getTime();
// Получение времени и его запись в структуру t
049
display.setTextSize(1);
// Установка набора символов
050
display.clearDisplay();
// Очистка экрана
051
if
(
int
(t.hour)<10)
052
{
053
display.setCursor(42,0);
054
display.print(
"0"
);
055
display.setCursor(48,0);
056
display.print(t.hour);}
// Вывод часов
057
else
{
058
display.setCursor(42,0);
059
display.print(t.hour);}
060
display.setCursor(53,0);
061
display.print(
"."
);
062
063
display.setCursor(68,0);
064
display.print(
"."
);
065
066
if
(
int
(t.min)<10){
067
display.setCursor(57,0);
068
display.print(
"0"
);
069
display.setCursor(63,0);
070
display.print(
int
(t.min));
// Вывод минут
071
}
072
else
{
073
display.setCursor(57,0);
074
display.print(
int
(t.min));}
075
076
display.setTextSize(1);
// Установка набора символов
077
if
(
int
(t.sec)<10){
078
display.setCursor(72, 0);
079
display.print(
"0"
);
080
display.setCursor(79, 0);
081
display.print(
int
(t.sec));}
// Вывод секунд
082
else
{
083
display.setCursor(72, 0);
084
display.print((t.sec));}
// Вывод секунд
085
086
087
// display.setCursor(13,17);
088
//display.print(rtc.getDateStr()); // Вывод даты
089
sensor.read(6);
090
display.setTextSize(1);
// Установка набора символов
091
display.setCursor(7, 0);
092
display.print(sensor.temperature);
093
display.setCursor(0, 0);
094
display.print(
"С"
);
095
096
display.setCursor(27, 0);
097
display.print(sensor.humidity);
098
display.setCursor(21, 0);
099
display.print(
"%"
);
100
display.setCursor(15, 37);
101
display.print(
"Влаж.%"
);
102
display.setCursor(60, 37);
103
display.print(analogRead(3));
104
display.setCursor(15, 27);
105
display.print(
"Влаж.%"
);
106
display.setCursor(60, 27);
107
display.print(analogRead(2));
108
display.setCursor(15, 17);
109
display.print(
"Влаж.%"
);
110
display.setCursor(60, 17);
111
display.print(analogRead(1));
112
113
114
checkSoil(A1, 3);
// проверка влажности почвы на аналоговом пине A1, при необходимости включаем реле на пине 3.
115
checkSoil(A2, 4);
116
checkSoil(A3, 5);
117
118
119
120
display.display();
// Вывод вместимого буфера на дисплей
121
delay (1000);
// Задержка 1 с
122
123
}
124
void
checkSoil(
byte
sensorPin,
byte
relayPin)
// Входные значения - номер проверяемого пина и номер включаемого пина
125
{
126
int
soilMoisture = analogRead(sensorPin);
// читаем влажность почвы
127
if
(soilMoisture < soilTreshhold)
// если сухо
128
{
129
digitalWrite(relayPin, HIGH);
// открываем заданный клапан
130
digitalWrite(PUMP_PIN, HIGH);
// включаем насос
131
// delay (20000); // отключение полива по времени (если датчик сгнил :)
132
// stopPoliv();
133
}
134
else
stopPoliv();
135
}
136
137
void
stopPoliv(
byte
sensorPin)
// отключение полива
138
{
139
// отключаем насос, если он не используется другими каналами, иначе будет его постоянное дерганье
140
if
(digitalRead(3) && (!digitalRead(4) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW);
141
if
(digitalRead(4) && (!digitalRead(3) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW);
142
if
(digitalRead(5) && (!digitalRead(3) || !digitalRead(4) )) digitalWrite(PUMP_PIN, LOW);
143
digitalWrite(relayPin, LOW);
// закрываем заданный клапан
144
}
137
void
stopPoliv()
// отключение полива
143
digitalWrite(PUMP_PIN, LOW);
// закрываем заданный клапан
Теперь вообще весело) При включение ардуино: включаються все релле(т.к почва сухая датчики не куда не воткнуты ), при замыкание датчиков влажности релле выключаються, но обратно включаеться только релле насоса при размыкание 3 датчика аналогово
001
#include <DS1307.h>
002
#include <Adafruit_GFX.h>
003
#include <Adafruit_PCD8544.h>
004
#include <SPI.h>
005
#include <dht11.h>
006
007
// pin 7 - Serial clock out (SCLK)
008
// pin 6 - Serial data out (DIN)
009
// pin 5 - Data/Command select (D/C)
010
// pin 4 - LCD chip select (CS)
011
// pin 3 - LCD reset (RST)
012
013
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);
014
DS1307 rtc(A4, A5);
// Инициализация библиотеки с указанием
015
016
#define PUMP_PIN 2 // пин для подключения реле и насоса
017
#define VALVE1_PIN 3 // пин для подключения реле и клапана
018
#define VALVE2_PIN 4 // эти синонимы в коде не используются, они для наглядности - как писать в будущем
019
#define VALVE3_PIN 5
020
const
int
soilTreshhold = 200;
// порог включения/выключения по влажности почвы
021
022
023
Time t;
// Инициализация струк
024
025
int
d, Counter=0;
026
dht11 sensor;
027
028
void
setup
()
029
{
030
display.begin();
// Инициализация дисплея
031
display.setContrast(55);
032
display.setTextSize(1);
033
rtc.halt(
false
);
// Установка режимов
034
// rtc.writeProtect(false); // работы часов
035
// Следующих три строки нужно закомментировать после
036
// установки времени и загрузить скетч в плату повторно
037
//rtc.setDOW(7); // Установка дня недели
038
//rtc.setTime(14, 25, 00); // Установка времени 10:59:10
039
//rtc.setDate(01, 03, 2015); // Установка даты 20 июля 2013
040
pinMode( 2 , OUTPUT);
041
pinMode( 3 , OUTPUT);
042
pinMode( 4 , OUTPUT);
043
pinMode( 5 , OUTPUT);
044
}
045
046
void
loop
()
047
{
048
t = rtc.getTime();
// Получение времени и его запись в структуру t
049
display.setTextSize(1);
// Установка набора символов
050
display.clearDisplay();
// Очистка экрана
051
if
(
int
(t.hour)<10)
052
{
053
display.setCursor(42,0);
054
display.print(
"0"
);
055
display.setCursor(48,0);
056
display.print(t.hour);}
// Вывод часов
057
else
{
058
display.setCursor(42,0);
059
display.print(t.hour);}
060
display.setCursor(53,0);
061
display.print(
"."
);
062
063
display.setCursor(68,0);
064
display.print(
"."
);
065
066
if
(
int
(t.min)<10){
067
display.setCursor(57,0);
068
display.print(
"0"
);
069
display.setCursor(63,0);
070
display.print(
int
(t.min));
// Вывод минут
071
}
072
else
{
073
display.setCursor(57,0);
074
display.print(
int
(t.min));}
075
076
display.setTextSize(1);
// Установка набора символов
077
if
(
int
(t.sec)<10){
078
display.setCursor(72, 0);
079
display.print(
"0"
);
080
display.setCursor(79, 0);
081
display.print(
int
(t.sec));}
// Вывод секунд
082
else
{
083
display.setCursor(72, 0);
084
display.print((t.sec));}
// Вывод секунд
085
086
087
// display.setCursor(13,17);
088
//display.print(rtc.getDateStr()); // Вывод даты
089
sensor.read(6);
090
display.setTextSize(1);
// Установка набора символов
091
display.setCursor(7, 0);
092
display.print(sensor.temperature);
093
display.setCursor(0, 0);
094
display.print(
"С"
);
095
096
display.setCursor(27, 0);
097
display.print(sensor.humidity);
098
display.setCursor(21, 0);
099
display.print(
"%"
);
100
display.setCursor(15, 37);
101
display.print(
"Влаж.%"
);
102
display.setCursor(60, 37);
103
display.print(analogRead(3));
104
display.setCursor(15, 27);
105
display.print(
"Влаж.%"
);
106
display.setCursor(60, 27);
107
display.print(analogRead(2));
108
display.setCursor(15, 17);
109
display.print(
"Влаж.%"
);
110
display.setCursor(60, 17);
111
display.print(analogRead(1));
112
113
114
checkSoil(A1, 3);
// проверка влажности почвы на аналоговом пине A1, при необходимости включаем реле на пине 3.
115
checkSoil(A2, 4);
116
checkSoil(A3, 5);
117
118
119
120
display.display();
// Вывод вместимого буфера на дисплей
121
delay (1000);
// Задержка 1 с
122
123
}
124
void
checkSoil(
byte
sensorPin,
byte
relayPin)
// Входные значения - номер проверяемого пина и номер включаемого пина
125
{
126
int
soilMoisture = analogRead(sensorPin);
// читаем влажность почвы
127
if
(soilMoisture < soilTreshhold)
// если сухо
128
{
129
digitalWrite(relayPin, HIGH);
// открываем заданный клапан
130
digitalWrite(PUMP_PIN, HIGH);
// включаем насос
131
// delay (20000); // отключение полива по времени (если датчик сгнил :)
132
// stopPoliv();
133
}
134
else
stopPoliv();
135
}
136
137
void
stopPoliv()
// отключение полива
138
{
139
// отключаем насос, если он не используется другими каналами, иначе будет его постоянное дерганье
140
if
(digitalRead(3) && (!digitalRead(4) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW);
141
if
(digitalRead(4) && (!digitalRead(3) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW);
142
if
(digitalRead(5) && (!digitalRead(3) || !digitalRead(4) )) digitalWrite(PUMP_PIN, LOW);
143
digitalWrite(PUMP_PIN, LOW);
// закрываем заданный клапан
144
}
Теперь вообще весело) При включение ардуино: включаються все релле(т.к почва сухая датчики не куда не воткнуты ), при замыкание датчиков влажности релле выключаються, но обратно включаеться только релле насоса при размыкание 3 датчика аналогово
По-идее не должно быть такого, т.к. "сухая почва" - это одно значение, а обрыв датчика - это авария и по ней реле включать не нужно. Иначе в результате обрыва - зальете все напрочь.
Даже так не работает((( Может проблемма в 21,22,23 строках?
01
#define PUMP_PIN 2 // пин для подключения реле и насоса
02
#define VALVE1_PIN 3 // пин для подключения реле и клапана
03
#define VALVE2_PIN 4 // эти синонимы в коде не используются, они для наглядности - как писать в будущем
04
#define VALVE3_PIN 5
05
const
int
soilTreshhold = 200;
// порог включения/выключения по влажности почвы
06
07
08
void
setup
()
09
{
10
11
pinMode( 2 , OUTPUT);
12
pinMode( 3 , OUTPUT);
13
pinMode( 4 , OUTPUT);
14
pinMode( 5 , OUTPUT);
15
}
16
17
void
loop
()
18
{
19
20
21
checkSoil(A1, 3);
// проверка влажности почвы на аналоговом пине A1, при необходимости включаем реле на пине 3.
22
checkSoil(A2, 4);
23
checkSoil(A3, 5);
24
25
26
27
28
29
}
30
void
checkSoil(
byte
sensorPin,
byte
relayPin)
// Входные значения - номер проверяемого пина и номер включаемого пина
31
{
32
int
soilMoisture = analogRead(sensorPin);
// читаем влажность почвы
33
if
(soilMoisture < soilTreshhold)
// если сухо
34
{
35
digitalWrite(relayPin, HIGH);
// открываем заданный клапан
36
digitalWrite(PUMP_PIN, HIGH);
// включаем насос
37
// delay (20000); // отключение полива по времени (если датчик сгнил :)
38
// stopPoliv();
39
}
40
else
stopPoliv();
41
}
42
43
void
stopPoliv()
// отключение полива
44
{
45
// отключаем насос, если он не используется другими каналами, иначе будет его постоянное дерганье
46
if
(digitalRead(3) && (!digitalRead(4) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW);
47
if
(digitalRead(4) && (!digitalRead(3) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW);
48
if
(digitalRead(5) && (!digitalRead(3) || !digitalRead(4) )) digitalWrite(PUMP_PIN, LOW);
49
digitalWrite(PUMP_PIN, LOW);
// закрываем заданный клапан
50
}
Клапана выключаються но не включаються
Вот этот код полность работает
01
const
int
dg = 11;
//датчик влажности
02
const
int
dg2 = 12;
//датчик влажности
03
const
int
dg3 = 13;
//датчик влажности
04
const
int
nasos = 2;
// реле насоса
05
const
int
rele = 3;
// реле клапана полива
06
const
int
rele2 = 4;
// реле клапана полива
07
const
int
rele3 = 5;
// реле клапана полива
08
09
int
dgS = 0;
10
int
dgS1 = 0;
11
int
dgS2 = 0;
12
13
void
setup
() {
14
pinMode(nasos, OUTPUT);
15
pinMode(rele, OUTPUT);
16
pinMode(rele2, OUTPUT);
17
pinMode(rele3, OUTPUT);
18
pinMode(dg, INPUT);
19
pinMode(dg2, INPUT);
20
pinMode(dg3, INPUT);
21
}
22
void
loop
(){
23
dgS = digitalRead(dg);
24
if
(dgS == HIGH) { digitalWrite(nasos, LOW);
25
digitalWrite(rele, LOW);
26
27
}
28
else
{ digitalWrite(nasos, HIGH);
29
digitalWrite(rele, HIGH);}
30
31
// второй датчик
32
dgS1 = digitalRead(dg2);
33
if
(dgS1 == HIGH) { digitalWrite(nasos, LOW);
34
digitalWrite(rele2, LOW);}
35
36
else
{ digitalWrite(nasos, HIGH);
37
digitalWrite(rele2, HIGH);}
38
// третий датчик
39
40
dgS2 = digitalRead(dg3);
41
if
(dgS2 == HIGH) { digitalWrite(nasos, LOW);
42
digitalWrite(rele3, LOW);}
43
else
{ digitalWrite(nasos, HIGH);
44
digitalWrite(rele3, HIGH);}
45
}
Но он по цифровым выходам а мне по аналоговым надо( переделать чтото неполучаеться
Вы после 32-й строчки:
int
soilMoisture = analogRead(sensorPin);
// читаем влажность почвы
вставьте Serial.print(soilMoisture); и посмотрите: меняется ли результат при помещении датчика в сухую и влажную почву. Навскидку - не срабатывает условие для включения клапанов.
Да значения меняться при 200 реле полива выключается, но обратно потом не выключается .
А как сделать разный порог включения реле по влажности для каждого датчика?
Даже так не работает((( Может проблемма в 21,22,23 строках?
01
#define PUMP_PIN 2 // пин для подключения реле и насоса
02
#define VALVE1_PIN 3 // пин для подключения реле и клапана
03
#define VALVE2_PIN 4 // эти синонимы в коде не используются, они для наглядности - как писать в будущем
04
#define VALVE3_PIN 5
05
const
int
soilTreshhold = 200;
// порог включения/выключения по влажности почвы
06
07
08
void
setup
()
09
{
10
11
pinMode( 2 , OUTPUT);
12
pinMode( 3 , OUTPUT);
13
pinMode( 4 , OUTPUT);
14
pinMode( 5 , OUTPUT);
15
}
16
17
void
loop
()
18
{
19
20
21
checkSoil(A1, 3);
// проверка влажности почвы на аналоговом пине A1, при необходимости включаем реле на пине 3.
22
checkSoil(A2, 4);
23
checkSoil(A3, 5);
24
25
26
27
28
29
}
30
void
checkSoil(
byte
sensorPin,
byte
relayPin)
// Входные значения - номер проверяемого пина и номер включаемого пина
31
{
32
int
soilMoisture = analogRead(sensorPin);
// читаем влажность почвы
33
if
(soilMoisture < soilTreshhold)
// если сухо
34
{
35
digitalWrite(relayPin, HIGH);
// открываем заданный клапан
36
digitalWrite(PUMP_PIN, HIGH);
// включаем насос
37
// delay (20000); // отключение полива по времени (если датчик сгнил :)
38
// stopPoliv();
39
}
40
else
stopPoliv();
41
}
42
43
void
stopPoliv()
// отключение полива
44
{
45
// отключаем насос, если он не используется другими каналами, иначе будет его постоянное дерганье
46
if
(digitalRead(3) && (!digitalRead(4) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW);
47
if
(digitalRead(4) && (!digitalRead(3) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW);
48
if
(digitalRead(5) && (!digitalRead(3) || !digitalRead(4) )) digitalWrite(PUMP_PIN, LOW);
49
digitalWrite(PUMP_PIN, LOW);
// закрываем заданный клапан
50
}
Не уверен, но попробуйте в 35 строке digitalWrite(relayPin, HIGH); заменить HIGT на глобальную переменную, например valveState=1; или объявленную внутри функции
void
checkSoil()
static valveState=1;Здравствуйте!
Планирую запустить аналогичную систему.
Одно предложение вместо клапанов можно использовать краны с сервоприводом от системы антипротечек работают надежно, для меня это актуально бочка стоит очень низко.
И вопрос как освоить систему ардуино?
Спасибо!
Не уверен, но попробуйте в 35 строке digitalWrite(relayPin, HIGH); заменить HIGT на глобальную переменную, например valveState=1; или объявленную внутри функции
void
checkSoil()
static valveState=1;Вот так вот?
01
#define PUMP_PIN 2 // пин для подключения реле и насоса
02
#define VALVE1_PIN 3 // пин для подключения реле и клапана
03
#define VALVE2_PIN 4 // эти синонимы в коде не используются, они для наглядности - как писать в будущем
04
#define VALVE3_PIN 5
05
const
int
soilTreshhold = 200;
// порог включения/выключения по влажности почвы
06
07
08
void
setup
()
09
{
10
11
pinMode( 2 , OUTPUT);
12
pinMode( 3 , OUTPUT);
13
pinMode( 4 , OUTPUT);
14
pinMode( 5 , OUTPUT);
15
}
16
17
void
loop
()
18
{
19
20
21
checkSoil(A1, 3);
// проверка влажности почвы на аналоговом пине A1, при необходимости включаем реле на пине 3.
22
checkSoil(A2, 4);
23
checkSoil(A3, 5);
24
25
26
27
28
29
}
30
void
checkSoil(
byte
sensorPin,
byte
valveState)
// Входные значения - номер проверяемого пина и номер включаемого пина
31
{
32
int
soilMoisture = analogRead(sensorPin);
// читаем влажность почвы
33
if
(soilMoisture < soilTreshhold)
// если сухо
34
{
35
digitalWrite(valveState=1);
// открываем заданный клапан
36
digitalWrite(PUMP_PIN, HIGH);
// включаем насос
37
// delay (20000); // отключение полива по времени (если датчик сгнил :)
38
// stopPoliv();
39
}
40
else
stopPoliv();
41
}
42
43
void
stopPoliv()
// отключение полива
44
{
45
// отключаем насос, если он не используется другими каналами, иначе будет его постоянное дерганье
46
if
(digitalRead(3) && (!digitalRead(4) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW);
47
if
(digitalRead(4) && (!digitalRead(3) || !digitalRead(5) )) digitalWrite(PUMP_PIN, LOW);
48
if
(digitalRead(5) && (!digitalRead(3) || !digitalRead(4) )) digitalWrite(PUMP_PIN, LOW);
49
digitalWrite(PUMP_PIN, LOW);
// закрываем заданный клапан
50
}
Набросал такой скетч, может подойдёт. Сам не проверял, но должен работать.
01
const
byte
arrayPinOut[4] = {3, 4, 5, 2};
//на D2 насос
02
const
byte
arrayPinSensor[3] = {15, 16, 17};
//А1,А2,А3
03
boolean stateValue[3];
04
const
int
soilTreshhold = 200;
//или можно массив с разным значением для каждого датчика
05
unsigned
long
prevMillis;
06
07
void
setup
(){
08
for
(
byte
i=0; i++; i<4){
09
pinMode(arrayPinOut[i], OUTPUT);
10
}
11
}
12
void
loop
(){
13
if
((millis() - prevMillis) > 60000){
14
irrigatSoil();
//вызываем функцию каждую минуту, например.
15
}
16
//делаем что то ещё..
17
}
18
//-----------------------------------
19
void
irrigatSoil(){
20
static
boolean statePump=0;
21
byte
i=0;
22
for
(i=0; i++; i<3){
23
//измеряем влаж. каждым датчиком и откр/закр. нужный клапан
24
stateValue[i] = soilTreshhold > analogRead(arrayPinSensor[i]);
25
digitalWrite(arrayPinOut[i], stateValue[i]);
26
}
27
//если один из клапанов открыт-насос включен
28
statePump = stateValue[0] | stateValue[1] | stateValue[2];
29
digitalWrite(arrayPinOut[3], statePump);
30
prevMillis = millis();
31
}
А как сделать разный порог включения реле по влажности для каждого датчика?
Добавить во входных переменных функции checkSoil() третий параметр = "порог срабатывания". :)
void
checkSoil(
byte
sensorPin=2,
byte
valveState=0, int soilTreshold=200)
Я бы еще добавил в код пропуски циклов или задержки на худой конец. Влажность ведь не меняется с частотой 8МГц.
Набросал такой скетч, может подойдёт. Сам не проверял, но должен работать.
01
const
byte
arrayPinOut[4] = {3, 4, 5, 2};
//на D2 насос
02
const
byte
arrayPinSensor[3] = {15, 16, 17};
//А1,А2,А3
03
boolean stateValue[3];
04
const
int
soilTreshhold = 200;
//или можно массив с разным значением для каждого датчика
05
unsigned
long
prevMillis;
06
07
void
setup
(){
08
for
(
byte
i=0; i++; i<4){
09
pinMode(arrayPinOut[i], OUTPUT);
10
}
11
}
12
void
loop
(){
13
if
((millis() - prevMillis) > 60000){
14
irrigatSoil();
//вызываем функцию каждую минуту, например.
15
}
16
//делаем что то ещё..
17
}
18
//-----------------------------------
19
void
irrigatSoil(){
20
static
boolean statePump=0;
21
byte
i=0;
22
for
(i=0; i++; i<3){
23
//измеряем влаж. каждым датчиком и откр/закр. нужный клапан
24
stateValue[i] = soilTreshhold > analogRead(arrayPinSensor[i]);
25
digitalWrite(arrayPinOut[i], stateValue[i]);
26
}
27
//если один из клапанов открыт-насос включен
28
statePump = stateValue[0] | stateValue[1] | stateValue[2];
29
digitalWrite(arrayPinOut[3], statePump);
30
prevMillis = millis();
31
}
Что-то вообще не работает(((
А если в цикле поменять местами условие (i<3) с инкрементом (i++) :)
Код с новой, улучшеной формулой)
01
const
byte
arrayPinOut[4] = {3, 4, 5, 2};
//на D2 насос
02
const
byte
arrayPinSensor[3] = {15, 16, 17};
//А1,А2,А3
03
int
soilTreshold[3] = {200, 300, 250};
//массив с разным значением для каждого датчика
04
05
void
setup
(){
06
//Serial.begin(9600);
07
for
(
byte
i=0; i<4; i++){
08
pinMode(arrayPinOut[i], OUTPUT);
09
}
10
}
11
void
loop
(){
12
static
unsigned
long
prevMillis = 0;
13
if
((millis() - prevMillis) > 60000){
//вызываем функцию каждую минуту, например.
14
digitalWrite(arrayPinOut[3], irrigatSoil());
15
prevMillis = millis();
16
}
17
//делаем что то ещё..
18
}
19
//-----------------------------------
20
boolean irrigatSoil(){
21
static
boolean stateValue[3] = {0, 0, 0};
22
for
(
byte
i=0; i<3; i++){
23
//измеряем влаж. каждым датчиком и откр/закр. нужный клапан
24
stateValue[i] = soilTreshold[i] > analogRead(arrayPinSensor[i]);
25
digitalWrite(arrayPinOut[i], stateValue[i]);
26
/*Serial.print("levelHum "); Serial.print(i+1);
27
Serial.print(" = "); Serial.println(analogRead(arrayPinSensor[i]));
28
Serial.print("stateValue "); Serial.print(i+1);
29
Serial.print(" = "); Serial.println(stateValue[i]);*/
30
}
31
//если один из клапанов открыт-насос включен
32
return
stateValue[0] | stateValue[1] | stateValue[2];
33
}
Код с новой, улучшеной
01
const
byte
arrayPinOut[4] = {3, 4, 5, 2};
//на D2 насос
02
const
byte
arrayPinSensor[3] = {15, 16, 17};
//А1,А2,А3
03
int
soilTreshold[3] = {200, 300, 250};
//массив с разным значением для каждого датчика
04
05
void
setup
(){
06
//Serial.begin(9600);
07
for
(
byte
i=0; i<4; i++){
08
pinMode(arrayPinOut[i], OUTPUT);
09
}
10
}
11
void
loop
(){
12
static
unsigned
long
prevMillis = 0;
13
if
((millis() - prevMillis) > 60000){
//вызываем функцию каждую минуту, например.
14
digitalWrite(arrayPinOut[3], irrigatSoil());
15
prevMillis = millis();
16
}
17
//делаем что то ещё..
18
}
19
//-----------------------------------
20
boolean irrigatSoil(){
21
static
boolean stateValue[3] = {0, 0, 0};
22
for
(
byte
i=0; i<3; i++){
23
//измеряем влаж. каждым датчиком и откр/закр. нужный клапан
24
stateValue[i] = soilTreshold[i] > analogRead(arrayPinSensor[i]);
25
digitalWrite(arrayPinOut[i], stateValue[i]);
26
/*Serial.print("levelHum "); Serial.print(i+1);
27
Serial.print(" = "); Serial.println(analogRead(arrayPinSensor[i]));
28
Serial.print("stateValue "); Serial.print(i+1);
29
Serial.print(" = "); Serial.println(stateValue[i]);*/
30
}
31
//если один из клапанов открыт-насос включен
32
return
stateValue[0] | stateValue[1] | stateValue[2];
33
}
Как поменять состояния релле насоса? он вместо того чтобы включиться выключаеться)
return
!(stateValue[0] | stateValue[1] | stateValue[2]);
return
!(stateValue[0] | stateValue[1] | stateValue[2]);
Все равно не то. У меня насос включаеться только после того как на все остальные релле включены. Если хоть одно релле выключено то и насос выключен.
Не, так дело не пойдёт. Описывайте подробно какой датчик, как изменяется напряжение на выходе в зависимости от влажности, какие модули реле... Попытайтесь сами поправить скетч и тогда будем смотреть...
Не, так дело не пойдёт. Описывайте подробно какой датчик, как изменяется напряжение на выходе в зависимости от влажности, какие модули реле... Попытайтесь сами поправить скетч и тогда будем смотреть...
Вот так вот выглядит вся моя система. если почва влажная то релле отключаеться, но вместе с ним отключаеться и насос (даже если другие датчики говорят что сухо. если на всех датчиках сухо то насос включен, если хоть на одном любом влажно то насос выключен)
Sim, скоро серьёзные парни над нами начнут прикалываться...
По алгоритму понятно, только я бы поставил клапан на каждую зону и поливал где сухо.
Монтажная схема, что на фото мне не нужна.
Описывайте подробно какой датчик, как изменяется напряжение на выходе в зависимости от влажности, какие модули реле... Попытайтесь сами поправить скетч и тогда будем смотреть...
Реле на модуле включается при подаче на вход "1" или "0"??? Своими словами или ссылку на схему модуля.
При увеличении влажности почвы напряжение на выходе модуля датчика влажности увеличивается или уменьшается?? Своими словами или ссылку на схему модуля.
Ну если своими словами то при подаже - (gnd) релле включаеться. Если выводить значения влажности почвы то когда датчики не воткнуты в землю значения показывают около 1000(+- ) при замыкание или (втыканию их впочву ) значения уменьшаються. вы это имелли в виду?
Нужно изменить самую малость скетч из поста #443. строка 25
Подсказка http://arduino.ru/Reference/Boolean
Вам нужно самому над этим подумать, полезно для будущего. Показывайте что получилось.