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

    }

   }

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340