Измерение скорости и объема потока воды с помощью Arduino


Если вы посещали когда-нибудь промышленные предприятия, на которых используется вода в том или ином виде, вы могли заметить что ее потребление на этих предприятиях автоматизировано. К примеру, предприятия по изготовлению каких-нибудь напитков или предприятия химической промышленности непрерывно измеряют расход (объем) воды, который они потребляют. Для этой цели чаще всего используются так называемые датчики расхода воды (Flow Sensor). Используя подобный датчик и любой микроконтроллер, например, Arduino, мы можем определять скорость потока воды и, следовательно, можем рассчитать объем воды, который прошел через трубу. Также подобные датчики расхода воды широко применяются в сельском хозяйстве, приготовлении еды, горнодобывающей промышленности, системах очистки воды, кофе-машинах и т.д. Рассмотренный в этой статье датчик расхода воды будет хорошим дополнением к таким проектам на основе платы Arduino на нашем сайте как автоматический дозатор воды и автоматическая система полива растений.

Внешний вид подключения датчика расхода воды к плате Arduino Uno

В этой статье мы рассмотрим подключение датчика расходы воды (water flow sensor) к плате Arduino. Измеренный объем (расход) воды мы будем отображать на экране ЖК дисплея, подключенного к плате Arduino. Для нашего проекта мы использовали датчик расхода воды YF-S201, который использует эффект Холла для измерения скорости потока жидкости.

Необходимые компоненты

  1. Плата Arduino Uno (купить на AliExpress).
  2. Датчик расхода воды (water flow sensor) YF-S201 (купить на AliExpress).
  3. ЖК дисплей 16х2 (купить на AliExpress).
  4. Потенциометр 10 кОм (купить на AliExpress).
  5. Соединительные провода.
  6. Водопроводная труба.

Датчик расхода воды YF-S201

Как показано на рисунке, датчик YF-S201 имеет три провода: красный, желтый и черный. Красный провод используется для подачи питающего напряжения, которое может составлять от 5V до 18V, а черный провод подключается к земле (GND). Через желтый провод осуществляется передача выходных импульсов датчика, которые могут быть считаны микроконтроллером. Измеряющим элементом датчика является вихревое колесо (pinwheel), которое измеряет количество жидкости, прошедшее через него.

Внешний вид датчика YF-S201 с подсоединенными коннекторами

Принцип работы датчика расхода воды YF-S201 основан на эффекте Холла, который заключается в появлении разности потенциалов в электрическом проводнике под действием магнитного поля, приложенного перпендикулярно протекающему через проводник току. Датчик расхода воды YF-S201 включает датчик Холла, который генерирует электрический импульс с каждым вращением (оборотом) колеса, измеряющего поток воды. При этом датчик Холла надежно запаян и непосредственно не контактирует с водой, что позволяет ему всегда оставаться сухим и готовым к работе. Внешний вид датчика расхода воды YF-S201 показан на следующем рисунке.

Внешний вид датчика расхода воды YF-S201

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

Коннекторы, которые мы использовали для соединения датчика YF-S201 с водопроводной трубой

В соответствии со спецификацией на датчик YFS201 максимальный потребляемый ток при питающем напряжении 5V составляет 15mA. При этом измеряемая им скорость потока воды составляет от 1 до 30 литров в минуту. Когда через датчик протекает поток воды, он контактирует с лопатками турбины (колеса), расположенного на пути потока воды. Ось турбины соединена с датчиком Холла, поэтому всегда, когда через датчик протекает поток воды, датчик Холла генерирует электрические импульсы. Все что нам нужно сделать для измерения скорости потока воды – это измерять время между этими импульсами или подсчитывать количество этих импульсов за 1 секунду. С помощью этих данных затем мы можем рассчитать скорость потока воды в литрах в минуту (L/Hr - liter per hour) и далее с помощью простой формулы найти объем воды, который прошел (протек) через трубу. Для подсчета количества импульсов от датчика расходы воды мы будем использовать плату Arduino Uno.

Схема проекта

Схема подключения датчика расхода воды к плате Arduino Uno представлена на следующем рисунке.

Схема подключения датчика расхода воды к плате Arduino Uno

Соединения между платой Arduino, ЖК дисплеем 16x2 и датчиком расхода воды представлены в следующих таблицах ниже. Потенциометр подключен к контактам 5V и GND, а его средний контакт подключен к контакту V0 ЖК дисплея.

