КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Датчики расхода воды: руководство по использованию

Подключение и настройка

Подключение датчиков расхода воды зависит от выбранного алгоритма подсчета его импульсов:

  • Если Вы будете подсчитывать количество импульсов с датчика, используя внешнее прерывание, то информационный вывод датчика нужно подключить только к тому выводу Arduino, который используют внешние прерывание. Преимуществом данного метода является то, что все импульсы датчика будут, гарантированно, подсчитаны и для этого не требуется приостанавливать выполнение скетча. Недостаток данного метода заключается в том, что не все выводы Arduino используют внешние прерывания.
  • Если Вы будете подсчитывать количество импульсов с датчика, измеряя длительность импульсов (пауз), то информационный вывод датчика можно подключить к любому выводу Arduino. Преимуществом данного метода является то, что количество подключаемых датчиков ограничено количеством свободных выводов Arduino. Еще одним преимуществом является то, что расчёт скорости происходит в режиме реального времени, после каждого импульса (паузы). Но есть и недостатки. Скважность импульсов с датчика имеет погрешность ±10%, значит длительности импульсов не совпадают с длительностями пауз и к результатам измерений добавится указанная погрешность ±10%. Чтение длительности импульсов функцией pulseIn() приостанавливает выполнение скетча на время чтения.

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

Согласно datasheet, если через датчик пропустить 1л воды, то с него будет получено 5880 импульсов. В действительности количество импульсов на 1л будет разным при разных скоростях потока воды. Мы предлагаем использовать формулу: Q = F / (5,9F + 4570), где Q - скорость потока воды (л/с), F - количество импульсов в секунду (частота), 5,9 - коэффициент нелинейности, 4570 - линейный коэффициент (вместо 5880 от datasheet).

Датчик расхода воды YF-S401 состоит из пластикового корпуса, клапана, водяного ротора с магнитами и датчика Холла. Скорость вращения ротора прямо пропорциональна скорости водяного потока. Чем выше скорость, тем чаще магниты проходит рядом с датчиком Холла, тем больше импульсов на информационном выводе датчика.

Формула расхода воды: F = 98 Q => Q = F / 98.

  • F - частота импульсов в Гц (количество импульсов с датчика за 1 секунду).
  • Q - скорость потока воды в л/м, (количество литров прошедшее через датчик за 1 минуту).

Приведённая выше зависимость (из datasheet на датчик) не учитывает влияние скорости. Мы предлагаем определять расход воды по выведенной нами формуле:

Формула расхода воды: Q = F / (5,9F + 4570).

  • F - частота импульсов в Гц (количество импульсов с датчика за 1 секунду).
  • Q - скорость потока воды в л/с, (количество литров прошедшее через датчик за 1 секунду).
  • 5,9 - коэффициент учитывающий влияние скорости на количество импульсов.
  • 4570 - коэффициент линейной зависимости количества импульсов от объема воды.

Формула определения объема воды: V = ∑ (Q*T).

  • V - объем воды прошедшей через датчик.
  • Q - скорость потока воды.
  • T - время в течении которого сохранялась указанная скорость потока воды Q.
  • Единцы измерений должны быть приведены друг к другу.
    • Если скорость Q указана в л/с то время T нужно указать в сек., а объем V будет в литрах.
    • Если скорость Q указана в см3 то время T нужно указать в мин., а объем V будет в см3.

Примеры

Скорость потока и объем воды определяются подсчётом количества импульсов с датчика.

Определение скорости и объема воды, используя внешнее прерывание:

uint8_t  pinSensor = 2;                                         // Определяем номер вывода Arduino, к которому подключён датчик расхода воды.
                                                                //
uint32_t varTime;                                               // Объявляем переменную для хранения времени последнего расчёта.
float    varQ;                                                  // Объявляем переменную для хранения рассчитанной скорости потока воды (л/с).
float    varV;                                                  // Объявляем переменную для хранения рассчитанного объема воды (л).
volatile uint16_t varF;                                         // Объявляем переменную для хранения частоты импульсов (Гц).
                                                                //
void funCountInt(){varF++;}                                     // Определяем функцию, которая будет приращать частоту импульсов.
                                                                //
void setup(){                                                   //
     Serial.begin(9600);                                        // Инициируем передачу данных в монитор последовательного порта.
     pinMode(pinSensor, INPUT);                                 // Конфигурируем вывод к которому подключён датчик, как вход.
     uint8_t intSensor = digitalPinToInterrupt(pinSensor);      // Определяем номер прерывания который использует вывод pinSensor.
     attachInterrupt(intSensor, funCountInt, RISING);           // Назначаем функцию funCountInt как обработчик прерываний intSensor при каждом выполнении условия RISING - переход от 0 к 1.
     if(intSensor<0){Serial.print("Указан вывод без EXT INT");} // Выводим сообщение о том, что датчик подключён к выводу не поддерживающему внешнее прерывание.
     varTime=0; varQ=0; varV=0; varF=0;                         // Обнуляем все переменные.
}                                                               //
                                                                //
void loop(){                                                    //
//   Если прошла 1 секунда:                                     //
     if( (varTime+1000)<millis() || varTime>millis() ){         // Если c момента последнего расчёта прошла 1 секунда, или произошло переполнение millis то ...
     //  Определяем скорость и расход воды:                     //
         varQ    = varF / ((float)varF*5.9f+4570.0f);           // Определяем скорость потока воды л/с.
         varF    = 0;                                           // Сбрасываем частоту импульсов датчика, значение этой переменной приращается по прерываниям.
         varTime = millis();                                    // Сохраняем  время последних вычислений.
         varV   += varQ;                                        // Определяем объем воды л.
     //  Выводим рассчитанные данные:                           //
         Serial.println((String) "Объем "+varV+"л, скорость "+(varQ*60.0f)+"л/м.");
     }                                                          //
//   Тут может выполняться ваш код ...                          //
}                                                               //
  • В этом примере скорость потока воды varQ рассчитывается по формуле Q = F / (5,9F + 4570).
  • Частота импульсов датчика varF определяется как сумма прерываний за одну секунду.
  • Объем воды varV определяется по формуле V = ∑ (Q*T), где T=1 (время измерений = 1 сек).
  • При расчётах varQ определяется в л/с, а в монитор выводим значение в л/м.

Определение скорости и объема воды, методом подсчёта длительности импульсов

uint8_t  pinSensor = 2;                                         // Определяем номер вывода Arduino, к которому подключён датчик расхода воды.
                                                                //
float    varQ;                                                  // Объявляем переменную для хранения рассчитанной скорости потока воды (л/с).
float    varV;                                                  // Объявляем переменную для хранения рассчитанного объема воды (л).
                                                                //
void setup(){                                                   //
     Serial.begin(9600);                                        // Инициируем передачу данных в монитор последовательного порта.
     pinMode(pinSensor, INPUT);                                 // Конфигурируем вывод к которому подключён датчик, как вход.
     varQ=0; varV=0;                                            // Обнуляем все переменные.
}                                                               //
                                                                //
void loop(){                                                    //
    varQ           = 0;                                         // Сбрасываем скорость потока воды.
    uint32_t varL  = pulseIn(pinSensor, HIGH, 200000);          // Считываем длительность импульса, но не дольше 0,2 сек.
    if( varL ){                                                 // Если длительность импульса считана, то ...
        float varT = 2.0 * (float)varL / 1000000;               // Определяем период следования импульсов в сек.
        float varF = 1/varT;                                    // Определяем частоту следования импульсов в Гц.
        varQ       = varF / (varF*5.9f+4570.0f);                // Определяем скорость потока воды л/с.
        varV      += varQ * varT;                               // Определяем объем воды л.
    }                                                           //
//  Выводим рассчитанные данные:                                //
    Serial.println((String) "Объем "+varV+"л, скорость "+(varQ*60.0f)+"л/м.");
}                                                               //
  • В этом примере вычисления производятся после каждого импульса полученного с датчика, значит период расчётов совпадает с периодом следования импульсов.
  • Длительность импульсов varL определяется функцией pulseIn().
  • Так как скважность импульсов ≈ 50%, то период varT определяется по формуле: T ≈ 2L.
  • Частота импульсов varF определяется по формуле F = 1/T.
  • Скорость потока воды varQ рассчитывается по формуле Q = F / (5,9F + 4570).
  • Объем воды varV определяется по формуле V = ∑ (Q*T).
  • При расчётах varQ определяется в л/с, а в монитор выводим значение в л/м.

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

Датчик расхода воды YF-S201 состоит из пластикового корпуса, водяного ротора с магнитами и датчика Холла. Скорость вращения ротора прямо пропорциональна скорости водяного потока. Чем выше скорость, тем чаще магниты проходит рядом с датчиком Холла, тем больше импульсов на информационном выводе датчика.

Формула расхода воды: Q = F / 7,5.

  • F - частота импульсов в Гц (количество импульсов с датчика за 1 секунду).
  • Q - скорость потока воды в л/м, (количество литров прошедшее через датчик за 1 минуту).

Для удобства будем получать скорость Q не в л/м, а в л/с: Q = F / 450.

  • F - частота импульсов в Гц (количество импульсов с датчика за 1 секунду).
  • Q - скорость потока воды в л/с, (количество литров прошедшее через датчик за 1 секунду).

Формула определения объема воды: V = ∑ (Q*T).

  • V - объем воды прошедшей через датчик.
  • Q - скорость потока воды.
  • T - время в течении которого сохранялась указанная скорость потока воды Q.
  • Единцы измерений должны быть приведены друг к другу.
    • Если скорость Q указана в л/с то время T нужно указать в сек., а объем V будет в литрах.
    • Если скорость Q указана в см3 то время T нужно указать в мин., а объем V будет в см3.

Примеры

Скорость потока и объем воды определяются подсчётом количества импульсов с датчика.

Определение скорости и объема воды, используя внешнее прерывание:

uint8_t  pinSensor = 2;                                         // Определяем номер вывода Arduino, к которому подключён датчик расхода воды.
                                                                //
uint32_t varTime;                                               // Объявляем переменную для хранения времени последнего расчёта.
float    varQ;                                                  // Объявляем переменную для хранения рассчитанной скорости потока воды (л/с).
float    varV;                                                  // Объявляем переменную для хранения рассчитанного объема воды (л).
volatile uint16_t varF;                                         // Объявляем переменную для хранения частоты импульсов (Гц).
                                                                //
void funCountInt(){varF++;}                                     // Определяем функцию, которая будет приращать частоту импульсов.
                                                                //
void setup(){                                                   //
     Serial.begin(9600);                                        // Инициируем передачу данных в монитор последовательного порта.
     pinMode(pinSensor, INPUT);                                 // Конфигурируем вывод к которому подключён датчик, как вход.
     uint8_t intSensor = digitalPinToInterrupt(pinSensor);      // Определяем номер прерывания который использует вывод pinSensor.
     attachInterrupt(intSensor, funCountInt, RISING);           // Назначаем функцию funCountInt как обработчик прерываний intSensor при каждом выполнении условия RISING - переход от 0 к 1.
     if(intSensor<0){Serial.print("Указан вывод без EXT INT");} // Выводим сообщение о том, что датчик подключён к выводу не поддерживающему внешнее прерывание.
     varTime=0; varQ=0; varV=0; varF=0;                         // Обнуляем все переменные.
}                                                               //
                                                                //
void loop(){                                                    //
//   Если прошла 1 секунда:                                     //
     if( (varTime+1000)<millis() || varTime>millis() ){         // Если c момента последнего расчёта прошла 1 секунда, или произошло переполнение millis то ...
     //  Определяем скорость и расход воды:                     //
         varQ    = (float)varF / 450.0f;                        // Определяем скорость потока воды л/с.
         varF    = 0;                                           // Сбрасываем частоту импульсов датчика, значение этой переменной приращается по прерываниям.
         varTime = millis();                                    // Сохраняем  время последних вычислений.
         varV   += varQ;                                        // Определяем объем воды л.
     //  Выводим рассчитанные данные:                           //
         Serial.println((String) "Объем "+varV+"л, скорость "+(varQ*60.0f)+"л/м.");
     }                                                          //
//   Тут может выполняться ваш код ...                          //
}                                                               //
  • В этом примере скорость потока воды varQ рассчитывается по формуле Q = F / 450.
  • Частота импульсов датчика varF определяется как сумма прерываний за одну секунду.
  • Объем воды varV определяется по формуле V = ∑ (Q*T), где T=1 (время измерений = 1 сек).
  • При расчётах varQ определяется в л/с, а в монитор выводим значение в л/м.

Определение скорости и объема воды, методом подсчёта длительности импульсов

uint8_t  pinSensor = 2;                                         // Определяем номер вывода Arduino, к которому подключён датчик расхода воды.
                                                                //
float    varQ;                                                  // Объявляем переменную для хранения рассчитанной скорости потока воды (л/с).
float    varV;                                                  // Объявляем переменную для хранения рассчитанного объема воды (л).
                                                                //
void setup(){                                                   //
     Serial.begin(9600);                                        // Инициируем передачу данных в монитор последовательного порта.
     pinMode(pinSensor, INPUT);                                 // Конфигурируем вывод к которому подключён датчик, как вход.
     varQ=0; varV=0;                                            // Обнуляем все переменные.
}                                                               //
                                                                //
void loop(){                                                    //
    varQ           = 0;                                         // Сбрасываем скорость потока воды.
    uint32_t varL  = pulseIn(pinSensor, HIGH, 200000);          // Считываем длительность импульса, но не дольше 0,2 сек.
    if( varL ){                                                 // Если длительность импульса считана, то ...
        float varT = 2.0 * (float)varL / 1000000;               // Определяем период следования импульсов в сек.
        float varF = 1/varT;                                    // Определяем частоту следования импульсов в Гц.
        varQ       = varF / 450.0f;                             // Определяем скорость потока воды л/с.
        varV      += varQ * varT;                               // Определяем объем воды л.
    }                                                           //
//  Выводим рассчитанные данные:                                //
    Serial.println((String) "Объем "+varV+"л, скорость "+(varQ*60.0f)+"л/м.");
}                                                               //
  • В этом примере вычисления производятся после каждого импульса полученного с датчика, значит период расчётов совпадает с периодом следования импульсов.
  • Длительность импульсов varL определяется функцией pulseIn().
  • Так как скважность импульсов ≈ 50%, то период varT определяется по формуле: T ≈ 2L.
  • Частота импульсов varF определяется по формуле F = 1/T.
  • Скорость потока воды varQ рассчитывается по формуле Q = F / 450.
  • Объем воды varV определяется по формуле V = ∑ (Q*T).
  • При расчётах varQ определяется в л/с, а в монитор выводим значение в л/м.

Ресурсы

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

Магазин

Документация




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями