风筝
发表于: 2020-1-29 10:39:44 | 显示全部楼层

如果您曾经访问过大型制造公司,那么您会注意到的第一件事就是它们都是自动化的。饮料工业和化学工业必须在此自动化过程中不断测量和量化它们所处理的液体,而用于测量液体流量的最常见的传感器是流量传感器。通过将流量传感器与Arduino等微控制器配合使用,我们可以计算流量,并检查通过管道的液体量,并根据需要进行控制。除制造业外,流量传感器还可用于农业、食品加工、水处理、采矿业、水循环利用、咖啡机等中。此外,水流量传感器将是自动饮水机和智能灌溉系统等项目的良好补充,我们需要监视和控制液体的流量。


在本篇文章中,我们将使用Arduino制作水流量检测装置。我们将水流传感器与Arduino和LCD连接,并对它进行编程以显示已通过阀门的水量。本文中,我们将使用YF-S201水流量传感器,该传感器使用霍尔效应来感应液体的流速。


所需组件

●    水流量传感器

●    Arduino UNO开发板

●    液晶屏(1602)

●    带内螺纹的连接器

●    连接线

●    水管


YFS201水流量传感器

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

YFS201-Water-Flow-Sensor.jpg


YFS201水流量传感器的工作简单易懂。水流传感器根据霍尔效应原理工作。霍尔效应是当在垂直于电流流动方向的方向上施加磁场时,在电导体两端产生电势差。水流传感器与磁性霍尔效应传感器集成在一起,该霍尔效应传感器每旋转一圈都会产生一个电脉冲。它的设计使霍尔效应传感器与水隔绝,并使传感器保持安全干燥。


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

YFS201-Sensor-Module.jpg

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

Female-Thread.jpg

根据YFS201数据手册,它在5V时吸收的最大电流为15mA,工作流速为1至30升/分钟。当液体流过传感器时,它与涡轮机的鳍片接触,该鳍片位于流动液体的路径中。涡轮机叶轮的轴连接到霍尔效应传感器。因此,每当水流过阀门时,都会产生脉冲。现在,我们要做的就是测量脉冲时间或计算1秒内的脉冲数,然后计算以升/小时(L / Hr)为单位的流量,然后使用简单的转换公式来找到体积流过的水。为了测量脉冲,我们将使用Arduino UNO。


电路连接图

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

Arduino-Water-Flow-Sensor-Circuit-Diagram.png

我使用了一块面包板,并且按照上面显示的电路图完成连接后,测试设置类似下图。

Arduino-Water-Flow-Sensor.jpg


Arduino水流测量装置代码

在本文末尾处提供了完整的Arduino代码。代码说明如下。


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

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

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

  1. void flow () // Interrupt function
  2. {
  3.    flow_frequency++;
  4. }
复制代码

在void setup()中,通过给出命令pinMode(pin, OUTPUT),定义Arduino UNO的引脚2为输入模式。通过使用attachInterrupt命令,只要引脚2处的信号上升,就会调用flow函数。这会将变量flow_frequency中的计数增加1。当前时间和cloopTime用于使代码每1秒运行一次。

  1. void setup()
  2. {
  3.    pinMode(flowsensor, INPUT);
  4.    digitalWrite(flowsensor, HIGH);
  5.    Serial.begin(9600);
  6.    lcd.begin(16, 2);
  7.    attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interrupt
  8.    lcd.clear();
  9.    lcd.setCursor(0,0);
  10.    lcd.print("Water Flow Meter");
  11.    lcd.setCursor(0,1);
  12.    lcd.print("Circuit Digest");
  13.    currentTime = millis();
  14.    cloopTime = currentTime;
  15. }
复制代码

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

  1. void loop ()
  2. {
  3.    currentTime = millis();
  4.    // Every second, calculate and print litres/hour
  5.    if(currentTime >= (cloopTime + 1000))
  6.    {
  7.     cloopTime = currentTime; // Updates cloopTime
  8.     if(flow_frequency != 0){
  9.       // Pulse frequency (Hz) = 7.5Q, Q is flow rate in L/min.
  10.       l_minute = (flow_frequency / 7.5); // (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour
  11.       lcd.clear();
  12.       lcd.setCursor(0,0);
  13.       lcd.print("Rate: ");
  14.       lcd.print(l_minute);
  15.       lcd.print(" L/M");
  16.       l_minute = l_minute/60;
  17.       lcd.setCursor(0,1);
  18.       vol = vol +l_minute;
  19.       lcd.print("Vol:");
  20.       lcd.print(vol);
  21.       lcd.print(" L");
  22.       flow_frequency = 0; // Reset Counter
  23.       Serial.print(l_minute, DEC); // Print litres/hour
  24.       Serial.println(" L/Sec");
  25.         }
复制代码

如果在给定的时间间隔内没有水流传感器的输出,则else代码起作用。

  1.     else {
  2.       lcd.clear();
  3.       lcd.setCursor(0,0);
  4.       lcd.print("Rate: ");
  5.       lcd.print( flow_frequency );
  6.       lcd.print(" L/M");
  7.       lcd.setCursor(0,1);
  8.       lcd.print("Vol:");
  9.       lcd.print(vol);
  10.       lcd.print(" L");
  11.     }
复制代码

Arduino水流装置的工作过程

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

Arduino-Water-Flow-Sensor-Working.jpg


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


代码

以下是本文使用的完整代码: main.rar (877 Bytes, 下载次数: 100)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1482



手机版|

GMT+8, 2024-4-29 21:46 , Processed in 0.037369 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表