Arduino 和水流量传感器测量水流量和体积
前言所需元器件YFS201水流量传感器电路原理图Arduino水流传感器代码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/hourfloat vol = 0.0,l_minute;unsigned char flowsensor = 2; // Sensor Inputunsigned 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 Interruptlcd.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/hourif(currentTime >= (cloopTime + 1000)){cloopTime = currentTime; // Updates cloopTimeif(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/hourlcd.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 CounterSerial.print(l_minute, DEC); // Print litres/hourSerial.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 SensorWater Flow Sensor output processed to read in litres/hourAdaptation Courtesy: hobbytronics.co.uk*/volatile int flow_frequency; // Measures flow sensor pulses// Calculated litres/hourfloat vol = 0.0,l_minute;unsigned char flowsensor = 2; // Sensor Inputunsigned 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-UpSerial.begin(9600);lcd.begin(16, 2);attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interruptlcd.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/hourif(currentTime >= (cloopTime + 1000)){cloopTime = currentTime; // Updates cloopTimeif(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/hourlcd.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 CounterSerial.print(l_minute, DEC); // Print litres/hourSerial.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");}}}