В автоматизированных системах, где необходима дозированная подача или контроль потребления воды, используются специализированные устройства — крыльчатые счётчики с датчиками Холла. Например, в кофемашинах, автоматах газированных напитков, промышленных линиях разлива жидкой продукции. В рамках этой статьи рассмотрим пример такого прибора учёта — датчик расхода воды YF-S401.
Конструкция и принцип работы
Устройство изготовлено из герметичного пластикового корпуса с двумя патрубками, на которые рекомендуется устанавливать мягкие силиконовые трубки с внутренним диаметром примерно 6 мм (внешний диаметр патрубка равен 7,2 мм). Сам прибор учёта необходимо подключать в разрыв системы водоснабжения, аналогично подключению амперметра в разрыв электрической цепи.
Внутри расходомера на валу расположена крыльчатка, которая вращается под напором жидкости. Также на валу установлено кольцо с постоянным магнитом. Под верхней крышкой прибора, которая прикрепляется к основному корпусу посредством четырёх саморезов, расположена печатная плата с сенсором Холла. Именно от него выходит трёхпроводный шлейф.

При прохождении потока через счётчик крыльчатка вращается. Соответственно, на валу магнит тоже вращается, и каждый оборот он проходит мимо датчика Холла, в следствие чего на его выходе генерируется импульс. Чем выше скорость вращения крыльчатки, тем выше частота импульсов. На этой прямой зависимости и строится принцип измерения расхода (объём прошедшей жидкости за промежуток времени).
Основные параметры
Важно уточнить, что в datasheet’ах (варианты первый, второй, третий и четвёртый) от различных производителей некоторые параметры могут существенно различаться, особенно напряжение питания. Поэтому рекомендуется запитывать устройство тем же питанием, что и микроконтроллер (3,3…5 В).
Схема подключения
Прибор учёта подключается в разрыв контура водоснабжения через патрубки. Причём необходимо соблюдать направление потока, о чём указывает стрелочка на поверхности корпуса:
Шлейф у прибора состоит из трёх проводов со следующей маркировкой:

Несмотря на то, что расходомер может работать при напряжении питания от 5 до 12 В (в некоторых источниках указывается и до 24 В, всё зависит от встроенной в прибор модели сенсора Холла), рекомендуется работать от 5 В. Так как уровень выходного сигнала зависит от величины питания, то при работе с Arduino или другими микроконтроллерами необходимо соблюдать согласованность уровней напряжения, иначе есть риск повредить контроллер.
На рисунке ниже представлена схема подключения счётчика к отладочной плате:
Сигнальный контакт SIG подключается к выводу №2 отладочной платы, поскольку именно через него производится подключение к одному из двух выводов микроконтроллера ATmega328P (а именно пин №4 — INT0), которые работают с прерываниями по внешнему сигналу.
Скетч для Arduino
Прежде чем писать скетч, необходимо уточнить методику пересчёта частоты импульсов (с выхода сенсора Холла) в объём пропускаемой воды. В документации к расходомеру приводится соотношение: при прохождении 1 литра генерируется 5880 импульсов. Также указывается формула:

где F [Гц] — частота импульсов;
Q [литры в минуту (л/м)] — расход жидкости.
В основе работы программы для измерения расхода воды лежит подсчитывание количества импульсов в течение 1 секунды. Это осуществляется при помощи подпрограммы прерываний. Сигнальный выход прибора учёта подключается к пину №2 отладочной платы, поскольку микроконтроллер может отслеживать состояние логического уровня именно на этом пине. Перепад уровня инициирует аппаратное прерывание, которое вызывает отдельную подпрограмму.
В основном цикле программы производится расчёт через каждые 1000 миллисекунд (реализовано в виде паузы). За это время подсчитывается число импульсов внутри подпрограммы прерывания. Так как прерывание аппаратное, то оно не зависит от паузы внутри основного цикла. А уже после паузы производятся расчёты скорости водяного потока и подсчёт общего объёма прокаченной жидкости за всё время с момента старта программы.
В процессе экспериментов было замечено, что результат подсчёта общего объёма по формуле из datasheet’а сильно отличается от фактического. Например, в мерный стакан было налито 250 мл, а счётчик показал 200 мл. Или было перекачено 1 литр, а в результате измерено датчиком примерно 800 мл. То есть расходомер занижает показания относительно фактического объёма примерно в 1,25 раза. Если ввести в формулу этот поправочный коэффициент, то результаты измерений будут более достоверными:

