Автоматический полив на ардуино с дисплеем

Автоматический полив на ардуино с дисплеем

Содержание

Обзор датчика уровня влажности почвы

Подобные датчики подключаются достаточно просто. Два из трех коннекторов — это питание (VCC) и земля (GND). При использовании датчик желательно периодически отключать от источника питания, чтобы избежать возможного окисления. Третий выход — сигнал (sig), с которого мы и будем снимать показания. Два контакта датчика работают по принципу переменного резистора — чем больше влаги в почве, тем лучше контакты проводят электричество, падает сопротивление, сигнал на контакте SIG растет. Аналоговые значения могут отличаться в зависимости от напряжения питания и разрешающей способности ваших аналоговых пинов микроконтроллера.

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

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

Второй вариант более гибкий:

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

Ну и конечно можно напрямую запаять контакты на датчик.

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

Датчик уровня влажности почвы с нанесенным защитным покрытием на контактах и изолированными проводниками для подключения:

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

Проблема недолговечности датчика уровня влажности почвы

Один из недостатков датчиков подобного типа — недолговечность их чувствительных элементов. К примеру, компания Sparkfun решает эту проблему, используя дополнительное покрытие (Electroless Nickel Immersion Gold). Второй вариант продления срока действия сенсора — подавать на него питание непосредственно при снятии показаний. При использовании Arduino, все ограничивается подачей сигнала HIGH на пин, к которому подключен датчик. Если вы хотите запитать датчик большим напряжением чем предоставляет Arduino, всегда можно использовать дополнительный транзистор.

Контроль уровня влажности почвы — пример проекта

В приведенном ниже проекте использованы датчик уровня влажности, аналог платы Arduino — RedBoard и LCD дисплей, на котором выводятся данные про уровень влажности почвы.

В приведенном ниже проекте использованы датчик уровня влажности, аналог платы Arduino — RedBoard и LCD дисплей, на котором выводятся данные про уровень влажности почвы.

Датчик уровня влажности почвы компании SparkFun:

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

Красный проводник (VCC) подключается к 5 В на Arduino, черный — к земле (GND), зеленый — сигнал — к аналоговому пину 0 (A0). Если вы используете другой аналоговый пин на Arduino, не забудьте внести соответствующие изменения в скетч для микроконтроллера, представленный ниже.

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

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

Стоит отметить, что если вы хотите продлить срок службы вашего сенсора, можно подключить его питание к цифровому пину и питать его только при считывании данных, а после — отключать. Если запитывать датчик постоянно, его чувствительные элементы вскоре начнут ржаветь. Чем больше влажность почвы, тем быстрее будет проходить коррозия. Еще один вариант – нанести гипс на датчик. В результате влага будет поступать, но коррозия значительно замедляется.

Программа для Arduino

Скетч достаточно простой. Для передачи данных на LCD дисплей вам необходимо подключить библиотеку Software Serial library. Если у вас в ее нет, скачать можно здесь: Arduino GitHub

Дополнительные пояснения приведены в комментариях к коду:

// Пример использования датчика уровня влажности почвы с LCD дисплеем.

// В скетче считываются данные с датчика и отображается уровень влажности почвы

// Для работы с дисплеем используется библиотека softwareserial library

#include

// Подключите пин для обмена данными с использованием LCD дисплея по серийному протоколу RX к цифровому пину 2 Arduino

SoftwareSerial mySerial(3,2); // pin 2 = TX, pin 3 = RX (не используется)

// Тут мы настраиваем некоторые константы.

// Настройка констант зависит от условий внешней среды, в которой используется датчик

int thresholdUp = 400;

int thresholdDown = 250;

// Настраиваем пин A0 на Arduino для работы с датчиком:

int sensorPin = A0;

void setup(){

mySerial.begin(9600); // устанавливаем скорость обмена данными на 9600 baud

delay(500); // ждем пока дисплей прогрузится

}

void loop(){

// Здесь мы объявляем строку, в которой хранятся данные для отображения

// на жидкокристаллическом дисплее. Значения будут изменяться

// в зависимости от уровня влажности почвы

String DisplayWords;

// В переменной sensorValue хранится аналоговое значение датчика с пина А0

int sensorValue;

sensorValue = analogRead(sensorPin);

// перемещение курсора к началу первой строки LCD дисплея:

mySerial.write(254);

mySerial.write(128);

// очистка дисплея:

mySerial.write(» «);

mySerial.write(» «);

// перемещение курсора к началу первой строки LCD дисплея:

mySerial.write(254);

mySerial.write(128);

// запись необходимой информации на дисплей:

mySerial.write(«Water Level: «);

mySerial.print(sensorValue); //Использование.print вместо .write для значений

// Теперь мы проведем проверку уровня влажности по сравнению с заданными нами предварительно числовыми константами.

// Если значение меньше thresholdDown, отображаем слова:

// «Dry, Water it!»

if (sensorValue

// перемещение курсора к началу второй строки дисплея:

mySerial.write(254);

mySerial.write(192);

DisplayWords = «Dry, Water it!»;

mySerial.print(DisplayWords);

// Если значение не ниже thresholdDown надо провести проверку, не будет

// ли оно больше нашего thresholdUp и, если, больше,

// отобразить надпись «Wet, Leave it!»:

} else if (sensorValue >= thresholdUp){

// перемещение курсора к началу второй строки дисплея:

mySerial.write(254);

mySerial.write(192);

DisplayWords = «Wet, Leave it!»;

mySerial.print(DisplayWords);

// Если полученное значение в диапазоне между минимальным и максимальным

// и почва была раньше влажной, а теперь сохнет,

// отображаем надпись «Dry, Water it!» (то есть, когда мы

// приближаемся к thresholdDown). Если почва была сухой, а теперь

//быстро увлажняется, отображаем слова «Wet, Leave it!» (то есть, когда мы

// приближаемся к thresholdUp):

} else {

// перемещение курсора к началу второй строки дисплея:

mySerial.write(254);

mySerial.write(192);

mySerial.print(DisplayWords);

}

delay(500); //Задержка в пол секунды между считываниями

}

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

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

Автоматический полив

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

Датчик уровня влажности в составе автоматической системы полива на основании Arduino:

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

Для автоматизации полива нам понадобятся дополнительные детали: возможно, шкивы, зубчатые шестерни, двигатель, муфта, транзисторы, резисторы. Список зависит от вашего проекта. Ну все, что может попасться под руку в быту. Более детально один из примеров показан ниже:

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

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

Схема подключения двигателя постоянного тока (статья с более подробным примером подключения двигателя к Arduino) на примере копии Arduino от SparkFun приведена ниже:

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

Ниже приведен скетч для Arduino (по сути он такой же как и приведенный выше с небольшим дополнением для управления двигателем):

