Подключение и настройка
Подключение датчиков расхода воды зависит от выбранного алгоритма подсчета его импульсов:
- Если Вы будете подсчитывать количество импульсов с датчика, используя внешнее прерывание, то информационный вывод датчика нужно подключить только к тому выводу 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 определяется в л/с, а в монитор выводим значение в л/м.
Ресурсы
Мы также рекомендуем к чтению ссылки на статьи, документации и другие вспомогательные материалы по датчикам расхода воды.
Магазин
- Датчик расхода воды YF-S401
- Датчик расхода воды YF-S201C
- Датчик расхода воды YF-S201
- Датчик расхода воды YF-G1
Обсуждение