Как работает датчик уровня воды и его подключение к Arduino

Как работает датчик уровня воды и его подключение к Arduino

Вы когда-нибудь задумывались, как автоматические резервуары для воды знают, когда прекратить наполнение? Или как системы оповещения о наводнениях определяют, что уровень воды поднимается до опасного уровня? Всё это благодаря простым, но хитроумным датчикам, которые могут «чувствовать» присутствие воды.

Один из самых простых и удобных для начинающих датчиков для экспериментов — это датчик уровня воды. В сочетании с Arduino он открывает целый мир интересных и практических проектов!

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

Давайте начнём!

Обзор оборудования

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

В основе этого датчика лежит NPN-транзистор S8050, который работает как переключатель.

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

  • Один набор из пяти дорожек подключён к источнику питания +5В через резистор 100 Ом.

  • Другой набор подключён к базе транзистора.

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

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

Принципиальная схема

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

Как работает датчик уровня воды и его подключение к Arduino

Как работает датчик уровня воды?

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

Когда датчик сухой, медные дорожки отделены друг от друга воздухом. Это означает, что электрический ток между дорожками не протекает. В результате ток не поступает в базу NPN-транзистора, и транзистор остаётся выключенным, подобно разомкнутому переключателю. Поскольку транзистор выключен, электричество не может протекать от его коллектора (подключённого к +5 вольт) к эмиттеру (подключённому к земле через резистор 100 Ом). Поскольку эмиттер также подключён к выходному выводу датчика (OUT), выход показывает 0 вольт (LOW).

Однако, когда вода касается медных дорожек, она создаёт проводящий мостик между ними, поскольку вода, особенно с растворёнными минералами и примесями, может проводить небольшой электрический ток. Этот небольшой ток от дорожек поступает в базу транзистора. Это включает транзистор. После активации транзистора он позволяет гораздо большему току протекать от +5 вольт через транзистор к эмиттеру и далее на землю через резистор 100 Ом. Поскольку вывод OUT подключён между эмиттером транзистора и этим резистором, напряжение на выводе OUT повышается в сторону +5 вольт.

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

Как работает датчик уровня воды и его подключение к Arduino

Этот аналоговый выходной сигнал обычно подаётся на микроконтроллер (такой как Arduino), который использует свой аналого-цифровой преобразователь (АЦП) для преобразования аналогового сигнала в цифровое значение. Это цифровое значение представляет уровень воды.

Распиновка датчика уровня воды

Давайте рассмотрим распиновку:

Как работает датчик уровня воды и его подключение к Arduino

S (Signal) — аналоговый выходной вывод. Он выдаёт напряжение, пропорциональное уровню воды. Подключите этот вывод к одному из аналоговых входных пинов Arduino.

  • (VCC) — вывод питания датчика. Лучше всего питать датчик напряжением от 3.3В до 5В. Имейте в виду, что аналоговое выходное значение будет меняться в зависимости от подаваемого напряжения.

– (GND) — вывод заземления.

Подключение датчика уровня воды к Arduino

Подключить датчик уровня воды к Arduino очень просто! У него всего три вывода, которые нужно подключить:

Сначала подключите вывод + (VCC) модуля датчика к пину 5V на Arduino, а вывод – (GND) — к одному из пинов GND на Arduino.

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

Чтобы избежать этой проблемы, рекомендуется подавать питание на датчик только тогда, когда нужно снять показание. Простой способ сделать это — подключить вывод питания датчика к одному из цифровых выходных пинов Arduino, а затем устанавливать этот пин в HIGH или LOW в коде по мере необходимости.

Поэтому вместо подключения вывода VCC напрямую к 5В мы подключим его к цифровому пину #7 на Arduino. Таким образом, Arduino может управлять, когда датчик получает питание.

Наконец, подключите вывод S (Signal) датчика к аналоговому входному пину A0 на Arduino.

В следующей таблице перечислены подключения:

Water Level SensorArduino
+7
GND
SA0

Подключение показано на изображении ниже.

Как работает датчик уровня воды и его подключение к Arduino

Базовый пример для Arduino