// В скетче считываются данные с датчика и отображается уровень влажности почвы // если почва сухая, начинает работать двигатель

// Для работы с дисплеем используется библиотека softwareserial library

#include

// Подключите пин для обмена данными с использованием LCD дисплея по серийному протоколу RX к цифровому пину 2 Arduino

SoftwareSerial mySerial(3,2); // pin 2 = TX, pin 3 = RX (unused)

// Управляем двигателем с помощью пина 9.

// Этот пин должен обязательно поддерживать ШИМ-модуляцию.

const int motorPin = 9;

// Тут мы настраиваем некоторые константы.

// Настройка констант зависит от условий внешней среды, в которой используется датчик

int thresholdUp = 400;

int thresholdDown = 250;

// Настраиваем пин A0 на Arduino для работы с датчиком:

int sensorPin = A0;

void setup(){

pinMode(motorPin, OUTPUT); // устанавливаем пин, к которому подключен двигатель в качестве выхода

mySerial.begin(9600); // устанавливаем скорость обмена данными на 9600 baud

delay(500); // ждем пока дисплей прогрузится

}

void loop(){

// Здесь мы объявляем строку, в которой хранятся данные для отображения

// на жидкокристаллическом дисплее. Значения будут изменяться

// в зависимости от уровня влажности почвы

String DisplayWords;

// В переменной sensorValue хранится аналоговое значение датчика с пина А0

int sensorValue;

sensorValue = analogRead(sensorPin);

// перемещение курсора к началу первой строки LCD дисплея: mySerial.write(254);

mySerial.write(128);

// очистка дисплея:

mySerial.write(» «);

mySerial.write(» «);

// перемещение курсора к началу первой строки LCD дисплея: mySerial.write(254);

mySerial.write(128);

// запись необходимой информации на дисплей:

mySerial.write(«Water Level: «);

mySerial.print(sensorValue); //Использование.print вместо .write для значений

// Теперь мы проведем проверку уровня влажности по сравнению с заданными нами предварительно числовыми константами.

// Если значение меньше thresholdDown, отображаем слова:

// «Dry, Water it!»

if (sensorValue

// перемещение курсора к началу второй строки дисплея:

mySerial.write(254);

mySerial.write(192);

DisplayWords = «Dry, Water it!»;

mySerial.print(DisplayWords);

// запуск двигателя на небольших оборотах (0 – остановка, 255 – максимальная скорость):

analogWrite(motorPin, 75);

// Если значение не ниже thresholdDown надо провести проверку, не будет

// ли оно больше нашего thresholdUp и, если, больше,

// отобразить надпись «Wet, Leave it!»:

} else if (sensorValue >= thresholdUp){

// перемещение курсора к началу второй строки дисплея:

mySerial.write(254);

mySerial.write(192);

DisplayWords = «Wet, Leave it!»;

mySerial.print(DisplayWords);

// выключение двигателя (0 – остановка, 255 – максимальная скорость):

analogWrite(motorPin, 0);

// Если полученное значение в диапазоне между минимальным и максимальным

// и почва была раньше влажной, а теперь сохнет,

// отображаем надпись «Dry, Water it!» (то есть, когда мы

// приближаемся к thresholdDown). Если почва была сухой, а теперь

//быстро увлажняется, отображаем слова «Wet, Leave it!» (то есть, когда мы

// приближаемся к thresholdUp):

} else {

// перемещение курсора к началу второй строки дисплея:

mySerial.write(254);

mySerial.write(192);

mySerial.print(DisplayWords);

}

delay(500); //Задержка в пол секунды между считываниями

}

Удачи вам в реализации автоматического полива ваших растений!

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

1. Об устройстве

Для создания системы полива нам понадобиться:

  • Обрабатывающее устройство — по старой традиции у нас за него будет arduino uno
  • Датчик влажности почвы — модуль arduino
  • Помпа(Водяной насос) — водяной насос так же можно купить в Китае или сделать самому. По скольку напряжение помпы у меня 12 вольт включать буду с помощью реле.
  • Другие важные мелочи — шланг меленького диаметра, емкость для воды, провода, источник питания.

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

 2. Датчик влажности почвы

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

Датчик влажности почвы измеряет влажность и выводит аналоговым сигналом от 0 до 1023 либо цифровым(0 или 1). Мы будем использовать аналоговый сигнал для большего контроля меняющейся влажности. Значение 0 это максимум влажности, 1023 максимум сухой. Мы будем использовать значение 200 — достаточная влажность, значение 600 — критическая сухость. Пороги влажности и сухости при необходимости можно изменить в скетче arduino. Сам датчик состоит из двух частей: щуп(опускается в землю) и компаратор. Записывается датчик от 3.3 до 5 вольт, можно использовать встроенный разъем arduino.

Схема компаратора на LM393:

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

Данные получаются по сигнальному проводу a0 и подключается следующим образом:

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

3. Практическая реализация

Логика работы: раз в секунду(можно сделать более долгие промежутки) arduino получает значение влажности с датчика. При получении значения больше 550 и если помпа не работала ближайшие 15 минут arduino включает реле(к которому подключен насос) на время time_work. Задержка 15 минут между поливами сделана для того что бы влага успела впитаться в почву и помпа перекачала больше воды чем надо. Переменная time_work устанавливает время работы помпы, это время за которое ваш насос успеет выкачать нужное количество воды вашему растению.
После полива устанавливается задержка 15 минут для работы помпы, при этом arduino продолжает следить за влажностью. А дальше все циклично. Со временем сделаю датчик уровня воды, что бы помпа не включалась если в резервуаре мало воды и выдавалась индикация.

Схема подключения:

Собственно сам код:

 int minv = 600;//малая влажность int maxv = 220;//полный полив int normv = 500;//чуть влажная int value = 0;//полученное значение int last_value = 0;//последнее значимое изменение int value_sdvig =50;//значимое изменение  int ralay = 6; //пин реле int time_work = 10;//время работы помпы в сек int analogPin = A0;//пин датчика  //Переменные таймаута
int second = 0; // секунды
int time_off = 0; // счетчик оставшегося времени
int pause_time = 15; // время отдыха после полива в минутах void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(ralay,HIGH);//настройка реле
digitalWrite(ralay, HIGH);
} void poliv()
{
int time_tmp;
time_tmp=time_work;
digitalWrite(ralay, LOW);
while(time_tmp>0 && value>normv){// ждем истечения времени time_work или нормальной влажности почвы
delay(1000);
value=analogRead(analogPin);//обновляем значение влажности
time_tmp--;
}
digitalWrite(ralay, HIGH);
second=0; // сбрасываем секунды на ноль
time_off=pause_time;// устанавливаем задержку между поливами
} void loop() {
// put your main code here, to run repeatedly:
value=analogRead(analogPin);
if (value>(last_value+value_sdvig)||value(minv-value_sdvig)) && time_off критическая влажность - 50 и не было недавних поливов
// временные функции что бы не играться с таймерами
if (second>59)
{
second=0;
if (time_off>0) time_off--;
}
delay(1000);//пауза 1 сек
second++;
}

