【Arduino】108种传感器模块系列实验(91)-水流量传感器模块-Arduino爱好者 - Powered by Discuz!

Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

[经验] 【Arduino】108种传感器模块系列实验(91)--水流量传感器模块

[复制链接]
发表于 2021-7-8 21:37 | 显示全部楼层

万分感谢,找到问题所在了。
 楼主| 发表于 2021-7-9 06:26 | 显示全部楼层
本帖最后由 eagler8 于 2021-7-9 06:52 编辑
oanger 发表于 2021-7-8 20:42
老表,还是p10,几个手机啊

三 个手机,这个做实验拍照录像还不错
明年初还能升级鸿蒙系统呢
 楼主| 发表于 2021-7-9 08:04 | 显示全部楼层
本帖最后由 eagler8 于 2021-7-9 08:16 编辑

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验九十一: 1号霍尔水流量传感器 直饮机流量监控模块
  项目八:通过串口,监测实时流量与累计流量(有流量时LED亮)
  实验接线:Uno D2接流量传感器OUT,LED接D13

实验说明:
float calibrationFactor = 7.5;
这个系数(及后面算法)仅为参考演示值,实际使用请自行专业校准

实验开源代码
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验九十一: 1号霍尔水流量传感器 直饮机流量监控模块
  4.   项目八:通过串口,监测实时流量与累计流量(有流量时LED亮)
  5.   实验接线:Uno D2接流量传感器OUT,LED接D13
  6. */

  7. byte statusLed    = 13;
  8. byte sensorInterrupt = 0;  // 0 = digital pin 2
  9. byte sensorPin       = 2;

  10. // 霍尔效应流量传感器每秒输出大约 7.5 个脉冲
  11. // 升/分钟的流量。
  12. float calibrationFactor = 7.5; //这个系数(及后面算法)仅为参考演示值,实际使用请自行专业校准

  13. volatile byte pulseCount;

  14. float flowRate;
  15. unsigned int flowMilliLitres;
  16. unsigned long totalMilliLitres;

  17. unsigned long oldTime;

  18. void setup() {
  19.   // 初始化串行连接以向主机报告值
  20.   Serial.begin(38400);

  21.   // 将状态 LED 设置为输出
  22.   pinMode(statusLed, OUTPUT);
  23.   digitalWrite(statusLed, LOW);  // 我们连接了一个高电平有效的 LED

  24.   pinMode(sensorPin, INPUT);
  25.   digitalWrite(sensorPin, HIGH); // 上拉霍尔效应流量传感器输出端为高电平

  26.   pulseCount        = 0;
  27.   flowRate          = 0.0;
  28.   flowMilliLitres   = 0;
  29.   totalMilliLitres  = 0;
  30.   oldTime           = 0;

  31.   // 霍尔效应传感器连接到使用中断 0 的引脚 2。
  32.   // 配置为在下降状态变化时触发(从 HIGH 转换
  33.   // 状态到 LOW 状态)
  34.   attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  35.   Serial.println("流量计准备就绪OK");
  36. }

  37. void loop() {
  38.   if ((millis() - oldTime) > 1000)   // 每秒只处理一次计数器
  39.   {
  40.     // 在计算流量并将值发送给主机时禁用中断
  41.     detachInterrupt(sensorInterrupt);

  42.     // 因为这个循环可能不会在 1 秒的间隔内完成,我们计算
  43.     // 自上次执行和使用以来经过的毫秒数
  44.     // 缩放输出。 我们还应用了校准因子来缩放输出
  45.     // 基于每测量单位每秒的脉冲数(升/分钟
  46.     // 这种情况)来自传感器。
  47.     flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;

  48.     // 请注意执行此处理过程的时间。 请注意,因为我们已经
  49.     // 禁用中断millis() 函数实际上不会正确递增
  50.     // 此时,它仍然会返回之前设置的值
  51.     // 中断消失了。
  52.     oldTime = millis();

  53.     // 将以升/分钟为单位的流速除以 60 以确定有多少升
  54.     // 在这 1 秒的间隔内通过传感器,然后乘以 1000 到
  55.     // 转换为毫升。
  56.     flowMilliLitres = (flowRate / 60) * 1000;

  57.     // 将这一秒传递的毫升数加到累计总数中
  58.     totalMilliLitres += flowMilliLitres;

  59.     unsigned int frac;

  60.     // 以升/分钟为单位打印这一秒的流量
  61.     Serial.print("流速: ");
  62.     Serial.print(int(flowRate));  // 打印变量的整数部分
  63.     Serial.print(".");             // 打印小数点
  64.     //确定小数部分。 10 乘数给我们 1 个小数位。
  65.     frac = (flowRate - int(flowRate)) * 10;
  66.     Serial.print(frac, DEC) ;      // 打印变量的小数部分
  67.     Serial.print("升/分钟");
  68.     // 打印这一秒流过的毫升数
  69.     Serial.print("  当前流量: ");             // 输出分隔符
  70.     Serial.print(flowMilliLitres);
  71.     Serial.print("毫升/秒");

  72.     // 打印自启动以来流过的累计升数
  73.     Serial.print("  累计流量: ");             // 输出分隔符
  74.     Serial.print(totalMilliLitres);
  75.     Serial.println("毫升");

  76.     if (flowMilliLitres > 10) {
  77.       digitalWrite(statusLed, HIGH); //有流量时点亮LED灯,否则熄灭
  78.     }

  79.     if (flowMilliLitres < 10) {
  80.       digitalWrite(statusLed, LOW);
  81.     }

  82.     //重置脉冲计数器,以便我们可以再次开始递增
  83.     pulseCount = 0;

  84.     //现在我们已完成发送输出,再次启用中断
  85.     attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  86.   }
  87. }

  88. // 中断服务程序
  89. void pulseCounter() {
  90.   // 增加脉冲计数器
  91.   pulseCount++;
  92. }
