Измерение скорости и объема потока воды с помощью 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 D3 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 032 просмотров

Комментарии

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

  1. У меня короткая шинка от датчика до Ардуинки (около 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 , как по даташиту.
      Знак "+" перед свободным членом говорит о том, что часть энергии потока тратится на преодоление силы трения в оси вертушки.

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

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

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

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

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

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

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

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