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


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

Сохранить или поделиться

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

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

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

Обзор аппаратного обеспечения

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

— (GND) – земля.

Принцип работы

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

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

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

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

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

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

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

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

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

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

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

Необходимые для датчика материалы

  • 2 микросхемы 4093;
  • 2 панельки для микросхем;
  • 7 по 500 ом резисторы;
  • 7 по 2,2 Мом резисторы;
  • батарея 9 В;
  • гнездо для батареи;
  • плата для схемы 10 х 5 см;
  • 8 латунных винтов для датчиков;
  • двухсторонний скотч или шурупы для крепления коробки к стене;
  • сетевой кабель. Длина кабеля зависит от расстояния от резервуара для воды до места, где будет расположен дисплей.

Итак, основа – это CI4093, что имеет четыре элемента. В этом проекте использовано две микросхемы. Тут мы имеем порты с одним входом на высоком уровне, а другие подключенные через резистор, обеспечивая высокий логический уровень. При помещении в эту логику нулевого входного сигнала, выход инвертора будет на высоком уровне и включает светодиод. Всего использовано семь из восьми элементов, из-за ограничений в кабельной сети.

Сбоку размещена линейка светодиодов разных цветов, указывающая на уровень воды. Красные индикаторы – воды совсем мало, жёлтые – бак наполовину пуст, зелёные – полный. Центральная большая кнопка используется для подключения насоса и накачки бака.

Схема работает только при нажатии на центральную кнопку. Остальное время она находится в дежурном режиме. Но даже при срабатывании цепи индикации, ток минимален и батарейки хватит на долго.

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

После того, как схема будет собрана, загрузите в 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, когда датчик ничего не касается. Чтобы увидеть, как определяется вода, вы можете взять стакан воды и медленно погрузить в него датчик.

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

Объяснение

Скетч начинается с объявления выводов 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; // Вернуть текущее показание }

Тестирование работы проекта

После того как аппаратная часть проекта будет готова подключите плату Arduino к компьютеру (ноутбуку) и загрузите код программы в плату Arduino. Откройте окно монитора последовательной связи на скорости 9600 бод. Расположите какой-нибудь предмет напротив ультразвукового датчика, рассчитанное расстояние до него будет отображаться в окне монитора последовательной связи и на экране ЖК дисплея.

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Калибровка

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

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

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

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

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

  • когда датчик сухой: 0;
  • когда он частично погружен в воду: ~420;
  • когда он полностью погружен: ~520.

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

Типовая электрическая схема для работы от БП 5 В.

Кабель выступает из герметичного узла датчика и имеет на конце небольшой 4-контактный (2-парный) проводной разъем. Одна пара этих проводов присоединена к светодиоду (световому излучателю) внутри, а другая – к фототранзистору (светоприемнику). Вот типовая схема подключения оптического датчика уровня жидкости.

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

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

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

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

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

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

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

Код 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; }

Оригинал статьи:

  • How Water Level Sensor Works and Interface it with Arduino

Пищалка для сигнализации уровня фильтрованной воды

Написать эту статью меня побудило несколько факторов.

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

Система фильтрации. Вид снизу.

Система фильтрации. Вид сверху.

Вода капает в 5-литровую бутыль. Хотя в паспорте на фильтр указана рекомендуемая скорость фильтрации 2,5 л/мин, я умышленно дозирую каплями из двух соображений.

  1. Полнота/степень Ф пропорциональна времени контакта протекаемой воды с поверхностью сорбента.
  2. При этом расход воды ниже порога чувствительности водосчетчика (см. «Вид снизу») и я получаю чистую воду даром (я всё делаю законно, а все претензии к заводу-изготовителю водосчетчика)!

Да, по капелькам процесс не быстрый. А кто торопит пенсионера? Сиди, смотри телевизор или решай кроссворды!

Как и все пожилые люди, я страдаю ежеминутной/мгновенной забывчивостью (этому есть даже своё научное название) – поставил фильтр, ушел смотреть телевизор и забыл, уснул. Время идет, а бутыль наполнилась и переливает через край!

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

Рейтинг
( 2 оценки, среднее 5 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]