复制代码


 楼主| 发表于 2021-7-9 08:05 | 显示全部楼层
实验串口返回情况

26.jpg
 楼主| 发表于 2021-7-9 08:20 | 显示全部楼层
实验场景图

27.jpg
 楼主| 发表于 2021-7-9 08:30 | 显示全部楼层
水流量传感器工作原理
其结构很简单。主要部件是霍尔效应传感器、 涡轮叶轮 和 磁铁。水从入口流入,从出口流出。水流带动轮子转动,轮子上的磁铁也随之转动。磁场旋转触发霍尔传感器,输出高低电平方波(脉冲)。

Water-flow-sensor-principle-1.gif

轮子每转一圈,流过的水量都是一定的,输出的方波数也是如此。因此,我们可以通过计算方波(脉冲)的数量来计算水的流量。

 楼主| 发表于 2021-7-9 08:33 | 显示全部楼层
本帖最后由 eagler8 于 2021-7-9 08:41 编辑

最经典的水流量传感器 YF-S402YF-S201就 依赖霍尔传感器。

28.jpg
 楼主| 发表于 2021-7-9 08:40 | 显示全部楼层
关于实验代码


这里可以 digitalread() 在 LOOP 函数中使用来读取水流传感器的输出。每当读取到高电平时,计数加一。但是这种方式不是实时的,程序每次执行都需要一定的等待时间,在此期间不会检测到新的脉冲。


对于此类要求实时的应用程序,我们通常使用 中断。每当检测到脉冲的上升沿时,就会触发中断,计数加一。


29.jpg

有关中断的更多详细信息,  请查看 attachinterrupt()


官方链接:https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/


 楼主| 发表于 2021-7-9 08:48 | 显示全部楼层
应用场景决定了要使用的水流量传感器的类型
虽然您可以在我们的网络市场上找到十几个或更多的水流传感器,但通常它们可以分为两种类型:

大口径铜管
小口径塑料管

YF-B1~YF-B7属于大口径型,可以连续在工业,农业和畜牧业常用的,因此需要使用铜管其对压力的抗性和腐蚀更好的抗性。

而小直径的通常用于家用电器。其中最常见的是 YF-S201 和 YF-S402。YF-S201适用于卡片机、自动售货机,而YF-S402适用于饮水机、咖啡机等小口径家用电器。顺便说一下,YF-S402和YF-S201都是Arduino和Raspberry Pi水流传感器项目中常用的。

30.jpg

 楼主| 发表于 2021-7-9 08:52 | 显示全部楼层
流量计YF-S402C规格书

31.jpg



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|好玩手机游戏盒子|196体育|Arduino爱好者

GMT+8, 2023-10-4 02:09 , Processed in 0.088358 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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