Андрей Смирнов
Время чтения: ~13 мин.
Просмотров: 7

Ёмкостный датчик уровня жидкости: подключение, примеры работы

Содержание:

  • Обзор
  • Технические характеристики модуля
  • Пример использования
  • Часто задаваемые вопросы FAQ

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

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

arduio-Datchik-urovnya-vody.jpg

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

  • + – питание датчика;
  • — – земля;
  • S — аналоговое значение.

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

Технические характеристики модуля

  • Напряжение питания: 3.3-5 В;
  • Ток потребления 20 мА;
  • Выход: аналоговый;
  • Зона обнаружения: 16×30 мм;
  • Размеры: 62×20×8 мм;
  • Рабочая температура: 10 – 30 °С.

Пример использования

Рассмотрим подключение датчика уровня воды к Arduino. Создадим проект звуковой сигнализации затопления помещения. При погружении датчика в воду, сигнализация издает три вида звуковых сигналов (небольшое затопление, средний уровень, критический уровень), соответствуюший трем уровням воды. Для воспроизведения звуковых можно к цифровому выводу подключить пьезоизлучатель —  электроакустическое устройства воспроизведения звука. Но при этом звук получается очень тихий. Чтобы получить громкость более приличного уровня, к цифровому выводу Arduino динамик, но не напрямую, а через транзистор. Для проекта нам понадобятся следующие детали:

  • Плата Arduino Uno
  • Датчик уровня воды
  • Динамик 8 Ом
  • Резистор 500 Ом
  • Транзистор КТ503е
  • Соединительные провода

Соберем схему, показанную на рисунке.

WaterLevelSensor-arduino.jpg

Запустим Arduino IDE. Создадим новый скетч и внесем в него следующие строчки Аналоговый вывод датчика подключен к аналоговому входу Arduino,  который представляет собой  аналого-цифровой преобразователь (АЦП) с разрешением  10 бит, что позволяет на выходе получать значения от 0 до 1023. Значение аналоговых сигналов на аналоговом входе Arduino для трех уровней погружения были определены экспериментальным путем: > 400 – минимальное погружение; > 500 – средний уровень погружения; > 600 – большое погружение. Соответственно для каждого уровня погружения на динамике воспроизводится звуковой сигнал разной частоты: минимальное погружение – 293 Гц (нота ре 1 октавы); средний уровень погружения – 466 Гц (нота си-бимоль 1 октавы); большое погружение – 587 Гц (нота ре 2 октавы). При отсутствии погружения звуковой сигнал на динамике не воспроизводится.

Часто задаваемые вопросы FAQ

1. Не горит светодиод питания

  • Проверьте наличие и полярность подаваемого на датчик питания (3,3 – 5 В).

2. При погружении в воду не изменяется значение выходного аналогового сигнала

  • Проверьте соединение датчика с входом Arduino.
  • Проверьте наличие и полярность подаваемого на датчик питания (3,3 – 5 В).

 

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

arduino-atmega-328p.jpg

Когда может пригодиться?

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

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

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

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

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

Этот индикатор уровня воды Ардуино использует ультразвуковой датчик или, по-другому, Ping датчик для определения уровня воды в баке. Датчик Ping измеряет расстояние, используя гидролокатор.

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

Этот проект может быть реализован на одной из плат Arduino, если микроконтроллером платы является непосредственно микроконтроллер ATmega 328.

Комплектующие

По традиции переходим к комплектующим, набор деталей довольно большой:

1 Микроконтроллер ATMega328P или плата Arduino
1 HC-SR04 ультразвуковой модуль (также известный как датчик PING)
1 10K резистор
1 Кристалл 16 МГц
2 22pf дисковые конденсаторы
Провода-перемычки
1 Регулятор LM7805 5V
1 9В батарея и разъем
1 Электролитический конденсатор 10uF
1 Макетная плата (или печатная плата)
1 Инструмент для зачистки проводов

Схема соединений

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

Скетч для Ардуино

Скопируйте прилагаемый ниже скетч в Arduino IDE и найдите строку «int d = 18;» и измените «18» на глубину вашего резервуара в сантиметрах.

// Обратите внимание, что нумерация контактов arduino   // отличается от выводов микроконтроллера    int d = 18; // Введите глубину вашего резервуара в сантиметрах    int trig = 11; // Прикрепите триггер ультразвукового датчика к пину 11  int echo = 10; // Прикрепите эхо ультразвукового датчика к контакту 10  int pin1 = 2; // Высший уровень  int pin2 = 3;  int pin3 = 4;  int pin4 = 5;  int pin5 = 6;  int pin6 = 7; // Самый низкий уровень    void setup() {  pinMode (pin1, OUTPUT); // Установка контактов для управления вводом / выводом  pinMode (pin2, OUTPUT);  pinMode (pin3, OUTPUT);  pinMode (pin4, OUTPUT);  pinMode (pin5, OUTPUT);  pinMode (pin6, OUTPUT);  }    void loop()  { digitalWrite(pin1, LOW); // Сброс светодиодов  digitalWrite(pin2, LOW);  digitalWrite(pin3, LOW);  digitalWrite(pin4, LOW);  digitalWrite(pin5, LOW);  digitalWrite(pin5, LOW);    // Установите переменные для продолжительности пинга,  // и расстояние в дюймах и сантиметрах:    long duration, in, cm; // 'in' - дюймы и 'cm' - сантиметры    // PING запускается HIGH-импульсом в 2 или более микросекундах.  // Дайте короткий LOW импульс заранее, чтобы обеспечить чистый HIGH-импульс:    pinMode(trig, OUTPUT);  digitalWrite(trig, LOW);  delayMicroseconds(2);  digitalWrite(trig, HIGH);  delayMicroseconds(5);  digitalWrite(trig, LOW);    // Этот же вывод используется для считывания сигнала от PING:   // HIGH-импульс, продолжительность которого - это время (в микросекундах)   // от отправки пинга до приема его эха от объекта    pinMode(echo, INPUT);  duration = pulseIn(echo, HIGH);    // Преобразовать время в расстояние    in = microsecondsToInches(duration);  cm = microsecondsToCentimeters(duration);    delay(100);   if (in < 6 * d / 7)  digitalWrite(pin1, HIGH);  else if (in < 5 * d / 6)  digitalWrite(pin2, HIGH);  else if (in < 4 * d / 6)  digitalWrite(pin3, HIGH);  else if (in < 3 * d / 6)  digitalWrite(pin4, HIGH);  else if (in < 2 * d / 6)  digitalWrite(pin5, HIGH);  else if (in < 1 * d / 6)  digitalWrite(pin5, HIGH);  }    long microsecondsToInches(long microseconds)  {  // Согласно таблице Parallax для PING, есть 73.746 микросекунд на дюйм   // (т.е. звук перемещается со скоростью 1130 футов в секунду).   // Это дает расстояние, пройденное пингом, исходящим и возвратным,   // поэтому мы делимся на 2, чтобы получить расстояние от препятствия.    return microseconds / 74 / 2;  }    long microsecondsToCentimeters(long microseconds)  {  // Скорость звука составляет 340 м/с или 29 микросекунд на сантиметр.   // Пинг выходит и обратно, поэтому, чтобы найти расстояние от объекта,   // мы берем половину пройденного расстояния.    return microseconds / 29 / 2;  }

Загрузите код для индикатора уровня воды Arduino непосредственно на плату Arduino или в микроконтроллер ATMega328P.

Ультразвуковой датчик и водный резервуар

Закрепите датчик так, чтобы он непосредственно смотрел на воду в баке. Основная плата управления со светодиодами может быть закреплена внутри дома в любом удобном положении. Любые многожильные кабели (Ethernet-кабель) могут использоваться для соединения датчика и остальной части схемы.

Имейте в виду, что очень не рекомендуется иметь расстояние между компонентами более 20 метров.

Теперь просто подключите аккумулятор (питание) и ваш индикатор уровня воды Ардуино готов к использованию.

Добавлено 5 марта 2020 в 22:15

Если вы когда-нибудь взрывали водонагреватель или когда-либо пытались изготовить погружную электронику, то знаете, как важно определить, есть ли вокруг вода. С этим датчиком уровня воды сделать это очень просто!

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

bcf3edc3be908f4bd9019a14cace7a133d318727.jpeg
Как работает датчик уровня воды и его взаимодействие с Arduino

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

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

Обычно эти дорожки не соединены между собой, но при погружении они соединяются водой.

fb04ff237e99d1c03fd9cd8a1a6407ca13bcb44d.jpeg
Рисунок 1 – Датчик уровня воды

На плате расположен индикатор питания, который загорается при подаче на плату напряжения питания.

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

Ряд открытых параллельных проводников вместе действует как переменный резистор (потенциометр), сопротивление которого изменяется в зависимости от уровня воды.

Изменение сопротивления соответствует расстоянию от верхушки датчика до поверхности воды.

Рисунок 2 – Демонстрация работы датчика уровня воды

Сопротивление обратно пропорционально высоте воды:

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

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

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

8109554bf4f404943927d8680ef3778453ac964a.png
Рисунок 3 – Распиновка датчика уровня воды

Вывод S (Signal) – это аналоговый выход, который будет подключен к одному из аналоговых входов вашей платы Arduino.

Вывод + (VCC) обеспечивает питание датчика. Датчик рекомендуется питать напряжением от 3,3 до 5 В. Обратите внимание, что напряжение на аналоговом выходе будет зависеть от того, какое напряжение питания подается на датчик.

— (GND) – земля.

Давайте подключим датчик уровня воды к Arduino.

Сначала вам нужно подать питание на датчик. Для этого вы можете подключить вывод +(VCC) на модуле к выводу 5V на Arduino, а вывод -(GND) модуля к выводу GND Arduino.

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

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

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

Наконец, подключите вывод S (Signal) к выводу A0 аналого-цифрового преобразователя Arduino.

Схема соединений показана на следующем рисунке.

ccb738bb2f14625e8c90712ba471fb8debc15a66.png
Рисунок 4 – Схема подключения датчика уровня воды к Arduino

После того, как схема будет собрана, загрузите в Arduino следующий скетч.

// Выводы, подключенные к датчику  #define sensorPower 7  #define sensorPin A0    // Переменная для хранения значения уровня воды  int val = 0;    void setup()   {    // Настраиваем D7 на выход    pinMode(sensorPower, OUTPUT);      // Устанавливаем низкий уровень, чтобы на датчик не подавалось питание    digitalWrite(sensorPower, LOW);      Serial.begin(9600);  }    void loop()   {    // получить показания из функции ниже и напечатать его    int level = readSensor();      Serial.print("Water level: ");    Serial.println(level);      delay(1000);  }    // Данная функция используется для получения показаний  int readSensor()   {    digitalWrite(sensorPower, HIGH);  // Включить датчик    delay(10);                        // Ждать 10 миллисекунд    int val = analogRead(sensorPin);  // Прочитать аналоговое значение от датчика    digitalWrite(sensorPower, LOW);   // Выключить датчик    return val;                       // Вернуть текущее показание  }

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

07b81013ae409d491498b151ca98089233494db1.png
Рисунок 5 – Вывод показаний датчика уровня воды

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

Объяснение

Скетч начинается с объявления выводов Arduino, к которым подключены выводы датчика + (VCC) и S (сигнал).

#define sensorPower 7  #define sensorPin A0

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

int val = 0;

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

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

В функции loop() мы периодически вызываем функцию readSensor() с интервалом в одну секунду и выводим возвращаемое значение.

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

Функция readSensor() используется для получения текущего уровня воды. Она включает датчик, ждет 10 миллисекунд, считывает аналоговое значение с датчика, выключает датчик и затем возвращает аналоговое значение.

int readSensor()   {    digitalWrite(sensorPower, HIGH);  // Включить датчик    delay(10);                        // Ждать 10 миллисекунд    int val = analogRead(sensorPin);  // Прочитать аналоговое значение от датчика    digitalWrite(sensorPower, LOW);   // Выключить датчик    return val;                       // Вернуть текущее показание  }

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

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

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

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

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

  • когда датчик сухой: 0;
  • когда он частично погружен в воду: ~420;
  • когда он полностью погружен: ~520.
de75d859d651d0e7b498f5abdedfd362fc2e77f7.png
Рисунок 6 – Калибровка датчика уровня воды

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

Проект определения уровня воды

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

Схема соединений

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

Подключите три светодиода к цифровым выводам 2, 3 и 4 через токоограничивающие резисторы 220 Ом.

Соберите схему, как показано ниже:

6f63c8688bc8b9f99dab770b51e7269d0e25e08f.png
Рисунок 7 – Индикация уровня воды с помощью светодиодов

Код Arduino

После того, как схема будет собрана, загрузите в Arduino следующий скетч.

В этом скетче объявлены две переменные, а именно lowerThreshold и upperThreshold. Эти переменные представляют наши пороговые уровни.

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

/* Измените эти значения, основываясь на своих значениях калибровки */  int lowerThreshold = 420;  int upperThreshold = 520;    // Выводы, подключенные к датчику  #define sensorPower 7  #define sensorPin A0    // Переменная для хранения значения уровня воды  int val = 0;    // Объявляем выводы, к которым подключены светодиоды  int redLED = 2;  int yellowLED = 3;  int greenLED = 4;    void setup()   {    Serial.begin(9600);    pinMode(sensorPower, OUTPUT);    digitalWrite(sensorPower, LOW);      // Настроить выводы светодиодов на выход    pinMode(redLED, OUTPUT);    pinMode(yellowLED, OUTPUT);    pinMode(greenLED, OUTPUT);      // Изначально выключить все светодиоды    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);  }    // Данная функция используется для получения показаний  int readSensor()   {    digitalWrite(sensorPower, HIGH);    delay(10);    val = analogRead(sensorPin);    digitalWrite(sensorPower, LOW);    return val;  }

Теги

ArduinoДатчикДатчик уровня водыУровень водыИспользуемые источники:

  • https://3d-diy.ru/wiki/arduino-datchiki/arduino-datchik-urovnya-vody/
  • https://arduinoplus.ru/uroven-vody-arduino/
  • https://radioprog.ru/post/828

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации