Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

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

[复制链接]
 楼主| 发表于 2022-3-25 06:29 | 显示全部楼层
实验程序:有工作流量时点亮LED
1)实验开源图形编程(Mind+Mixly、编玩边学)

7.8-19.jpg

 楼主| 发表于 2022-3-25 06:29 | 显示全部楼层
2)实验场景图

7.8-20.jpg

 楼主| 发表于 2022-3-25 06:31 | 显示全部楼层
实验程序:水流量传感器控制5V继电器和LCD1602 I2C模块
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十二:用LCD1602A屏显示水流量传感器输出
  4.   实验说明:D2处接10K上拉电阻(另一端接VCC)
  5.   实验接线:Uno D2接流量传感器OUT,继电器接D4
  6.   Arduino------LCD1602
  7.   5V-------------VCC
  8.   GND-----------GND
  9.   A4-----------SDA IIC 数据线
  10.   A5-----------SCL  IIC 时钟线
  11. */

  12. #include <LiquidCrystal_I2C.h> //包括 LiquidCrystal 库
  13. LiquidCrystal_I2C lcd(0x27, 16, 2);
  14. #define FLOWSENSORPIN 2 //连接到 Arduino 数字引脚 2 的水流传感器
  15. #define relayPin 4    // 连接到 Arduino 数字引脚 4 的 5v 继电器模块
  16. volatile uint16_t pulses = 0; // 计算多少个脉冲
  17. volatile uint8_t lastflowpinstate; // 跟踪脉冲引脚的状态
  18. volatile uint32_t lastflowratetimer = 0; //您可以尝试保持脉冲之间的时间间隔
  19. volatile float flowrate; // 并使用它来计算流量
  20. // 每毫秒调用一次中断,寻找来自传感器的任何脉冲!
  21. SIGNAL(TIMER0_COMPA_vect) {
  22.   uint8_t x = digitalRead(FLOWSENSORPIN);
  23.   if (x == lastflowpinstate) {
  24.     lastflowratetimer++;
  25.     return; // 没有改变!
  26.   
  27.   if (x == HIGH)  //从低到高的过渡!
  28.     pulses++;
  29.   }
  30.   lastflowpinstate = x;
  31.   flowrate = 1000.0;
  32.   flowrate /= lastflowratetimer;  // 以赫兹为单位
  33.   lastflowratetimer = 0;
  34. }

  35. void useInterrupt(boolean v) {
  36.   if (v) {  // Timer0 已经用于 millis() - 我们将在某处中断
  37.     // 在中间并调用上面的“比较A”函数
  38.     OCR0A = 0xAF;
  39.     TIMSK0 |= _BV(OCIE0A);
  40.   } else {  // 不再调用中断函数 COMPA
  41.     TIMSK0 &= ~_BV(OCIE0A);
  42.   }
  43. }

  44. void setup() {
  45.   Serial.begin(9600);
  46.   Serial.println("---水流量传感器准备就绪---");
  47.   lcd.init();                      // 初始化液晶显示器
  48.   lcd.backlight();
  49.   lcd.begin(16, 2);                //16X2液晶显示器
  50.   lcd.setBacklight(HIGH);
  51.   lcd.setCursor(0, 0);             //设置显示位置
  52.   lcd.print("Aqua counter");
  53.   pinMode(FLOWSENSORPIN, INPUT); //将水流量传感器设置为输入
  54.   pinMode(relayPin, OUTPUT); //将继电器模块设置为输出
  55.   digitalWrite(relayPin, LOW);
  56.   digitalWrite(FLOWSENSORPIN, HIGH);//可选的内部上拉
  57.   lastflowpinstate = digitalRead(FLOWSENSORPIN);
  58.   useInterrupt(true);
  59.   delay(2000);
  60.   lcd.clear();
  61. }

  62. void loop(){
  63.   lcd.setCursor(0, 0);
  64.   lcd.print("Pulses:");
  65.   lcd.print(pulses, DEC);
  66.   lcd.print(" Hz:");
  67.   lcd.print(flowrate);
  68.   //lcd.print(flowrate);
  69.   Serial.print("频率:");
  70.   Serial.println(flowrate);
  71.   Serial.print("脉冲:");
  72.   Serial.println(pulses, DEC);
  73.   // if a plastic sensor use the following calculation
  74.   // Sensor Frequency (Hz) = 7.5 * Q (Liters/min)
  75.   // Liters = Q * time elapsed (seconds) / 60 (seconds/minute)
  76.   // Liters = (Frequency (Pulses/second) / 7.5) * time elapsed (seconds) / 60
  77.   // Liters = Pulses / (7.5 * 60)
  78.   float liters = pulses;
  79.   liters /= 7.5;
  80.   liters /= 60.0;

  81.   /*
  82.     // if a brass sensor use the following calculation
  83.     float liters = pulses;
  84.     liters /= 8.1;
  85.     liters -= 6;
  86.     liters /= 60.0;
  87.   */
  88.   Serial.print(liters);
  89.   Serial.println(" 升");
  90.   lcd.setCursor(0, 1);
  91.   lcd.print(liters);
  92.   lcd.print(" Litres        ");
  93.   if (liters >= 0.15) //限水设置
  94.   {
  95.     digitalWrite(relayPin, HIGH);
  96.   }
  97.   else {
  98.     digitalWrite(relayPin, LOW);
  99.   }
  100.   delay(2000);
  101.   lcd.clear();
  102. }
复制代码


 楼主| 发表于 2022-3-25 06:32 | 显示全部楼层
2)实验串口返回情况
7.8-32.jpg

 楼主| 发表于 2022-3-25 06:32 | 显示全部楼层
(3)实验场景图

7.8-33.jpg

 楼主| 发表于 2022-3-25 06:34 | 显示全部楼层
7.8-34.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2023-3-29 22:12 , Processed in 0.087056 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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