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

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

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

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

Подобные датчики подключаются достаточно просто. Два из трех коннекторов — это питание (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 секунду }}

Использование аналогового сигнала

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

Рис 3. Использование аналогового сигнала

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

С помощью этого датчика также можно узнать конкретный уровень влажности. Для этого нужно подключить аналоговый выход модуля AO к одному из аналоговых входов, например
A0, платы Arduino. Следующий тестовый код оповещает о влажности или сухости почвы с помощью двух светодиодов: зелёного и красного.

int Nasos= 13; //Создаем указатель к порту 13int Sensor= 0; //Создаем указатель к порту 0

int value = 0; // Создаем переменную для хранения текущей влажности

void setup() {

pinMode(Nasos, OUTPUT); //Включаем порт насоса как выход pinMode(Sensor, INPUT); //Включаем порт датчика как вход Serial.begin(9600); //Включаем серийный порт}

void loop() {

value = analogRead(Sensor); //читаем данные с датчика value = value / 10; // Делим на 10. Serial.println(value); // Отправляем значение в серийный порт. if (value < 50) //Если значение меньше 50 (влажная почва) { digitalWrite(Nasos, LOW); // Если почва влажная выключаем насос } else // Иначе { digitalWrite(Nasos, HIGH); // Если почва сухая включаем насос } delay(1000); // Ждем секунду}

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

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

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

Рис 4.Схема использования датчика влажности почвы без Arduino
Здесь транзистор 2N3906 управляет электромагнитным реле (RL1) для контроля мощной нагрузкой, например, двигателя водяного насоса.

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

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

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

1.1 Подключение датчика к 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.

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

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

// Данный пример демонстрирует работу датчика уровня влажности почвы с 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 = 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 миллисекунд между считываниями

}

3. Система автоматического полива на Arduino

Настало время применить полученные нами знания в серьёзном деле – сейчас мы соберем установку для автоматического полива растений при высыхании почвы до определённого уровня. Вот пример получившейся у нас установки:

Для автоматизации полива нам понадобится ещё кучка радио- и не только радиоэлементов! Вообще, ваша цель – сварганить насос для подачи воды, а вот как вы это сделаете – решайте сами.

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

В любом случае, для управления двигателем понадобится резистор (от 100 до 1000 Ом), полупроводниковый диод Шоттки и биполярный транзистор типа PNP.

Подробная схема подключения представлена ниже:

Естественно, потребуется еще и программа для работы проекта. Вот она:

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

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

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

#include

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

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

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

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

const int motorPin = 9;

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

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

int levelUp = 400;

int levelDown = 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);

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

mySerial.write(128);

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

mySerial.write(» «);

mySerial.write(» «);

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

mySerial.write(128);

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

mySerial.write(«Water Level: «);

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

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

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

// «Dry, Water it!»

if (sensorValue = levelUp){

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

mySerial.write(254);

mySerial.write(192);

DisplayWords = «Wet, Leave it!»;

mySerial.print(DisplayWords);

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

analogWrite(motorPin, 0);

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

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

} else {

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

mySerial.write(254);

mySerial.write(192);

mySerial.print(DisplayWords);

}

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

}

Товары, используемые в материале

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *