Мы все стремимся сделать окружающие нас вещи «умными». Полив домашних растений не ислючение. Есть множество примеров умных теплиц, которые могут почти всё: регулировать влажность, измерять температуру, автоматически проветривать и прочие функции.

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

ЧТО ТАКОЕ ДАТЧИК ВЛАЖНОСТИ ПОЧВЫ И КАК ОН РАБОТАЕТ

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

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

ПОДКЛЮЧЕНИЕ ДАТЧИКА

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

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

СЧИТЫВАНИЕ ДАННЫХ

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

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

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

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

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

Внимание – в примере мы используем не обычный LCD 16*2!!! Это изменённая версия с переходником на UART – это позволяет использовать всего один цифровой пин для управления (обычный дисплей 16*2 так подключить не получится, нужно будет немного поменять код).

САМОЕ ИНТЕРЕСНОЕ В ПРОЕКТЕ – ПРОГРАММИРУЕМ ARDUINO

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

/* Пример демонстрирует работу датчика уровня влажности почвы с LCD дисплеем 1602.
В программе считываются данные с датчика и выведится уровень влажности почвы на дисплей.
Для работы с дисплеем используется библиотека softwareserial library */
#include <SoftwareSerial.h>
// Подключите контакт для обмена данными с использованием 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
  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 миллисекунд между считываниями
}

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

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

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