На сегодня всё, спасибо всем за внимание! Ждем ваших комментариев.

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

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

Рис 1. Вариант системы полива. Наша будет попроще. Но ознакомившись с принципом работы никто не мешает вам усовершенствовать ее.

Ардуино сможет помочь защитить ваши растения от пересыхания. Особенно актуальна такая система становится во время отпуска.

Нам понадобится:

Arduino unoНо можно и любой совместимый контроллер. К примеру контроллером типа Wemos вы сможете управлять с помощью сотового телефона. И сам модуль датчика почвы. Комапратор сигнала и провода для удобства подключения идут с ним в комплекте. Уровень сигнала выдаваемого компаратором LM393 и является показателем влажности почвы. Чем более влажная почва тем ниже уровень выходного сигнала.

Технические характеристики ардуино датчик влажности почвы:

Характеристики:Напряжение питания: 3.3В — 5ВМодуль с двойным режимом выхода: цифровой выход , аналоговый выход.Размер печатной платы: 3 см * 1.6 смКомпаратор: LM393.

Назначение выводов (4 провода):

1 VCC: К +5В2 GND: земля3 D0: цифровой выход (0 или 1)4 АО: Аналоговый выход (0-5B).

Подключение

На ножки VCC и GND модуля подаем +5 вольт и землю. Можно подключить к выходам Arduino или использовать другой источник питания. Во втором случае возможно потребуется

объединение земли у ардуино и второго блока питания.Ножку D_out (выходной сигнал данных) подключаем к D2 входу ардуино. Или к AO, если хотим получать аналоговое значение влажности. Сам датчик представляет из себя две полосы вырезанные из гетинакса, с нанесенными на него металлическими полосами. При помещении датчика в почву он измеряет сопротивление между штырями. Чем выше влажность почвы тем меньше сопротивление между штырями. Поворотный потенциометр на модуле позволяет изменять чувствительность датчика.Arduino и датчик влажности почвы.

Простая программа

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

Рис 2. Вариант с цифровым подключением.

Самый простой вариант работы полива — этот код включает выключает светодиод подключенный к выходы D13 арудино, в зависимости от данных поступивших на вход D2.
Соответственно подключив насос (через реле) к выходу D13 вы можете управлять поливом ваших зеленых питомцев. Чтобы настроить влажность при которой необходимо включить
полив подкрутите потенциометр.

#define Nasos 13 //Создаем указатель к порту 13#define Sensor 2 //Создаем указатель к порту 2void setup() { pinMode(nasos, OUTPUT); //Включаем порт насоса как выход pinMode(Sensor, INPUT); //Включаем порт датчика как вход}void loop() { if(digitalRead(Sensor) == HIGH){ //Если на порту датчика высокий уровень сигнала то.... digitalWrite(Nasos, HIGH); //Включаем насос } else { //Иначе digitalWrite(Nasos, LOW); //выключаем насос delay(1000); //Ждем 1 секунду }}

Что это такое?

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

Что для этого необходимо?

irrigator_all_in.jpg

Мы собрали все необходимые детали в сет компонентов. В набор входят:

  1. Растение в горшке с сухой землёй

Так же удобно для индикации использовать:

Как это собрать?

  1. Установите Troyka Shield на Arduino Uno irrigator_1.jpg

  2. Подключите датчик влажности почвы через Troyka Shield к аналоговому пину A0 irrigator_2.jpg

  3. Подключите дисплей к управляющей плате через Troyka Shiled:

    1. Пин cs к 9 пину Toyka Shield.

    2. Пины SPI дисплея к разъёму SPI на Troyka Shiled irrigator_3.jpg

  4. Подключите силовой ключ к контакту 4 irrigator_4.jpg

  5. Подведите коммутирующее напряжение к силовому ключу в разъём P+ и P− irrigator_5.jpg

  6. Подключите помпу к силовому ключу через клеммник с разъёмами L+ и L−. irrigator_6.jpg В итоге должна получится схема.

  7. Воткните сенсор влажности почвы в землю.

  8. Другой конец шланга вставьте с водой в землю. Если горшок с землёй весит менее 2 кг, рекомендуется отдельно закрепить трубку, чтобы она не перевернула растение.

  9. Опустите помпу в ёмкость с водой. irrigator_7.jpg

  10. Подключите питание.

Калибровка

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

  1. Запишите показания на дисплее при воткнутом в сухой горшок сенсоре. Это — минимум влажности.

  2. Полейте цветок и дождитесь пока вода полностью впитается в землю и показания сенсора установятся на одном уровне. Запишите их. Это — максимум влажности.

  3. В скетче исправьте значения константы HUMIDY_MIN на значение минимальной влажности и HUMIDY_MAX на значение максимальной влажности. Заново прошейте Arduino Uno.

Масштабирование решения

Мы описали решение для одного растения. Но обычно требуется поливать несколько растений. Помимо очевидного решения — подключения к Arduino нескольких помп и датчиков влажности — существует более простое и дешёвое. Достаточно в трубке, которая идёт в комплекте с помпой проделать шилом дырочки на расстоянии около 30 см и воткнуть в эти дырочки куски стержней от обычных шариковых ручек. Выглядеть это будет так:

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

Исходный код

Для работы скетча вам понадобиться скачать и установить библиотеку для работы с дисплеем QuadDisplay2

irrigator.ino
// Подключаем библиотеку для работы с дисплеем
#include "QuadDisplay2.h"
// даём разумное для пина, к которому подключена помпа
#define POMP_PIN        4
// даём разумное для пина, к которому подключён датчик влажности почвы
#define HUMIDITY_PIN    A0
// минимальный порог влажности почвы
#define HUMIDITY_MIN    200
// максимальный порог влажности почвы
#define HUMIDITY_MAX    700
// интервал между проверкой на полив растения
#define INTERVAL        60000 * 3   
// переменная для хранения показания влажности почвы
unsigned int humidity = 0;
 
// статическая переменная для хранения времени
unsigned long waitTime = 0;
 
// создаём объект класса QuadDisplay и передаём номер пина CS
QuadDisplay qd(9);
 
void setup(void)
{
  // начало работы с дисплеем
  qd.begin();
  // пин помпы в режим выхода
  pinMode(POMP_PIN, OUTPUT);
  // выводим 0 на дисплей
  qd.displayInt(0);
}
 
void loop(void)
{
  // считываем текущее показания датчика влажности почвы
  int humidityNow = analogRead(HUMIDITY_PIN);
  // если показания текущей влажности почвы
  // не равняется предыдущему запросу 
  if(humidityNow != humidity) {
    // сохраняем текущие показания влажности
    humidity= humidityNow;
    // и выводим показания влажности на дисплей
    qd.displayInt(humidityNow);
  }
  // если прошёл заданный интервал времени
  // и значения датчика влажности меньше допустимой границы
  if ((waitTime == 0 || millis() - waitTime > INTERVAL) && humidity  HUMIDITY_MIN ) {
    // включаем помпу
    digitalWrite(POMP_PIN, HIGH);
    // ждём 2 секунды
    delay(2000);
    // выключаем помпу
    digitalWrite(POMP_PIN, LOW);
    // приравниваем переменной waitTime
    // значение текущего времени плюс 3 минуты 
    waitTime = millis();
  }
}

Демонстрация работы устройства

Шаг 1: Компоненты и инструмент

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

Компоненты:

  • Ардуино
  • Датчик влажности почвы
  • Сервопривод (любой небольшой сервопривод подойдёт, даже небольшие приводы 9G, которые можно найти за копейки)
  • Водная трубка (если у вас нет её под рукой, то я покажу вам, как сделать её самостоятельно)
  • Стяжки для кабеля
  • Блок питания для Ардуино
  • Резервуар с водой (я приспособил коробку из-под молока)
  • Провода

Инструмент:

  • Пистолет с горячим клеем
  • Канцелярский нож
  • Моток пряжи
  • Плоскогубцы

Шаг 2: Делаем водную трубку

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

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

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

Шаг 3: Делаем источник воды

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

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

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

Шаг 4: Собираем электронику

В этом шаге мы создадим мозг нашего проекта и приведём систему к жизни. Соедините компоненты и микроконтроллер следующим образом:

  • Аналоговый выход 0 — пин датчика
  • Цифровой I/O 2 — «+» на датчике (этот пин настроен на питание датчика, нам не нужно макетных плат и можно соединить всё напрямую с Ардуино)
  • GND — GND на датчике
  • Цифровой I/O 3 — Оранжевый провод сервопривода
  • 5V — Красный провод сервопривода
  • GND — Коричневый провод сервопривода

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

Файлы

  • autoWater.ino

Обратите внимание на строки 6 и 7 — они калибруют датчик для вашего растения. Просто поменяйте значения на те, которые подходят вам, когда почва сухая и влажная (но без переизбытка воды).

Шаг 5: Подготавливаем сервопривод

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

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

Сначала я прикрепил сервопривод на горячий клей, но потом заменил крепление двусторонним скотчем — так проще регулировать его положение.

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

Шаг 6: Как всё работает

Итак, Ардуино следит за уровнем влажности в почве. Каждые 5 минут микроконтроллер делает 10 считываний данных с интервалом в 30 секунд. Эти данные используются для вычисления среднего значения для влажности почвы. Среднее значение рассчитывается для того, чтобы избавиться от огрехов при считывании показателей датчика.

Среднее значение сравнивается со значением, которое хранится в коде программы в строке 7. Если почва сухая. Ардуино опускает сервопривод, водная трубка разгибается и вода течёт в горшок.

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

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

Что такое автополив на «Ардуино»

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

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

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

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

Что понадобится для работы

Для сборки конструкции потребуются следующие элементы:

  1. Плата Arduino (например, модель UNO или Мега).
  2. Датчик уровня влажности почвы.
  3. Насос для воды.
  4. Шланг для прокачки жидкости (подводится напрямую в горшок или на грядку).
  5. Емкость для забора воды.
  6. Контактные кабели.
  7. Блок питания электронных компонентов.

Плата Arduino

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

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

Основные параметры и схема подключения

Датчик влажности состоит из щупа и компаратора. Сигнал может измеряться как в аналоговой форме (0 — максимум влажности, 1023 — минимум), так и в цифровой (0 — влажно, 1 — сухо). Для повышения точности лучше использовать аналоговую форму. Оптимально выбрать следующие параметры: 200 — нормальная влажность, 600 — предельная сухость. Эти показатели можно изменить в загружаемой в плату прошивке.

Схема подключения

1 вывод датчика подключается к аналоговому пину «Ардуино», 2 — к питанию (Vcc, GND), а оставшиеся 4 не соединяются ни с чем, т.к. цифровой сигнал не используется.

Вода из резервуара в систему будет подаваться при помощи насоса. Достаточно устройства на 12 В. Помпа должна работать в соответствии с выбранным типом полива растений. Оптимальный вариант — капельный.

Схема насосной станции состоит из:

  • мотора;
  • драйвера «двигатель-плата»;

Мотор 1 выводом подключается к драйверу, а другим — к собственному источнику питания в виде аккумулятора или батареи. Работающим двигателем подкачивается вода в трубки.

Драйвер подключается 1 выводом к информационному контакту «Ардуино», а 2 другими — к питанию (Vcc, GND).

Принцип работы автополива на базе мк «Ардуино»

Система автополива функционирует по принципу опроса платой датчика влажности земли. Каждую секунду (этот промежуток настраивается программой) датчик отправляет информацию о состоянии почвы микроконтроллеру.

Если принятое значение превышает 550, а помпа не работала более 15 минут, то активируется автополив. Время увлажнения прописывается в программе (в скетче за это отвечает переменная pomp_work).

Принцип работы автополива

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

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

Датчик можно подключить через драйвер к «Ардуино» и прописать в скетче условие: если уровень воды ниже *значение переменной*, то не подавать управляющий сигнал на помпу.

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

Пошаговая инструкция сборки

Элементы собираются в следующем порядке:

  1. В плату загружается скетч.
  2. «Ардуино» отключается от питания.
  3. К плате без питания подключаются насос и датчик.
  4. К выводам резервуара с жидкостью подсоединяются трубки для полива.
  5. Двигатель помпы подключается к автономному питанию.
  6. Емкость для орошения наполняется водой.
  7. К «Арудино» подводится питание.
  8. Активируется автополив.

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

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

Общие сведения об управляющих системах

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

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

Основой многих из подобных комплексов составляют контроллеры серии Arduino, STM, Ti MSP430, Netduino, Teensy, Particle Photon, ESP8266 или иных распространенных плат такого типа в мире. Кроме того, некоторые специалисты создают свои варианты микро — компьютеров, управляющих оборудованием — на основе устаревших ПК или каких-либо 8 разрядных процессоров, к примеру, Z80.

Чего бы хотелось

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

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

Мониторинг и настройка

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

Управление

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

Реализация в «железе»

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

Но сначала требуется сделать саму теплицу. Для основы была создана такая модель:

Вот ее перенос в реальность:

Мониторинг и настройка

Визуализация информации, а также пункты меню настройки выводятся на LCD1602 дисплей, с конвертором в IIC/I2C UC-146 для подключения его к Arduino.

Для выбора параметров используются 4 клавиши. Все это вместе желательно разместить в общем контрольном ящике.

Кроме визуального, для удаленного контроля будет использоваться модуль WIFI связи ESP8266 LoLin NodeMCU2, с помощью которого информация с использованием UDP протокола будет передаваться на домашний компьютер с настроенным web-сервером и базой данных. Которые впоследствии, можно будет получить на любом устройстве в общей сети — смартфоне, цифровом телевизоре или планшете.

Подключаться модуль к ардуино уно будет через серийный порт (RX/TX). Причем электрический контакт производится напрямую TX(модема)-TX(Arduino) и RX аналогично. Почему это важно — зачастую рекомендуют делать соединение перекрестным RX-TX. В прилагаемой схеме это не нужно.

Полив

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

Так он выглядит в реальности (вместе с системой подачи воды на грядки):

Его схема работы:

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

Отопление

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

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

Вентиляция

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

Освещение

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

На приведенной ниже схеме оно подключается к выводам резерв (освещение).

Управляющая электрическая схема

Ну и конечно самая главная часть — принципиальная схема «мозгов» всей этой конструкции.

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

Программная часть

С оборудованием все понятно. Осталось разобраться с программами, которые им управляют и контролируют состояние всей системы. Так как в комплексе есть два высокоинтеллектуальных устройства — ESS8266 и сам Arduino. Соответственно для обоих нужны свои программы. Помещение их в память устройств, в обоих случаях производится через Arduino IDE.

Мониторинг

Скетч, который необходимо выгрузить в ESP8266 LoLin NodeMCU, для обеспечения его связи с Arduino и WiFi роутером.

Скачать скетч

Управление

Ну и в финале, большой скетч управления самой теплицей, который выгружается в Arduino.

Скачать скетч

Замечания по конструкции

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

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

Заключение

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

Что такое Arduino?

Arduino — это бесплатная платформа с открытым кодом для быстрой разработки электронных устройств в домашних условиях. Она создана как для новичков в сфере программирования и электроники, так и для опытных разработчиков.

Arduino самая простая платформа для изучения и программирования микроконтроллеров. Программируется компьютером через USB и способна работать с аналоговыми и цифровыми датчиками.

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

Интересные проекты Arduino

Платформа Arduino

Платформа Arduino состоит из языка программирования (основанного на Wiring), программного обеспечения Arduino IDE (основанного на Processing) и непосредственно микроконтроллера и платы.

UNOArduino UNO —  самая популярная  плата для начала изучения электроники и программирования. Если Вы новичок, UNO будет хорошим выбором для начала. Эта плата построена на чипе ATmega328P,  имеет USB порт для подключения к ПК, разъем питания, большое количество плат расширения.

Leonardo

Arduino Leonardo — основана на ATmega32u4. Имеет 20 цифровых входов\выходов ( 7 из которых могут быть PWM выходами и 12 аналоговыми), micro USB, внешнее питание от AC/DC адаптера или батарейки. Содержит все необходимое для разработки на микроконтроллере.

Due

Arduino Due — первая плата основанная на 32 битном ARM микроконтроллере (Atmel SAM3X8E ARM Cortex-M3 CPU). Имеет 54 цифровых входов/выходов, 12 аналоговых входов. Идеально подходит к больших Arduino проектам.

MEGA 2560

MEGA 2560 — разработана для комплексных проектов, основана на  ATmega2560. Имеет 54 цифровых входов/выходов и 16 аналоговых входов, а также имеет больше места для кода. Рекомендован для разработки 3D принтеров и робототехники.

Nano

Arduino Nano — очень компактное и законченное решение, которое можно установить на макетную доску. Основан на ATmega328 (Arduino Nano 3.x) или ATmega168 (Arduino Nano 2.x). Подключается к ПК при помощи кабеля Mini-B USB.

Подключение Arduino

Установка Arduino IDE

Для подключения Arduino к Windows  необходимо скачать и установить Arduino IDE

Скачать для всех платформ

Arduino IDE

После установки запускаем программу и видим такое окно

IDE window

Если по какой-то причине программа не запустилась, скорей всего у вас не установлена JRE (Java Runtime Environment)

Подключение Arduino к компьютеру

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

После чего микроконтроллер запустит стандартную программу «Blink», при этом загорится светодиод «ON» и начнёт мигать светодиод «L».

Далее необходимо узнать к какому входу подключен Ардуино, для этого заходим Мой компьютер -> Диспетчер устройств -> Порты (COM и LPT) и смотрим к какому COM порту мы подключили устройство.

Подключение Arduino к ПК

Если у вас китайский Arduino или от неизвестного производителя, попробуйте установить этот драйвер вручную.  Драйвер для китайского Arduino CH341SER

Как проверить Ардуино

Открываем Arduino IDE, заходим Инструменты -> Порт -> Ваш COM-port

COM-port Arduino IDE

И выберем тип платы Инструменты -> Плата -> Тип вашей платы

Arduino IDE plata

Теперь загрузим первый скетч в память нашего Arduino, для этого выберем стандартную программу Blink Файл -> Образцы -> Basic -> Blink, которая заставит наш микроконтроллер мигать светодиодом «L» каждую секунду и нажмем кнопку «Вгрузить».

Arduino UNO Blink Test

Готово! Поздравляю, Вы научились программировать Arduino, не правда ли легко? Мы стали программистами, почему бы нам не написать свою программу…

Программирование Arduino

Чтобы написать свой скетч достаточно изменить delay на 500 и нажать «Вгрузить», теперь светодиод будет мигать с задержкой в пол секунды.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

// функция setup запускается только один раз, во время первого запуска программы

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

void setup() {

  //  настраиваем пин 13 как выход.

  pinMode(13, OUTPUT);

}

// функция - цикл, которая запускается снова и снова

void loop() {

  digitalWrite(13, HIGH);   // включить светодиод (HIGH - подает на выход 5 вольт)

  delay(500);              // задержка пол секунды

  digitalWrite(13, LOW);    // выключить светодиод (LOW - напряжение на выходе 0 вольт)

  delay(500);              // задержка пол секунды

}

Обзор датчика уровня влажности почвы

Подобные датчики подключаются достаточно просто. Два из трех коннекторов - это питание (VCC) и земля (GND). При использовании датчик желательно периодически отключать от источника питания, чтобы избежать возможного окисления. Третий выход - сигнал (sig), с которого мы и будем снимать показания. Два контакта датчика работают по принципу переменного резистора - чем больше влаги в почве, тем лучше контакты проводят электричество, падает сопротивление, сигнал на контакте SIG растет. Аналоговые значения могут отличаться в зависимости от напряжения питания и разрешающей способности ваших аналоговых пинов микроконтроллера.

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

