Датчик уровня влажности почвы и автоматический полив на Arduino
Хотели бы вы, чтобы ваши растения сообщали о том, что их надо полить? Или просто держали вас в курсе уровня влажности почвы?
В этой статье мы рассмотрим проект автоматизированного полива с использованием датчика уровня влажности почвы:
Обзор датчика уровня влажности почвы
Подобные датчики подключаются достаточно просто. Два из трех коннекторов - это питание (VCC) и земля (GND). При использовании датчик желательно периодически отключать от источника питания, чтобы избежать возможного окисления. Третий выход - сигнал (sig), с которого мы и будем снимать показания. Два контакта датчика работают по принципу переменного резистора - чем больше влаги в почве, тем лучше контакты проводят электричество, падает сопротивление, сигнал на контакте SIG растет. Аналоговые значения могут отличаться в зависимости от напряжения питания и разрешающей способности ваших аналоговых пинов микроконтроллера.
Для подключения датчика можно использовать несколько вариантов. Коннектор, приведенный на рисунке ниже:
Второй вариант более гибкий:
Ну и конечно можно напрямую запаять контакты на датчик.
Если вы планируете использовать датчик за пределами квартиры, стоит дополнительно задуматься о защите контактов от грязи и прямого попадания солнечных лучей. Возможно, стоит подумать о корпусе или нанесении защитного покрытия непосредственно на контакты датчика уровня влажности и проводники (смотрите на рисунок ниже).
Датчик уровня влажности почвы с нанесенным защитным покрытием на контактах и изолированными проводниками для подключения:
Проблема недолговечности датчика уровня влажности почвы
Один из недостатков датчиков подобного типа - недолговечность их чувствительных элементов. К примеру, компания Sparkfun решает эту проблему, используя дополнительное покрытие (Electroless Nickel Immersion Gold). Второй вариант продления срока действия сенсора - подавать на него питание непосредственно при снятии показаний. При использовании Arduino, все ограничивается подачей сигнала HIGH на пин, к которому подключен датчик. Если вы хотите запитать датчик большим напряжением чем предоставляет Arduino, всегда можно использовать дополнительный транзистор.
Контроль уровня влажности почвы - пример проекта
В приведенном ниже проекте использованы датчик уровня влажности, аналог платы Arduino - RedBoard и LCD дисплей, на котором выводятся данные про уровень влажности почвы.
В приведенном ниже проекте использованы датчик уровня влажности, аналог платы Arduino - RedBoard и LCD дисплей, на котором выводятся данные про уровень влажности почвы.
Датчик уровня влажности почвы компании 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 <= thresholdDown){
// перемещение курсора к началу второй строки дисплея:
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 от SparkFun приведена ниже:
Ниже приведен скетч для Arduino (по сути он такой же как и приведенный выше с небольшим дополнением для управления двигателем):
// В скетче считываются данные с датчика и отображается уровень влажности почвы
// если почва сухая, начинает работать двигатель
// Для работы с дисплеем используется библиотека softwareserial library
#include <SoftwareSerial.h>
// Подключите пин для обмена данными с использованием 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 <= thresholdDown){
// перемещение курсора к началу второй строки дисплея:
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); //Задержка в пол секунды между считываниями
}
Удачи вам в реализации автоматического полива ваших растений!