新闻  |   论坛  |   博客  |   在线研讨会
「电路DIY」使用ARDUINO和流量传感器测量水流量和体积
电子资料库 | 2023-02-24 16:17:33    阅读:2751   发布文章

流速和容积有助于判断进入或通过特定容器的液体量。对于某些过程自动化应用来说,这个简单的流体测量任务对项目的成功至关重要,如果不能正确完成,可能会使整个过程陷入困境。这就是为什么在今天的教程中,我认为看看这个漂亮的水流量传感器会很酷YF-S201,以及在基于Arduino的项目中的使用。

YF-S201水流量传感器由一个针轮传感器组成,该传感器测量通过它的液体量。

image.png

YFS201

该传感器利用电磁学原理,当液体流过传感器时,流动作用会影响传感器中涡轮的散热片,导致车轮打滑。涡轮的轴与霍尔效应传感器相连,因此每次旋转都会产生一个脉冲,通过微控制器监测该脉冲,传感器可用于确定通过它的流体体积。

作为今天的微控制器,我们将使用微控制器. Uno将用于计算一段时间内检测到的脉冲数,并使用脉冲总数计算流速(以升/小时为单位)和通过它的流体总体积。结果,流量和体积,将显示在一个16×2液晶显示屏上,以便向用户提供视觉反馈。如果16×2 LCD不可用,您可以通过Arduino串行监视器查看数据。

在本文章的最后,您将了解如何在Arduino中使用YF-S201流量传感器。

所需组件

生成此项目需要以下组件:

  1. YF-S201水流传感器

  2. Arduino UNO(或任何其他兼容板)

  3. 16×2液晶显示屏

  4. 跨接导线

  5. 试验板

  6. 电源组或电池组

示意图

按下图所示连接部件:

image.png


示意图

为了方便读取传感器和计算流量,本发明的中断特性Atmega328p在Ardunio上,使用YF-S201连接到Uno的一个中断启用的IO(在本例中为插脚D2)。另一方面,LCD以4位模式连接到Arduino。为了节省连接时间,您还可以决定使用支持I2C的16×2 LCD显示器。为此,您只需将4根导线从显示器连接到Arduino。但是,它需要对代码进行一些修改,所以在做出决定之前,请确保您可以处理它。

下面提供了一个连接的分解图,显示了组件是如何连接的,针脚对针脚;

YF-S201 – Arduino Uno

VCC(red wire) - 5VGND(Black wire) - GNDSignal(Yellow wire) - A0

液晶显示器–Arduino Uno

Vss - GNDVdd - 5VV0 - (Connect to middle point of potentiometer)RS - D12RW- GNDE - D11D7 - D9D6 - D3D5 - D4D4 - D5LED+ - 5VLED - GND

为了更好地理解液晶显示器的连接,你可以看看我们之前写的这篇教程16×2液晶显示器与Arduino接口董事会

在继续下一节之前,请仔细检查连接,确保一切正常。

代码

草图背后的想法很简单:监视YF-S201检测霍尔传感器何时触发(检测到流量),并增加一个变量以显示增加的流入量。然而,为了高效准确地做到这一点,我们将使用Arduino的中断特性,这样每当霍尔传感器检测到旋转磁铁时,Arduino就会触发并注册上升沿中断。然后,在特定时间内触发的总中断数用于生成流量和流经流量计的液体总体积。

由于流的确定非常直接,因此本教程中我们将使用的唯一库是Arduino液晶库. 该库包含的功能使16×2液晶显示器与Arduino接口变得容易。该库包含在Arduino IDE中,但如果没有,则可以通过Arduino IDE库管理器进行安装。

安装了库之后,我们开始为项目编写Arduino草图。

像往常一样,我会检查代码并解释其中的部分内容。

代码从包含液晶库开始:

#include <LiquidCrystal.h>

接下来是一些变量的声明,这些变量将用于以后存储数据,并创建一个液晶库实例。

volatile int flow_frequency; // Measures flow sensor pulsesfloat vol = 0.0,l_minute;unsigned char flowsensor = 2; // Sensor Inputunsigned long currentTime;unsigned long cloopTime;LiquidCrystal lcd(12, 11, 5, 4, 3, 9);

接下来,我们创建流量()功能。此函数在检测到中断时调用,它将增加作为流量指示的流量计数器。

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

接下来,我们编写无效设置()功能。我们通过初始化串行通信来启动该功能,以便访问串行监视器以进行调试。

Serial.begin(9600);

接下来,我们将流量传感器信号管脚所连接的Arduino管脚声明为输入管脚。我们把大头针拉上去 "Igh"建立一个 Faxing边缘中断流量()我们先前创建的回调函数。

pinMode(flowsensor, INPUT);digitalWrite(flowsensor, HIGH); // Optional Internal Pull-UpattachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interrupt

接下来,我们初始化LCD并显示一些单词,以创建类似于移动应用程序中的启动屏幕的效果。

lcd.begin(16, 2);lcd.clear();lcd.setCursor(0,0);lcd.print("Arduino Flow Meter");lcd.setCursor(0,1);lcd.print("v1.0");

我们通过调用millis()函数来跟踪从流量开始的时间,作为特定时间范围内流量的度量。

 currentTime = millis();   cloopTime = currentTime;
}

接下来,我们编写无效循环()功能

循环首先比较自上一个循环以来经过的时间。然后,通过中断操作获得的流量频率除以时间(以分钟为单位),该值显示为流量。该值也会加到现有体积(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");
    }

如果在整个过程中没有触发中断,LCD上显示零。

   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");
    }
   }
}

循环继续,价值增加,直到项目断电。

完整的草图如下所示,并附在下载部分下。

#include <LiquidCrystal.h>float vol = 0.0,l_minute;unsigned char flowsensor = 2; // Sensor Inputunsigned long currentTime;unsigned long cloopTime;LiquidCrystal lcd(12, 11, 5, 4, 3, 9);void flow () // Interrupt function to increment flow{
   flow_frequency++;
}void setup(){
   Serial.begin(9600);
   pinMode(flowsensor, INPUT);
   digitalWrite(flowsensor, HIGH); // Optional Internal Pull-Up
   attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interrupt
   
   lcd.begin(16, 2);
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Arduino FlowMeter");
   lcd.setCursor(0,1);
   lcd.print("v1.0");
   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)
    {
      
       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");
    }
   }
}
演示

检查一下你的关系,确保一切正常。完成此操作并完成代码后,将硬件连接到计算机并将代码上载到Arduino板。如果成功,您将看到显示如下图所示。

image.png

图像来源:circuitdigest.com

用任何对你来说容易的方法连接一些管道,然后让一些水通过流量传感器。你应该看到流量显示在屏幕上,随着水流强度的变化而变化,你还应该看到随着更多的水流,体积也会增加。
如果在那一刻你周围没有水管,你可以向传感器吹入一些空气。你应该听到转子旋转的声音,LCD上的数值应该会增加。

流量/体积计量是一些工业甚至个别消费者过程中非常重要的一部分。它不仅可以监控消耗量,还可以监控仪表供应量,我相信智能水表和自动液体分配器等应用程序应该能让您深入了解如何将这个看似基础的项目转变成一个令人惊叹的超级有用的产品。


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客