В Интернете также можно встретить улучшенную, эмпирически выведенную конкретно для прибора YF-S401 формулу, которая учитывает влияние скорости:

где 5,9 — коэффициент, учитывающий влияние скорости;
4570 — коэффициент линейной зависимости количества импульсов от объёма жидкости.
В нашем натурном эксперименте коэффициент 1,25 был определён эмпирически, поскольку нужно было проверить на практике работу насоса с той фактической скоростью, которая определяется напряжением питания помпы.
Ниже представлен подробно описанный скетч:
volatile int pulseCount = 0; // число импульсов (имп.)
float flowRate; // скорость потока
float totalLiters = 0; // общий объём прокаченной влаги
float max_v = 0; // промежуточная переменная для расчёта общего объёма
const float pulse_per_litre = 98; // число имп. при протекании 1 литра за 1 секунду
void setup() {
Serial.begin(9600);
pinMode(2, INPUT); // настройка пина №2 отладочной платы на вход
// настройка прерываний состоит из трёх аргументов
// digitalPinToInterrupt(2) - назначаем пин №2 на обработку внешних прерываний
// pulseCounter - функция, которая выполняет подпрограмму прерываний
// RISING - тип сигнала, при котором срабатывает прерывание
// в данном случае при росте сигнал с низкого логического уровня на высокий уровень
attachInterrupt(digitalPinToInterrupt(2), pulseCounter, RISING);
}
void loop() {
// Вычисление "литр-в-минуту" по формуле из документации: Q = F / 98
// где F - это значение pulseCount (число имп.)
// pulse_per_litre = 98 - это нормированное производителем количество
// имп. в секунду при прокачке 1 литр в минуту
flowRate = (pulseCount / pulse_per_litre); // прокачка "литр-в-минуту"
// вычисление общего объёма прокаченной влаги, суммируя каждую секунду показания
// уровень "литр-в-минуту" в данную секунду прибавляется к суммарной величине
// (величина "max_v" в литрах) за всё время работы программы
// 1.25 - это поправочный коэффициент
max_v = max_v + (pulseCount / pulse_per_litre)*1.25;
totalLiters = max_v * 1000.0; // переводим литры в миллилитры для большей наглядности
// вывод значений в монитор порта
Serial.print("Скорость водяного потока: ");
Serial.print(flowRate);
Serial.print(" л/м");
Serial.print(" | Общий расход воды: ");
Serial.print(totalLiters);
Serial.println(" мл");
pulseCount = 0; // Сброс
delay(1000); // подсчёт осуществлять через каждые 1000 миллисекунд
}
// подпрограмма прерываний
void pulseCounter() {
pulseCount++; // инкрементирование переменной
// в течение 1 секунды подпрограмма прерываний срабатывает столько раз,
// сколько было имп.
}
Эксперимент
Для проверки работы прибора учёта соберём макет дозатора, используя воздушно-водяной мембранный насос модели R385:

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

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

Для большей точности измерения объёма жидкости предварительно заполним водяной контур. За счёт этого в момент старта испытания (подача питания на насос) наливаемая в стакан жидкость уже начнёт достоверно учитываться.
На скриншоте ниже представлен монитор порта Arduino IDE, в котором отображаются результаты измерений.

По показаниям скорости видно, когда стартовала и завершилась прокачка (нулевые значения). В процессе эксперимента фактически достигнута скорость приблизительно 1 литр в минуту: за 12 секунд перекачено 250 миллилитров (на скриншоте указано 0,8 л/м без учёта поправочного коэффициента). Помпа была отключена в тот момент, когда мерный стакан заполнился до указанной отметки:

Эксперимент показывает, что разница между измеренной величиной и фактической составляет примерно ±2%. Но такой результат достигнут лишь только благодаря дополнительной калибровке системы (подбор поправочного коэффициента).
Выводы
Расходомер YF-S401 является простым, доступным и эффективным устройством для определения скорости и расхода жидкости для различных систем, где требуется контроль относительно небольших объёмов (до 6 литров в минуту).
Точность измерения сильно зависит от принципа и методики математической обработки импульсов, которые выдаёт сенсор Холла в составе устройства. При корректном подходе и небольшой калибровке можно достичь точности измерений приблизительно ±2%.
Таким образом, рассмотренная модель счётчика вполне подойдёт для дозатора питьевой воды в кулерах или автоматизированных схем полива в теплицах.