Датчик расхода воды Плата Arduino
красный провод 5V
черный провод GND
желтый провод 2
ЖК дисплей Плата Arduino
Vss GND (ground rail of breadboard)
VDD 5V (Positive rail of the breadboard)
V0 к потенциометру
RS 12
RW GND
E 11
D7 9
D6 to D4 3 to 5

После сборки проекта на макетной плате у нас получилась конструкция следующего вида:

Внешний вид конструкции проекта

Объяснение программы для Arduino

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

В начале программы необходимо подключить библиотеку для работы с ЖК дисплеем, а также указать плате Arduino, к каким ее контактам подключен ЖК дисплей, в нашем случае это контакты 12, 11, 5, 4, 3, 9. Выходной контакт датчика расходы воды подключен к контакту 2 платы Arduino UNO.

Также мы запрограммируем функцию void flow(), которая будет являться обработчиком прерывания с контакта 2 платы Arduino. При каждом поступающем сигнале прерывания на этот контакт значение переменной flow_frequency будет увеличиваться на 1. Если вы ранее не сталкивались с прерываниями, то рекомендуем вам прочитать статью на нашем сайте о прерываниях в Arduino.

В функции void setup мы зададим режим работы контакта 2 платы Arduino на ввод данных и с помощью функции attachInterrupt сконфигурируем его как контакт, на котором будет происходить обнаружение прерываний. Прерывание на этом контакте будет обнаруживаться при увеличении уровня напряжения на нем. При каждом таком случае будет вызываться функция обработки прерывания flow, в которой будет происходить инкрементирование переменной flow_frequency. Переменные current time и cloopTime используются для измерения временного промежутка длительностью 1 секунда.

Далее в функции void loop () условие if(currentTime >= (cloopTime + 1000)) гарантирует что код внутри него будет выполняться каждую секунду. Благодаря этому мы можем рассчитать количество импульсов, поступающих с датчика расхода воды за секунду. Из даташита на датчик расходы воды можно узнать, что частота импульсов в нем умножается на 7.5, поэтому чтобы найти скорость потока воды в литрах в минуту, нам в программе необходимо измеренную частоту импульсов (flow_frequency) разделить на 7.5. После нахождения скорости потока воды в литрах в минуту мы делим полученную величину на 60 чтобы определить скорость потока воды в литрах в секунду. Для расчета объема прошедшей через датчик воды значение переменной l_minute прибавляется к значению переменной vol каждую секунду.

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

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

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

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

Если по трубе протекает вода, то турбина (колесо, крыльчатка) внутри датчика расхода воды начинает вращаться, поэтому на выходе датчика расхода воды появляются электрические импульсы, генерируемые датчиком Холла. Каждый из этих импульсов вызывает срабатывание прерывания на контакте 2 платы Arduino. С каждым поступившим сигналом прерывания (rising edge – передний фронт импульса) значение переменной flow_frequency увеличивается на 1. Затем переменные current time и cloopTIme гарантируют, что значение переменной flow_frequency будет учитываться в расчетах каждую секунду. После проведения вычислений значение переменной flow_frequency устанавливается равным 0 и процесс начинается сначала.

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

Исходный код программы (скетча)

Видео, демонстрирующее работу проекта

(4 голосов, оценка: 4,00 из 5)
Загрузка...
16 427 просмотров

Комментарии

Измерение скорости и объема потока воды с помощью Arduino — 44 комментария

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

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

    • Добрый день. Вам тогда лучше сначала попробовать просто подключить ЖК дисплей к плате Arduino, без других компонентов проекта, чтобы выяснить в чем ошибка. Если у вас обычное подключение ЖК дисплея не получается, можно его подключить с помощью модуля I2C (стоит около 60-70 рублей).

  3. Flow pulse characteristic f = (73 * Q) ± 2% Q = L / MIN
    вот. что смог найти по этому счетку

  4. Модель счетчика YF-S402B, 2000 импульсов на 1 литр. Подскажите, какие изменения надо внести в скетч, чтобы корректно считал именно для этой модели счетчика?

  5. Добрый день. Как можно осуществить передачу параметра расхода воды на другое устройство через аналоговый выход (4-20 mA) или через Modbus RS-485.Спасибо

    • Добрый вечер. Через Modbus RS-485 это сделать достаточно просто, можете пример посмотреть в этой статье, а вот аналоговых выходов у платы Ардуино нет, для управления, к примеру, яркостью свечения светодиода, она использует ШИМ сигнал, вы можете его преобразовать в чисто аналоговый сигнал с помощью отдельной небольшой схемы, но я не знаю подойдет ли вам такой способ или нет.

  6. Добрый день!
    Компилятор тормозит на 24 строке: "NOT_AN_INTERRUPT'was not declared in this scope",
    убрал "digitalPinToInterrupt" оставил (flowsensor), загружает. но не считает.
    строка 21: вход прерывания (2) притянут к плюсу, вопрос: как "передний фронт импульса" (положительный) может изменить состояние входа, на котором плюс, пробовал оба сигнала 0 и + и менял состояние входа на 0: нет реакции. Версия Ard. 1.0.6
    В чём дело, Ваше мнение? Спасибо!

    • Добрый вечер. А вы схему случайно не изменяли или тип платы? Плата Ардуино Уно может обрабатывать прерывания только на своих цифровых контактах 2 и 3, для других типов плат это могут быть уже другие контакты. Для тестирования работы прерываний можете попробовать изменить триггер срабатывания прерывания с RISING на CHANGE и посмотреть заработает ли в таком варианте или нет, а потом попробовать сделать выводы

      • Добрый вечер! Спасибо за ответ, причина была в не задекларированной библиотеке "PinChangeInterrupt" (отсутствует в скетче), ответственной за прерывания. Включил в скетч #include и заработало, но только не "(rising edge – передний фронт импульса)", а по спаду, что и очевидно, поскольку вход (2) притянут к плюсу (строка 21 скетча, если поменять на ноль, то и по переднему будет считать..., но не проверял).

        • Добрый вечер. И вам спасибо за полезный комментарий к данной статье и дальнейших вам успехов в электронике.

  7. В таблице соединений ЖК дисплея указано "D6 to D3". Контакт D3 у дисплея не задействован. Исправьте на "D6 to D4".

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

      • А можете помочь найти все эти расходники на каком-нибудь озоне или вб? С алиекспресса слишком долго будет идти, а мне сейчас срочно надо

        • Нет, к сожалению я не очень хороший специалист в этих магазинах. Да и вряд ли там будут такие специфические товары. Вы можете посмотреть их в каких-нибудь специфических магазинах: voltiq.ru, chip & dip, амперка. Ну или просто вводите их названия в яндексе со словом "купить" - он вас сам выведет на нужные магазины

            • Ну проект небольшой, поэтому особой разницы нет. Главное чтобы на нее ЖК дисплей вместился

        • Интернет магазин Амрерка, магазин Iarduino.ru чип и дип и ещё можно найти что-то это те что вспомнились

            • А не подскажите, какие провода нужно покупать мама-мама папа-папа и провод для батарейки?

              От админа: к сожалению, не подскажу

  9. Доброго времени суток! Очень сильно волнует вопрос: сколько времени может работать данное устройство в непрерывном режиме, используя сетевое питание через блок питания? Я новичок в Arduino и только начинаю знакомиться со всеми прелестями работы на нем. Хочется собрать данное устройство и установить его на шланг для подачи питьевой воды, чтобы понимать, через какое время точно нужно будет менять фильтры, поэтому очень сильно интересует его автономность и длительность работы.

    • Добрый вечер. Ну от сети оно может работать сколько угодно. А почему оно должно прекращать работу через некоторое время? При долгой работе может возникнуть только проблема с функцией millis - через определенное (точно не помню какое, но достаточно долгое) ее счетчик переполняется. Но она в представленной программе используется только для расчета времени.
      Да, почти забыл, при длительной работе может переполниться значение переменной vol в программе, которая как раз и считает общий объем воды. Чтобы она не переполнилась, вы можете считать ее в каких-нибудь других единицах, например, вместо представленной в программе формулы vol = vol +l_minute использовать формулу vol = vol +l_minute/1000, то есть в данном случае расход воды будет считаться в 1000 раз меньше реального - этот факт вам необходимо будет учитывать при расчете времени жизни ваших фильтров.
      Хотя я посмотрел, значение переменной типа float может составлять до 3.4028235E+38. Мне кажется этого вам вполне хватит. Но если не хватит можете использовать описанный мною способ уменьшение размерности счета

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

          • Собрал я всю эту систему. Работает вполне исправно, уже второй день пошел, пока насчитал порядка 20 литров воды. Проблема лишь возникла с достоверность результатов, так как хоть и счетчик стоит по пути труб для фильтров, но тройник не спасает и вода в системе перераспределяется постоянно при открытии других кранов, что дает небольшой прирост в миллилитрах каждое включение. Устранить такую проблему можно, поставив обратный клапан перед счетчиком, чтобы вода из русла питьевой воды никуда не перераспределялась. Но сейчас над таким пока что заморачиваться нет особого желания, да и вообще интересно, сколько в таком режиме проработает система. Компоненты устройства я не стал упаковывать никакой коробочкой, так как на будущее есть немного другая задумка на них. Сами компоненты, кстати, вроде не нагреваются, блок питания тоже в норме (он выдает 9В и 1А, выходная мощность 9Вт).
            Зато теперь, на основание того, какие показатели выдает устройство, я понимаю, каким образом происходит перераспределение давлений и течение жидкости в трубопроводе квартиры (раньше над этим и не задумывался даже).
            Вот такие у меня сейчас получились результаты) Больше всего мучений, конечно, заняло подключение самого датчика к системе водопровода на русло питьевой воды. Спасибо за возможность реализации такого проекта!

            • Спасибо и вам за такой развернутый комментарий. Удачи вам видоизменить проект по своему желанию

  10. У меня короткая шинка от датчика до Ардуинки (около 30 см.). Попробовал и с подтяжкой (логической) и без. Работает и так и так...
    И ещё - расход:
    l_minute = (flow_frequency / 7.5); // (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour
    это не относительный расход в минуту, а абсолютный за то время, за которое идёт измерение. Знаю, что китайцы в даташитах пишут "flowrate in L/hour", но в данном случае надо включить логику и понять физику процесса. При измерении этого потока каждую секунду (как в приведенном выше скетче) это поток в граммах в секунду. При измерении каждую минуту - в граммах в минуту.
    Я себе сделал табличку, в которой свёл тарировку этого датчика и аппроксимировал расход в зависимости от пульсаций. Если кто-то действительно хочет использовать подобный датчик, только так реально можно определить расход.

    • Результаты измерений:
      И З М Е Р Е Н И Я
      время, тара пульс 1 2 3 средний нетто пульс расход расход
      с вес в сек гр/сек л/ч
      1 121 980 3535 15790 15390 15520 15567 14587 120,55 29,21 433,98
      2 46 1010 5011 18740 18590 18360 18563 17553 381,59 108,93 1373,74
      3 20 1020 2638 10020 10300 10160 10160 9140 457,00 131,90 1645,20
      4 11 970 1473 5680 5540 5680 5633 4663 423,94 133,91 1526,18
      5 58 980 893 4410 4360 4150 4307 3327 57,36 15,40 206,48
      6 39 990 4623 16830 16540 16900 16757 15767 404,27 118,54 1455,38
      7 45 990 5654 20300 20460 19980 20247 19257 427,93 125,64 1540,53
      8 35 910 4479 14350 14850 14720 14640 13730 392,29 127,97 1412,23
      9 23 990 2389 8570 8400 8400 8457 7467 324,64 103,87 1168,70

      После аппроксимации получилось:
      Vol1 = 3.41* flow_frequency+92.591; // абсолютный расход за цикл в граммах
      вместо 1/6*q + 8/6 , как по даташиту.
      Знак "+" перед свободным членом говорит о том, что часть энергии потока тратится на преодоление силы трения в оси вертушки.

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

        • Да,к сожалению, это срабатывает защита комментариев от вредоносного кода. Вы можете файл с этой таблицей загрузить, к примеру, на Яндекс диск, а здесь ссылку на него написать

  11. Насколько я помню, для такого рода датчиков обычно применяют подтягивающий резистор (что-то типа 10К или около того) между питанием и дата-ногой.

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

      • По физике процесса, похоже, что надо...
        Кстати, подтяжку пина можно сделать логическую. Ардуино это позволяет.

        • Спорить не буду, не пробовал. Но буду признателен если здесь отпишется кто-нибудь, кто попробовал реализовать данный проект как с использованием подтягивающего резистора, так и без него

          • Функция из скетча
            digitalWrite(flowsensor, HIGH);
            как раз и подтягивает пин к плюсу...

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *