Датчик YF-S201 позволяет без труда замерять расход воды в пределах расхода 1—30 литров в минуту. Принцип действия довольно прост и тривиален: поток воды вращает крыльчатку с магнитом, а датчик эффекта Холла позволяет регистрировать прохождение рядом с ним магнита. Таким образом, подсчитав частоту полученных сигналов, можно рассчитать расход воды, исходя из того, что датчик генерирует 450 импульсов на литр.
Направление, в котором следует пропускать воду через датчик, указано стрелкой на корпусе. Подключать датчик можно напрямую к управляющей плате, например Arduino. Датчик присоединяется к трубе или шлангу с помощью гайки с резьбой на 1/2 дюйма.
Направление, в котором следует пропускать воду через датчик, указано стрелкой на корпусе. Подключать датчик можно напрямую к управляющей плате, например Arduino. Датчик присоединяется к трубе или шлангу с помощью гайки с резьбой на 1/2 дюйма.
Датчик имеет три провода:
- Красный – «+» питания
- Черный – «земля», «-» питания
- Желтый – вывод для считывания показаний.
Пример подключения
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
// Выбор портов для светодиода и датчика byte statusLed = 13; byte sensorInterrupt = 0; // 0 = digital pin 2 byte sensorPin = 2; // Датчик выдает приблизительно 4.5 импульса на поток 1 л/мин. float calibrationFactor = 4.5; volatile byte pulseCount; float flowRate; unsigned int flowMilliLitres; unsigned long totalMilliLitres; unsigned long oldTime; void setup() { Serial.begin(9600); pinMode(statusLed, OUTPUT); digitalWrite(statusLed, HIGH); pinMode(sensorPin, INPUT); digitalWrite(sensorPin, HIGH); pulseCount = 0; flowRate = 0.0; flowMilliLitres = 0; totalMilliLitres = 0; oldTime = 0; // Датчик подключен к порту 2, который использует прерывание 0 // Настроено на срабатывание при падении уровня (переход из ВЫСОКОГО состояния в НИЗКОЕ) attachInterrupt(sensorInterrupt, pulseCounter, FALLING); } void loop() { if((millis() - oldTime) > 1000) // Выполнять раз в секунду { // Запрещаем прерывания на время рассчета потока и вывода данных по серийному порту detachInterrupt(sensorInterrupt); // Так как итерация может длиться не ровно 1 с, для рассчета берется время, прошедшее с последнего вычисления. flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor; oldTime = millis(); // Значение в л/мин. делиться на 60, чтобы определить сколько литров прошло через датчик за 1 с. Затем полученное число умножается на 1 000 для перевода в миллилитры. flowMilliLitres = (flowRate / 60) * 1000; totalMilliLitres += flowMilliLitres; unsigned int frac; // Вывод расхода воды в л/мин. Serial.print("Расход воды: "); Serial.print(int(flowRate)); Serial.print(" л/мин"); Serial.print("t"); // Вывод общего количества воды, прошедшего чере датчик после начала подсчета Serial.print("Общее количество воды: "); Serial.print(totalMilliLitres); Serial.println(" мл"); Serial.print("t"); Serial.print(totalMilliLitres/1000); Serial.print(" л"); // Сброс счетчика pulseCount = 0; // Разрешение прерываний attachInterrupt(sensorInterrupt, pulseCounter, FALLING); } } void pulseCounter() { // Увеличение значения счетчика импульсов pulseCount++; } |