Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

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

[复制链接]
 楼主| 发表于 2021-3-17 18:19 | 显示全部楼层
吹气实验,串口输出截图

360截图20210317181256977.jpg
 楼主| 发表于 2021-3-18 07:30 | 显示全部楼层
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验九十一: 1号霍尔水流量传感器 直饮机流量监控模块
  项目三:使用串口读取水流速传感器的累计脉冲数
  实验接线:Uno D2接流量传感器OUT


  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验九十一: 1号霍尔水流量传感器 直饮机流量监控模块
  4.   项目三:使用串口读取水流速传感器的累计脉冲数
  5.   实验接线:Uno D2接流量传感器OUT
  6. */

  7. #define PIN 2
  8. volatile long count = 0;//变量count声明为volatile类型

  9. void setup() {
  10.   pinMode(PIN, INPUT);
  11.   attachInterrupt(0, blinkA, FALLING);//当引脚电平由高电平变为低电平时触发中断服务程序
  12.   Serial.begin(9600);
  13. }

  14. void loop() {
  15.   Serial.print("累计脉冲=");
  16.   Serial.println(count);
  17.   delay(1000);
  18. }

  19. void blinkA()
  20. {
  21.   count++;
  22. }
复制代码


 楼主| 发表于 2021-3-18 07:31 | 显示全部楼层
实验串口输出截图

14.jpg
 楼主| 发表于 2021-3-18 07:38 | 显示全部楼层
这里使用了attachInterrupt()函数


SR(中断服务程序)顾名思义就是中断Arduino当前正在处理的事情而优先去执行中断服务程序。当中断服务程序完成以后,再回来继续执行刚才执行的事情。中断服务程序对监测Arduino输入有很大的用处。
我们可以使用attachInterrupt()函数,利用Arduino的引脚触发中断程序。
15.jpg
使用中断
中断很适合执行那些需要不断检查的工作,比如检查一个引脚上连接的按键开关是否被按下。中断更适用于很快就会消失的信号检查,比如某一个引脚用于检测脉冲信号,这个脉冲信号的持续时间可能十分短暂。如果不使用中断,那么假如Arduino开发板正在执行其它任务时,突然这个脉冲信号来了,还不等Arduino开发板完成正在执行的工作,这个脉冲信号可能就已经消失了。而使用中断,就可以确保这个转瞬即逝的脉冲信号可以很好的被Arduino开发板检测到并执行相应任务。
语法
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);
参数
pin: 中断引脚号
ISR: 中断服务程序名
mode:中断模式
中断模式(mode)有以下几种形式:
LOW: 当引脚为低电平时触发中断服务程序
CHANGE: 当引脚电平发生变化时触发中断服务程序
RISING: 当引脚电平由低电平变为高电平时触发中断服务程序
FALLING: 当引脚电平由高电平变为低电平时触发中断服务程序

 楼主| 发表于 2021-3-18 08:35 | 显示全部楼层
实验场景图

16.jpg
 楼主| 发表于 2021-3-18 08:56 | 显示全部楼层
记录脉冲的原理是,在转盘上设置磁感应点,每次磁场穿过传感器时,输出一个电平信号:


17.gif
 楼主| 发表于 2021-3-18 09:54 | 显示全部楼层
本帖最后由 eagler8 于 2021-3-18 09:55 编辑

采用外部中断函数计数,当传感器被磁铁触发,程序中断,执行计数函数,记录一次。把每1000毫秒的圈数,再乘以30(双磁铁)即为实时的转速。

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验九十一: 1号霍尔水流量传感器 直饮机流量监控模块
  4.   项目四:通过外部中断简易测量转速(转/分钟)
  5.   实验接线:Uno D2接流量传感器OUT
  6. */

  7. const byte interruptPin = 2;
  8. const long taketime = 1000; // 每次测量的时间为1000毫秒
  9. unsigned long time; //设置变量 time,计时
  10. float Val = 0; //设置变量 Val,计数

  11. void setup() {
  12.   Serial.begin(9600);
  13.   attachInterrupt(digitalPinToInterrupt(interruptPin), count, FALLING);//触发信号必须是变化的,上升或下降皆可
  14.   time = millis();//开始计时,time获得当前系统时间
  15. }

  16. void loop() {
  17.   if (millis() >= time)
  18.   {
  19.     Serial.print("转速= ");
  20.     Serial.println(Val * 30); //转换成rpm,单磁铁触发分辨率为60rpm,2个磁铁为30rpm
  21.     time = millis() + taketime;//标记未来的时间点,1000ms后执行if判断,输出结果。另,降低刷新频率,可以提高分辨率
  22.     Val = 0;//输出速度结果后清零,记录下一秒的触发次数
  23.   }
  24. }

  25. void count() {
  26.   Val += 1;
  27. }
复制代码







 楼主| 发表于 2021-3-18 09:55 | 显示全部楼层
实验串口输出

17-.jpg
 楼主| 发表于 2021-3-18 10:16 | 显示全部楼层
实验输出的实时转速波形

18.jpg
 楼主| 发表于 2021-3-18 10:44 | 显示全部楼层
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验九十一: 1号霍尔水流量传感器 直饮机流量监控模块
  4.   项目五:简易测速
  5. */

  6. int rpmcount;  //一秒钟旋圈数
  7. int rpm ;//速度(转/分钟)
  8. unsigned long sj;//运行时间

  9. void setup (){
  10.   Serial.begin(9600);
  11.   attachInterrupt(0, rpm_fun, CHANGE);
  12.   rpmcount = 0;
  13.   rpm = 0;
  14.   sj = 0;
  15. }

  16. void loop()
  17. {

  18.   if ((millis() - sj) >= 1000) {
  19.     rpm = rpmcount * 3;
  20.     rpmcount = rpmcount / 2;
  21.     Serial.print("秒转:");
  22.     Serial.print(rpmcount);
  23.     Serial.println("圈");
  24.     Serial.print("转速= ");
  25.     Serial.print(rpm);
  26.     Serial.println("转/分钟");
  27.     Serial.println("");

  28.     sj = millis();
  29.     rpmcount = 0;
  30.     rpm = 0;
  31.   }
  32. }

  33. void rpm_fun()
  34. {
  35.   rpmcount++;
  36. }
复制代码


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

本版积分规则

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

GMT+8, 2023-3-29 21:03 , Processed in 0.074072 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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