Датчик уровня влажности почвы подключение 1 вариант

Второй вариант более гибкий:

Датчик уровня влажности почвы подключение 2 вариант

Ну и конечно можно напрямую запаять контакты на датчик.

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

Датчик уровня влажности почвы с нанесенным защитным покрытием на контактах и изолированными проводниками для подключения:

Датчик уровня влажности почвы

Проблема недолговечности датчика уровня влажности почвы

Один из недостатков датчиков подобного типа - недолговечность их чувствительных элементов. К примеру, компания Sparkfun решает эту проблему, используя дополнительное покрытие (Electroless Nickel Immersion Gold). Второй вариант продления срока действия сенсора - подавать на него питание непосредственно при снятии показаний. При использовании Arduino, все ограничивается подачей сигнала HIGH на пин, к которому подключен датчик. Если вы хотите запитать датчик большим напряжением чем предоставляет Arduino, всегда можно использовать дополнительный транзистор.

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

В приведенном ниже проекте использованы датчик уровня влажности, аналог платы Arduino - RedBoard и LCD дисплей, на котором выводятся данные про уровень влажности почвы.

В приведенном ниже проекте использованы датчик уровня влажности, аналог платы Arduino - RedBoard и LCD дисплей, на котором выводятся данные про уровень влажности почвы.

Датчик уровня влажности почвы компании SparkFun:

Датчик уровня влажности почвы sparkfun

Красный проводник (VCC) подключается к 5 В на Arduino, черный - к земле (GND), зеленый - сигнал - к аналоговому пину 0 (A0). Если вы используете другой аналоговый пин на Arduino, не забудьте внести соответствующие изменения в скетч для микроконтроллера, представленный ниже.

Датчик уровня влажности почвы и дисплей

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

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

Программа для Arduino

Скетч достаточно простой. Для передачи данных на LCD дисплей вам необходимо подключить библиотеку Software Serial library. Если у вас в ее нет, скачать можно здесь: Arduino GitHub

Дополнительные пояснения приведены в комментариях к коду:

// Пример использования датчика уровня влажности почвы с LCD дисплеем.

// В скетче считываются данные с датчика и отображается уровень влажности почвы

// Для работы с дисплеем используется библиотека softwareserial library

#include <SoftwareSerial.h>

// Подключите пин для обмена данными с использованием LCD дисплея по серийному протоколу RX к цифровому пину 2 Arduino

SoftwareSerial mySerial(3,2); // pin 2 = TX, pin 3 = RX (не используется)

// Тут мы настраиваем некоторые константы.

// Настройка констант зависит от условий внешней среды, в которой используется датчик

int thresholdUp = 400;

int thresholdDown = 250;

// Настраиваем пин A0 на Arduino для работы с датчиком:

int sensorPin = A0;

void setup(){

mySerial.begin(9600); // устанавливаем скорость обмена данными на 9600 baud

delay(500); // ждем пока дисплей прогрузится

}

void loop(){

// Здесь мы объявляем строку, в которой хранятся данные для отображения

// на жидкокристаллическом дисплее. Значения будут изменяться

// в зависимости от уровня влажности почвы

String DisplayWords;

// В переменной sensorValue хранится аналоговое значение датчика с пина А0

int sensorValue;

sensorValue = analogRead(sensorPin);

// перемещение курсора к началу первой строки LCD дисплея:

mySerial.write(254);

mySerial.write(128);

// очистка дисплея:

mySerial.write(" ");

mySerial.write(" ");

// перемещение курсора к началу первой строки LCD дисплея:

mySerial.write(254);

mySerial.write(128);

// запись необходимой информации на дисплей:

mySerial.write("Water Level: ");

mySerial.print(sensorValue); //Использование.print вместо .write для значений

// Теперь мы проведем проверку уровня влажности по сравнению с заданными нами предварительно числовыми константами.

// Если значение меньше thresholdDown, отображаем слова:

// "Dry, Water it!"

if (sensorValue

// перемещение курсора к началу второй строки дисплея:

mySerial.write(254);

mySerial.write(192);

DisplayWords = "Dry, Water it!";

mySerial.print(DisplayWords);

// Если значение не ниже thresholdDown надо провести проверку, не будет

// ли оно больше нашего thresholdUp и, если, больше,

// отобразить надпись "Wet, Leave it!":

} else if (sensorValue >= thresholdUp){

// перемещение курсора к началу второй строки дисплея:

mySerial.write(254);

mySerial.write(192);

DisplayWords = "Wet, Leave it!";

mySerial.print(DisplayWords);

// Если полученное значение в диапазоне между минимальным и максимальным

// и почва была раньше влажной, а теперь сохнет,

// отображаем надпись "Dry, Water it!" (то есть, когда мы

// приближаемся к thresholdDown). Если почва была сухой, а теперь

//быстро увлажняется, отображаем слова "Wet, Leave it!" (то есть, когда мы

// приближаемся к thresholdUp):

} else {

// перемещение курсора к началу второй строки дисплея:

mySerial.write(254);

mySerial.write(192);

mySerial.print(DisplayWords);

}

delay(500); //Задержка в пол секунды между считываниями

}

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

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

Обзор датчика уровня влажности почвы

Подобные датчики подключаются достаточно просто. Два из трех коннекторов - это питание (VCC) и земля (GND). При использовании датчик желательно периодически отключать от источника питания, чтобы избежать возможного окисления. Третий выход - сигнал (sig), с которого мы и будем снимать показания. Два контакта датчика работают по принципу переменного резистора - чем больше влаги в почве, тем лучше контакты проводят электричество, падает сопротивление, сигнал на контакте SIG растет. Аналоговые значения могут отличаться в зависимости от напряжения питания и разрешающей способности ваших аналоговых пинов микроконтроллера.

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

Датчик уровня влажности почвы подключение 1 вариант

Второй вариант более гибкий:

Датчик уровня влажности почвы подключение 2 вариант

Ну и конечно можно напрямую запаять контакты на датчик.

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

Датчик уровня влажности почвы с нанесенным защитным покрытием на контактах и изолированными проводниками для подключения:

Датчик уровня влажности почвы

Проблема недолговечности датчика уровня влажности почвы

Один из недостатков датчиков подобного типа - недолговечность их чувствительных элементов. К примеру, компания Sparkfun решает эту проблему, используя дополнительное покрытие (Electroless Nickel Immersion Gold). Второй вариант продления срока действия сенсора - подавать на него питание непосредственно при снятии показаний. При использовании Arduino, все ограничивается подачей сигнала HIGH на пин, к которому подключен датчик. Если вы хотите запитать датчик большим напряжением чем предоставляет Arduino, всегда можно использовать дополнительный транзистор.

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

В приведенном ниже проекте использованы датчик уровня влажности, аналог платы Arduino - RedBoard и LCD дисплей, на котором выводятся данные про уровень влажности почвы.

В приведенном ниже проекте использованы датчик уровня влажности, аналог платы Arduino - RedBoard и LCD дисплей, на котором выводятся данные про уровень влажности почвы.

Датчик уровня влажности почвы компании SparkFun:

Датчик уровня влажности почвы sparkfun

Красный проводник (VCC) подключается к 5 В на Arduino, черный - к земле (GND), зеленый - сигнал - к аналоговому пину 0 (A0). Если вы используете другой аналоговый пин на Arduino, не забудьте внести соответствующие изменения в скетч для микроконтроллера, представленный ниже.

Датчик уровня влажности почвы и дисплей

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

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

Программа для Arduino

Скетч достаточно простой. Для передачи данных на LCD дисплей вам необходимо подключить библиотеку Software Serial library. Если у вас в ее нет, скачать можно здесь: Arduino GitHub

Дополнительные пояснения приведены в комментариях к коду:

// Пример использования датчика уровня влажности почвы с LCD дисплеем.

// В скетче считываются данные с датчика и отображается уровень влажности почвы

// Для работы с дисплеем используется библиотека softwareserial library

#include <SoftwareSerial.h>

// Подключите пин для обмена данными с использованием LCD дисплея по серийному протоколу RX к цифровому пину 2 Arduino

SoftwareSerial mySerial(3,2); // pin 2 = TX, pin 3 = RX (не используется)

// Тут мы настраиваем некоторые константы.

// Настройка констант зависит от условий внешней среды, в которой используется датчик

int thresholdUp = 400;

int thresholdDown = 250;

// Настраиваем пин A0 на Arduino для работы с датчиком:

int sensorPin = A0;

void setup(){

mySerial.begin(9600); // устанавливаем скорость обмена данными на 9600 baud

delay(500); // ждем пока дисплей прогрузится

}

void loop(){

// Здесь мы объявляем строку, в которой хранятся данные для отображения

// на жидкокристаллическом дисплее. Значения будут изменяться

// в зависимости от уровня влажности почвы

String DisplayWords;

// В переменной sensorValue хранится аналоговое значение датчика с пина А0

int sensorValue;

sensorValue = analogRead(sensorPin);

// перемещение курсора к началу первой строки LCD дисплея:

mySerial.write(254);

mySerial.write(128);

// очистка дисплея:

mySerial.write(" ");

mySerial.write(" ");

// перемещение курсора к началу первой строки LCD дисплея:

mySerial.write(254);

mySerial.write(128);

// запись необходимой информации на дисплей:

mySerial.write("Water Level: ");

mySerial.print(sensorValue); //Использование.print вместо .write для значений

// Теперь мы проведем проверку уровня влажности по сравнению с заданными нами предварительно числовыми константами.

// Если значение меньше thresholdDown, отображаем слова:

// "Dry, Water it!"

if (sensorValue

// перемещение курсора к началу второй строки дисплея:

mySerial.write(254);

mySerial.write(192);

DisplayWords = "Dry, Water it!";

mySerial.print(DisplayWords);

// Если значение не ниже thresholdDown надо провести проверку, не будет

// ли оно больше нашего thresholdUp и, если, больше,

// отобразить надпись "Wet, Leave it!":

} else if (sensorValue >= thresholdUp){

// перемещение курсора к началу второй строки дисплея:

mySerial.write(254);

mySerial.write(192);

DisplayWords = "Wet, Leave it!";

mySerial.print(DisplayWords);

// Если полученное значение в диапазоне между минимальным и максимальным

// и почва была раньше влажной, а теперь сохнет,

// отображаем надпись "Dry, Water it!" (то есть, когда мы

// приближаемся к thresholdDown). Если почва была сухой, а теперь

//быстро увлажняется, отображаем слова "Wet, Leave it!" (то есть, когда мы

// приближаемся к thresholdUp):

} else {

// перемещение курсора к началу второй строки дисплея:

mySerial.write(254);

mySerial.write(192);

mySerial.print(DisplayWords);

}

delay(500); //Задержка в пол секунды между считываниями

}

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

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

Общее описание проекта

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

Вот таким образом выглядит система:

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

Часть 1. Датчики и Шильды

Этот проект состоит из следующих элементов:

  1. Датчик влажности почвы — 4 шт
  2. Шильд для управления насосами — 1 шт
  3. Насос — 1 шт
  4. Блок питания 12 В — 1 шт
  5. Блок на 4 клапана — 1 шт
  6. Куча трубок (на ваше усмотрение)
  7. Ардуино УНО — 1 шт

Чем удобен этот комплект?

  • Нету миллиона перемычек и километров проводов
  • Меньше беспорядка, больше производительности
  • Прост в использовании, подключай и пользуйся
  • Можно контролировать до 4 комнатных растений

Часть 2. Заливаем код в Arduino

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

Код есть во вставке, можете скопировать и залить в вашу плату.

Если впервые сталкиваетесь с платой Arduino, то про установку IDE и настройке написано в этой статье поподробнее.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

// установим все датчики влажности PIN ID

int moisture1 = A0;

int moisture2 = A1;

int moisture3 = A2;

int moisture4 = A3;

// объявим значения влажности

int moisture1_value = 0;

int moisture2_value = 0;

int moisture3_value = 0;

int moisture4_value = 0;

// установим выход реле для клапанов

int relay1 = 3;

int relay2 = 4;

int relay3 = 5;

int relay4 = 6;

// установим выход реле на насос

int pump = 2;

void setup() {

  // Объявим реле, как выход

  pinMode(relay1, OUTPUT);

  pinMode(relay2, OUTPUT);

  pinMode(relay3, OUTPUT);

  pinMode(relay4, OUTPUT);

  // Объявим насос, как выход

  pinMode(pump, OUTPUT);

  // Откроем порт для мониторинга

  Serial.begin(9600);  

}

void loop() {

// читаем значения с датчиков влажности

moisture1_value = analogRead(moisture1);

moisture2_value = analogRead(moisture2);

moisture3_value = analogRead(moisture3);

moisture4_value = analogRead(moisture4);

// проверяем, какое растение нуждается в воде

// и расскоментируйте нужную строчку для конкретного клапана

// установите значение требуемой влажности

//if(moisture1_value

// digitalWrite(relay1, HIGH);

//}

//if(moisture2_value

// digitalWrite(relay2, HIGH);

//}

//if(moisture3_value

// digitalWrite(relay3, HIGH);

//}

//if(moisture4_value

// digitalWrite(relay4, HIGH);

//}

digitalWrite(pump, HIGH);

digitalWrite(relay1, HIGH);

delay(500);

digitalWrite(relay2, HIGH);

delay(500);

digitalWrite(relay3, HIGH);

delay(500);

digitalWrite(relay4, HIGH);

delay(500);

digitalWrite(relay1, LOW);

delay(500);

digitalWrite(relay2, LOW);

delay(500);

digitalWrite(relay3, LOW);

delay(500);

digitalWrite(relay4, LOW);

digitalWrite(pump, LOW);

delay(500);

// убедитесь, что есть хотя бы одно растение, которое нуждается в воде

// если есть, включите насос

//if(moisture1_value

//  digitalWrite(pump, HIGH);

//}

// Оросите растение в течении 5 с

//delay(5000);

// Выключите насос

//digitalWrite(pump, LOW);

// Пройдитесь по каждому клапану и выключите их

//digitalWrite(relay1, LOW);

//digitalWrite(relay2, LOW);

//digitalWrite(relay3, LOW);

//digitalWrite(relay4, LOW);

// Подождите 5 минут и повторите процесс

//Serial.println(moisture1_value);

//delay(10000);

//delay(300000);

}

Как вы видите код в нашем случае является универсальным, тут достаточно раскомментировать нужные строчки.

1. Что такое датчик влажности почвы и как он работает?

датчик влажности почвы для Arduino

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

У всех подобных датчиков имеется 3 выхода – VCC (питание), GND (земля) и S (сигнальный выход). Из-за особенностей работы датчика и относительно небольшого его потребления, питать датчик желательно от цифрового пина микроконтроллера, включая лишь на время замера и выключая после него.

1.1 Подключение датчика к Arduino

Для подключения датчика к Arduino в комплекте обычно идут все необходимые компоненты:

  • Микросхема
  • Щуп для установки в почву
  • Провода для подключения

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

Один из возможных вариантов защиты – применение так называемой жидкой изоленты или обычного лака для ногтей, оба варианта справятся с задачей!

Подключение датчика влажности почвы к Arduino

1.2 Теория и специфика работы датчика

Измерение производится по простому принципу – на один из контактов датчика подаётся питание, а с другого оно считывается. Чем влажнее будет почва – тем меньше будет разница между двумя этими сигналами.

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

2. Практическое применение

Эта часть поделится на две вложенные части – просто считывание и отображение данных и реализация умного полива.

2.1 Считывание данных с модуля

В этом примере мы используем Arduino Uno, датчик влажности почвы и LCD-дисплей 16*2.

Так как пример не рассчитан на длительную работу, мы не будем защищать датчик отключением питания, а подключим его на пин+5 Arduino-платы; но мы настоятельно рекомендуем регулировать питание датчика, или, на худой конец, защитить контакты гипсом, это тоже работает.

Датчик необходимо подключить следующим образом:

  • красный провод (питание) +5В Arduino;
  • чёрный провод (земля) GND Arduino;
  • зелёный провод (сигнальный) A0 Arduino;

Вы можете подключить датчик к любому аналоговому пину Arduino, но не забудьте поменять пин в скетче, если используете не А0.

ЖК дисплей подключён к питанию +5В, земле и цифровому пину 2 (TX программной реализации UART).

Просим обратить внимание – это НЕ ОБЫЧНЫЙ  LCD 16*2! Это его немного изменённая версия с переходником на UART, что позволяет использовать всего 1 цифровой пин для управления. Обычный дисплей 16*2 подключить не получится, нужно менять код.

2.2 Программа для Arduino

Всё, что требуется – скопировать следующий код и залить его в Arduino.

Обратите внимание: вы должны иметь библиотеку SoftwareSerial для компиляции скетча, если её у вас нет, то её можно скачать на GitHub.

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

// Данный пример демонстрирует работу датчика уровня влажности почвы с LCD дисплеем 1602.

// В программе считываются все данные с датчика с выведением уровеня влажности почвы на дисплей

// Для работы с дисплеем используется библиотека softwareserial library

#include

// Подключите контакт для обмена данными с использованием LCD дисплея по серийному протоколу RX к цифровому контакту 2 Arduino

SoftwareSerial mySerial(3,2); // pin 2 = TX, pin 3 = RX (не используется)

// Здесь мы введем несколько констант

// Настройка констант зависит от условий внешней среды, в которой используется датчик

int upLevel = 400;

int downLevel = 250;

// Определяем контакт A0 на Arduino для работы с датчиком:

int sensorPin = A0;

void setup(){

mySerial.begin(9600); // устанавливаем скорость обмена данными на 9600 baud

delay(500); // ждем, пока наш дисплей загрузится

}

void loop(){

// Здесь мы объявляем строку, в которой хранятся данные для отображения на дисплее.

// Значения будут изменяться в зависимости от уровня влажности почвы

String DisplayWords;

// В переменной sensVolue хранится аналоговое значение датчика с контакта А0

int sensVolue;

sensVolue = analogRead(sensorPin);

// перемещаем курсор к началу первой строки дисплея:

mySerial.write(254);

mySerial.write(128);

// очищаем дисплей:

mySerial.write(" ");

mySerial.write(" ");

// перемещаем курсор к началу первой строки дисплея:

mySerial.write(254);

mySerial.write(128);

// выводим необходимую информацию на дисплей:

mySerial.write("Water Level: ");

mySerial.print(sensVolue); //Используем .print вместо .write для значений

// Теперь мы проведем проверку уровня влажности по сравнению с заданными нами предварительно числовыми константами.

// Если значение меньше downLevel, отображаем слова:

// "Dry, Water it!"

if (sensVolue downLevel){ // перемещение курсора к началу второй строки дисплея: mySerial.write(254); mySerial.write(192); DisplayWords = "Dry, Water it!"; mySerial.print(DisplayWords); // Если значение не ниже downLevel надо провести проверку, не будет ли оно больше нашего upLevel и, если, больше, отобразить надпись "Wet, Leave it!": } else if (sensVolue >= upLevel){

// перемещаем курсор к началу второй строки дисплея:

mySerial.write(254);

mySerial.write(192);

DisplayWords = "Wet, Leave it!";

mySerial.print(DisplayWords);

// Если полученное значение в диапазоне между мин. и макс. и почва была раньше влажной, а теперь сохнет, отображаем надпись "Dry, Water it!" (когда мы приближаемся к downLevel).

// Если почва была сухой, а теперь быстро увлажняется, отображаем слова "Wet, Leave it!" (когда мы приближаемся к upLevel):

} else {

// перемещаем курсор к началу второй строки дисплея:

mySerial.write(254);

mySerial.write(192);

mySerial.print(DisplayWords);

}

delay(500); // Ставим задержку в 500 миллисекунд между считываниями

}