【 Arduino 和水流量传感器测量水流量和体积】

前言

在这里插入图片描述

通过使用带有 Arduino 等微控制器的流量传感器,我们可以计算流量,并检查通过管道的液体量,并根据需要进行控制。除了制造业,流量传感器还可以在农业、食品加工、水管理、采矿业、水回收、咖啡机等领域找到。此外,水流量传感器将是一个很好的补充项目,如自动饮水机和智能灌溉系统,我们需要监控和控制液体的流动。

在这个项目中,我们将使用 Arduino 构建一个水流传感器。我们将水流量传感器与 Arduino 和 LCD 连接,并对其进行编程以显示通过阀门的水量。对于这个特定的项目,我们将使用YF-S201 水流量传感器,它使用霍尔效应来感应液体的流量。

所需元器件

水流量传感器
Arduino UNO
液晶显示器 (16x2)
带内螺纹的连接器
连接线
管道

YFS201水流量传感器

传感器有 3 根电线,红色、黄色和黑色,如下图所示。红线用于提供 5V 至 18V 的电源电压,黑线连接到 GND。黄色线用于输出(脉冲),可由 MCU 读取。水流传感器由一个风车传感器组成,用于测量通过它的液体量。

在这里插入图片描述

YFS201水流量传感器的工作原理很容易理解。水流量传感器的工作原理是霍尔效应。霍尔效应是在垂直于电流流动的方向上施加磁场时在电导体上产生的电位差。水流传感器与磁霍尔效应传感器集成在一起,每转一圈都会产生一个电脉冲。它的设计使得霍尔效应传感器与水隔绝,并允许传感器保持安全和干燥。

YFS201传感器模块单独的图片如下图所示。

在这里插入图片描述

为了连接管道和水流量传感器,我使用了两个带内螺纹的连接器,如下所示。

在这里插入图片描述


根据YFS201 规格,它在 5V 时汲取的最大电流为 15mA,工作流量为 1 至 30 升/分钟。当液体流过传感器时,它与涡轮叶轮的翅片接触,涡轮叶轮位于流动液体的路径中。涡轮叶轮的轴连接到霍尔效应传感器。因此,每当水流过阀门时,它都会产生脉冲。现在,我们所要做的就是测量加号的时间或计算 1 秒内的脉冲数,然后计算以升/小时 (L/Hr) 为单位的流速,然后使用简单的转换公式求出体积穿过它的水。为了测量脉冲,我们将使用 Arduino UNO。下图显示了水流传感器的引脚排列。

电路原理图

水流传感器电路图如下所示,用于将水流传感器和 LCD (16x2) 与 Arduino 连接。

在这里插入图片描述

水流传感器和 LCD(16x2) 与 Arduino 的连接以表格形式在下表中给出。请注意,电位器连接在 5V 和 GND 之间,电位器的引脚 2 连接到 LCD 的 V0 引脚。

在这里插入图片描述


我使用了一个面包板,一旦按照上面显示的电路图完成连接,我的测试设置看起来像这样。

在这里插入图片描述

Arduino水流传感器代码

完整的水流传感器 Arduino 代码在页面底部给出。代码解释如下。

我们正在使用 LCD 的头文件,它简化了 LCD 与 Arduino 的接口,并且引脚 12、11、5、4、3、9 被分配用于 LCD 和 Arduino 之间的数据传输。传感器的输出引脚连接到 Arduino UNO 的引脚 2。

volatile int flow_frequency; // Measures flow sensor pulses
// Calculated litres/hour
 float vol = 0.0,l_minute;
unsigned char flowsensor = 2; // Sensor Input
unsigned long currentTime;
unsigned long cloopTime;
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 9);

该函数是一个中断服务程序,只要 Arduino UNO 的 pin2 有中断信号,就会调用该函数。对于每个中断信号,变量 flow_frequency 的计数将增加 1。

void flow () // Interrupt function
{
   flow_frequency++;
}

在 void 设置中,我们通过给出命令 pinMode(pin, OUTPUT) 告诉 MCU Arduino UNO 的引脚 2 用作 INPUT。通过使用 attachInterrupt 命令,只要引脚 2 的信号上升,就会调用流函数。这会将变量 flow_frequency 中的计数增加 1。当前时间和 cloopTime 用于代码每 1 秒运行一次。

void setup()
{
   pinMode(flowsensor, INPUT);
   digitalWrite(flowsensor, HIGH); 
   Serial.begin(9600);
   lcd.begin(16, 2);
   attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interrupt
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Water Flow Meter");
   lcd.setCursor(0,1);
   lcd.print("Circuit Digest");
   currentTime = millis();
   cloopTime = currentTime;
}