После сборки схемы следующий шаг — загрузить скетч в плату Arduino.

// Sensor pins
#define sensorPower 7
#define sensorPin A0

// Value for storing water level
int val = 0;

void setup() {
  // Set D7 as an OUTPUT
  pinMode(sensorPower, OUTPUT);

  // Set to LOW so no power flows through the sensor
  digitalWrite(sensorPower, LOW);

  Serial.begin(9600);
}

void loop() {
  //get the reading from the function below and print it
  int level = readSensor();

  Serial.print("Water level: ");
  Serial.println(level);

  delay(1000);
}

//This is a function used to get the reading
int readSensor() {
  digitalWrite(sensorPower, HIGH);  // Turn the sensor ON
  delay(10);                        // wait 10 milliseconds
  val = analogRead(sensorPin);      // Read the analog value form sensor
  digitalWrite(sensorPower, LOW);   // Turn the sensor OFF
  return val;                       // send current reading
}

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

Как работает датчик уровня воды и его подключение к Arduino

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

Объяснение кода

Скетч начинается с объявления пинов Arduino, подключённых к датчику. Вывод, обозначенный + (VCC) на датчике, подключён к пину 7 на Arduino, а вывод S (сигнал) — к аналоговому входному пину A0.

#define sensorPower 7
#define sensorPin A0

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

int val = 0;

В секции setup() мы сообщаем Arduino, что пин 7 является выходом, поскольку он будет управлять питанием датчика. Мы также устанавливаем этот пин в LOW изначально, чтобы датчик был выключен при запуске программы. Затем запускаем последовательную связь, чтобы отправлять показания в монитор последовательного порта и видеть их на экране.

pinMode(sensorPower, OUTPUT);
digitalWrite(sensorPower, LOW);
Serial.begin(9600);

В секции loop() пользовательская функция readSensor() вызывается каждую секунду. Результат этой функции выводится в монитор последовательного порта как текущее показание уровня воды.

Serial.print("Water level: ");
Serial.println(readSensor());
delay(1000);

Функция readSensor() — это место, где происходит фактическое считывание датчика. Она включает датчик, устанавливая пин питания в HIGH, ждёт 10 миллисекунд для стабилизации датчика, считывает аналоговое значение с сигнального вывода, затем выключает датчик, устанавливая пин питания в LOW. Наконец, она возвращает считанное значение, чтобы основная программа могла его использовать.

int readSensor() {
  digitalWrite(sensorPower, HIGH);  // Turn the sensor ON
  delay(10);                        // wait 10 milliseconds
  val = analogRead(sensorPin);      // Read the analog value form sensor
  digitalWrite(sensorPower, LOW);   // Turn the sensor OFF
  return val;                       // send current reading
}

Определение пороговых значений

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

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

Имейте в виду, что показания датчика могут отличаться в зависимости от типа воды, которую вы используете. Например, чистая дистиллированная вода плохо проводит электричество, поскольку в ней нет минералов; именно растворённые минералы и примеси в воде позволяют электричеству проходить через неё.

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

  • Когда датчик сухой, показание равно 0.

  • Когда датчик частично погружён, показание около 420.

  • Когда датчик полностью погружён, показание возрастает примерно до 520.

Как работает датчик уровня воды и его подключение к Arduino

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

Проект Arduino — индикатор уровня воды

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

Подключение

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

Подключите три светодиода к цифровым пинам 2, 3 и 4 на Arduino. Используйте резисторы 220 Ом с каждым светодиодом для защиты от избыточного тока. Следуйте схеме подключения, показанной ниже, для завершения сборки.

Как работает датчик уровня воды и его подключение к Arduino

Код Arduino

Когда схема готова, загрузите новый скетч в Arduino. В этом коде мы определяем две важные переменные: lowerThreshold и upperThreshold. Эти значения помогают определить, какой уровень воды считается низким, средним или высоким.

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

// Sensor pins
#define sensorPower 7
#define sensorPin A0

// Value for storing water level
int val = 0;

/* Change these values based on your calibration values */
int lowerThreshold = 420;
int upperThreshold = 520;

// Declare pins to which LEDs are connected
int redLED = 2;
int yellowLED = 3;
int greenLED = 4;

void setup() {
  Serial.begin(9600);
  pinMode(sensorPower, OUTPUT);
  digitalWrite(sensorPower, LOW);

  // Set LED pins as an OUTPUT
  pinMode(redLED, OUTPUT);
  pinMode(yellowLED, OUTPUT);
  pinMode(greenLED, OUTPUT);

  // Initially turn off all LEDs
  digitalWrite(redLED, LOW);
  digitalWrite(yellowLED, LOW);
  digitalWrite(greenLED, LOW);
}

void loop() {
  int level = readSensor();

  if (level == 0) {
    Serial.println("Water Level: Empty");
    digitalWrite(redLED, LOW);
    digitalWrite(yellowLED, LOW);
    digitalWrite(greenLED, LOW);
  } else if (level > 0 && level <= lowerThreshold) {
    Serial.println("Water Level: Low");
    digitalWrite(redLED, HIGH);
    digitalWrite(yellowLED, LOW);
    digitalWrite(greenLED, LOW);
  } else if (level > lowerThreshold && level <= upperThreshold) {
    Serial.println("Water Level: Medium");
    digitalWrite(redLED, LOW);
    digitalWrite(yellowLED, HIGH);
    digitalWrite(greenLED, LOW);
  } else if (level > upperThreshold) {
    Serial.println("Water Level: High");
    digitalWrite(redLED, LOW);
    digitalWrite(yellowLED, LOW);
    digitalWrite(greenLED, HIGH);
  }
  delay(1000);
}

//This is a function used to get the reading
int readSensor() {
  digitalWrite(sensorPower, HIGH);
  delay(10);
  val = analogRead(sensorPin);
  digitalWrite(sensorPower, LOW);
  return val;
}

Объяснение кода

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

// Sensor pins
#define sensorPower 7
#define sensorPin A0

// Value for storing water level
int val = 0;

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

int lowerThreshold = 420;
int upperThreshold = 520;

Далее мы объявляем пины, подключённые к красному, жёлтому и зелёному светодиодам.

int redLED = 2;
int yellowLED = 3;
int greenLED = 4;

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

pinMode(sensorPower, OUTPUT);
digitalWrite(sensorPower, LOW);

Затем мы настраиваем пины светодиодов как выходы и убеждаемся, что все они выключены в начале.

// Set LED pins as an OUTPUT
pinMode(redLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(greenLED, OUTPUT);

// Initially turn off all LEDs
digitalWrite(redLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(greenLED, LOW);

В секции loop() мы вызываем ту же пользовательскую функцию readSensor() для снятия показаний с датчика уровня воды и сохраняем результат в переменной level.

int level = readSensor();

Затем мы сравниваем значение level с пороговыми значениями с помощью серии условных операторов if...else. Если датчик сухой и показание равно нулю, все светодиоды остаются выключенными. Если есть немного воды и показание ниже нижнего порога, загорается красный светодиод. Если уровень воды выше и находится между двумя порогами, загорается жёлтый светодиод. Если датчик преимущественно или полностью погружён и показание выше верхнего порога, загорается зелёный светодиод.

if (level == 0) {
  Serial.println("Water Level: Empty");
  digitalWrite(redLED, LOW);
  digitalWrite(yellowLED, LOW);
  digitalWrite(greenLED, LOW);
} else if (level > 0 && level <= lowerThreshold) {
  Serial.println("Water Level: Low");
  digitalWrite(redLED, HIGH);
  digitalWrite(yellowLED, LOW);
  digitalWrite(greenLED, LOW);
} else if (level > lowerThreshold && level <= upperThreshold) {
  Serial.println("Water Level: Medium");
  digitalWrite(redLED, LOW);
  digitalWrite(yellowLED, HIGH);
  digitalWrite(greenLED, LOW);
} else if (level > upperThreshold) {
  Serial.println("Water Level: High");
  digitalWrite(redLED, LOW);
  digitalWrite(yellowLED, LOW);
  digitalWrite(greenLED, HIGH);
}