Arduino 和水流量传感器测量水流量和体积
前言
通过使用带有 Arduino 等微控制器的流量传感器,我们可以计算流量,并检查通过管道的液体量,并根据需要进行控制。除了制造业,流量传感器还可以在农业、食品加工、水管理、采矿业、水回收、咖啡机等领域找到。此外,水流量传感器将是一个很好的补充项目,如自动饮水机和智能灌溉系统,我们需要监控和控制液体的流动。
在这个项目中,我们将使用 Arduino 构建一个水流传感器。我们将水流量传感器与 Arduino 和 LCD 连接,并对其进行编程以显示通过阀门的水量。对于这个特定的项目,我们将使用YF-S201 水流量传感器,它使用霍尔效应来感应液体的流量。
所需元器件
水流量传感器
Arduino UNO
液晶显示器 (16x2)
带内螺纹的连接器
连接线
管道
YFS201水流量传感器
传感器有 3 根电线,红色、黄色和黑色,如下图所示。红线用于提供 5V 至 18V 的电源电压,黑线连接到 GND。黄色线用于输出(脉冲),可由 MCU 读取。水流传感器由一个风车传感器组成,用于测量通过它的液体量。
YFS201传感器模块单独的图片如下图所示。
根据YFS201 规格,它在 5V 时汲取的最大电流为 15mA,工作流量为 1 至 30 升/分钟。当液体流过传感器时,它与涡轮叶轮的翅片接触,涡轮叶轮位于流动液体的路径中。涡轮叶轮的轴连接到霍尔效应传感器。因此,每当水流过阀门时,它都会产生脉冲。现在,我们所要做的就是测量加号的时间或计算 1 秒内的脉冲数,然后计算以升/小时 (L/Hr) 为单位的流速,然后使用简单的转换公式求出体积穿过它的水。为了测量脉冲,我们将使用 Arduino UNO。下图显示了水流传感器的引脚排列。
电路原理图
水流传感器电路图如下所示,用于将水流传感器和 LCD (16x2) 与 Arduino 连接。
我使用了一个面包板,一旦按照上面显示的电路图完成连接,我的测试设置看起来像这样。
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 举报,一经查实,本站将立刻删除。