if 函数确保其内部的代码每秒钟运行一次。这样,我们就可以统计出水流传感器每秒产生的频率数。数据表中的流速脉冲特性是频率为 7.5 乘以流速。所以流速是频率/7.5。在找到以升/分钟为单位的流量后,将其除以 60 以将其转换为升/秒。该值每隔一秒添加到 vol 变量中。

void loop ()
{
   currentTime = millis();
   // Every second, calculate and print litres/hour
   if(currentTime >= (cloopTime + 1000))
   {
    cloopTime = currentTime; // Updates cloopTime
    if(flow_frequency != 0){
      // Pulse frequency (Hz) = 7.5Q, Q is flow rate in L/min.
      l_minute = (flow_frequency / 7.5); // (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Rate: ");
      lcd.print(l_minute);
      lcd.print(" L/M");
      l_minute = l_minute/60;
      lcd.setCursor(0,1);
      vol = vol +l_minute;
      lcd.print("Vol:");
      lcd.print(vol);
      lcd.print(" L");
      flow_frequency = 0; // Reset Counter
      Serial.print(l_minute, DEC); // Print litres/hour
      Serial.println(" L/Sec");
        }

当水流传感器在给定时间跨度内没有输出时,else 功能起作用。

  else {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Rate: ");
      lcd.print( flow_frequency );
      lcd.print(" L/M");
      lcd.setCursor(0,1);
      lcd.print("Vol:");
      lcd.print(vol);
      lcd.print(" L");
    }

Arduino水流量传感器工作

在我们的项目中,我们将水流传感器连接到管道。如果管道的输出阀关闭,则水流量传感器的输出为零(无脉冲)。在 Arduino 的 pin 2 上将看不到中断信号,并且 flow_frequency 的计数为零。在这种情况下,编写在 else 循环中的代码将起作用。

在这里插入图片描述

如果管道的输出阀打开。水流过传感器,从而使传感器内部的轮子旋转。在这种情况下,我们可以观察到传感器产生的脉冲。这些脉冲将作为 Arduino UNO 的中断信号。对于每个中断信号(上升沿),flow_frequency 变量的计数将加一。当前时间和 cloopTIme 变量确保每隔一秒采用 flow_frequency 的值来计算流量和体积。计算完成后,将 flow_frequency 变量设置为零,整个过程从头开始。

完整代码

/*

YF‐ S201 Water Flow Sensor

Water Flow Sensor output processed to read in litres/hour

Adaptation Courtesy: hobbytronics.co.uk

*/

volatile int flow_frequency; // Measures flow sensor pulses

// Calculated litres/hour

 float vol = 0.0,l_minute;

unsigned char flowsensor = 2; // Sensor Input

unsigned long currentTime;

unsigned long cloopTime;

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 9);

void flow () // Interrupt function

{

   flow_frequency++;

}

void setup()

{

   pinMode(flowsensor, INPUT);

   digitalWrite(flowsensor, HIGH); // Optional Internal Pull-Up

   Serial.begin(9600);

   lcd.begin(16, 2);

   attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interrupt

   lcd.clear();

   lcd.setCursor(0,0);

   lcd.print("Water Flow Meter");

   lcd.setCursor(0,1);

   lcd.print("Circuit Digest");

   currentTime = millis();

   cloopTime = currentTime;

}

void loop ()

{

   currentTime = millis();

   // Every second, calculate and print litres/hour

   if(currentTime >= (cloopTime + 1000))

   {

    cloopTime = currentTime; // Updates cloopTime

    if(flow_frequency != 0){

      // Pulse frequency (Hz) = 7.5Q, Q is flow rate in L/min.

      l_minute = (flow_frequency / 7.5); // (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour

      lcd.clear();

      lcd.setCursor(0,0);

      lcd.print("Rate: ");

      lcd.print(l_minute);

      lcd.print(" L/M");

      l_minute = l_minute/60;

      lcd.setCursor(0,1);

      vol = vol +l_minute;

      lcd.print("Vol:");

      lcd.print(vol);

      lcd.print(" L");

      flow_frequency = 0; // Reset Counter

      Serial.print(l_minute, DEC); // Print litres/hour

      Serial.println(" L/Sec");

    }

    else {

      Serial.println(" flow rate = 0 ");

      lcd.clear();

      lcd.setCursor(0,0);

      lcd.print("Rate: ");

      lcd.print( flow_frequency );

      lcd.print(" L/M");

      lcd.setCursor(0,1);

      lcd.print("Vol:");

      lcd.print(vol);

      lcd.print(" L");

    }

   }

}

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...