找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3619|回复: 2
打印 上一主题 下一主题
收起左侧

YF-S201水流量传感器控制燃气热水器(附Arduino代码)

[复制链接]
跳转到指定楼层
楼主
ID:219562 发表于 2021-1-6 14:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
它装在热水器进水端,用于检测进水流量,当水通过水流转子组件时,磁性转子转动并且转速随着流量变化而变化,霍尔传感器输出相应脉冲信号,反馈给控制器,由控制器判断水流量的大小,进行调控。

1 红  IN   接正极
2 黄  OUT  信号输出线

3 黑  GND  接负极

以1L/min的流速为列,就是7.5 * 1* 60就等于流过1升水输出的脉冲个数  
电压:3.5-24VDC,电流不能超过10mA,流完一升水输出450个脉冲
即频率计算= 常数7.5 * 单位流量(L/min) * 时间(秒)

流量范围:1-30L/min



Arduino源程序如下:
  1.   EFFECT HALL FLOWMETER
  2.   TECHNICAL DETAILS

  3.   Electrical:
  4.   Working Voltage: 5 to 18VDC
  5.   Max current draw: 15mA @ 5V
  6.   Working Flow Rate: 1 to 30 Liters/Minute
  7.   Working Temperature range: -25 to 80°C
  8.   Working Humidity Range: 35%-80% RH
  9.   Maximum water pressure: 2.0 MPa
  10.   Output duty cycle: 50% +-10%
  11.   Output rise time: 0.04us
  12.   Output fall time: 0.18us
  13.   Flow rate pulse characteristics:
  14.   Flow rate: 1 pulse/s = 7.5 L/min
  15.   Acumulated volume: 1 Liter = 450 pulses
  16.   maximum pulse frequency: 30 L/min-> 225 imp/s -> min period 4.44 ms  (delta 0.1 L/min->0.015 ms)
  17.                           5 L/min-> 37.5 imp/s->     period 26.66 ms (delta 0.1 L/min->0.523 ms)
  18.   minimun pulse frequency:  1 L/min-> 7.5 imp/s -> max period 133.3 ms (delta 0.1 L/min->12.1 ms)
  19.   Durability: minimum 300,000 cycles
  20.   Mechanical:
  21.   1/2" NPS nominal pipe connections, 0.78" outer diameter, 1/2" of thread
  22.   Size: 2.5" x 1.4" x 1.4"
  23.   v02 Add LCD display
  24.    The circuit:
  25. * LCD RS pin to digital pin 12
  26. * LCD Enable pin to digital pin 11
  27. * LCD D4 pin to digital pin 10
  28. * LCD D5 pin to digital pin 9
  29. * LCD D6 pin to digital pin 8
  30. * LCD D7 pin to digital pin 7
  31. * LCD R/W pin to ground
  32. * 10K resistor:
  33. * ends to +5V and ground
  34. * wiper to LCD VO pin (pin 3)
  35. */

  36. #include "PulseSensor.h"
  37. #include <LiquidCrystal.h>

  38. //#define PulseGen A0                     //Pulse generate 5KHz, A0
  39. #define LED13 13
  40. #define REFRESH_INTERVAL  1000          // refresh time, 1 second
  41. #define WRITE_INTERVAL 2000             // values send to serial port, 2 seconds (2 * 1000)
  42. #define PULSE_PIN 2                    // see external interrupt pins available on your Arduino.
  43. #define HotSwitch 4                    // control the heater switch on/off
  44. #define PULSES_2_LITERS 450             // coefficient conversion from pulses to liters
  45. #define PULSES_SEC_2_LITERS_MINUTE 7.5  // (450/60) coefficient conversion pulses/second from to liters/minute
  46. PulseSensor flowmeter;                  // instance to collect data
  47. //variables to process and send values
  48. //int RA0flag = 0;
  49. //int fireNumber = 0;
  50. float flowRate;
  51. float maxRate;
  52. float minRate;
  53. float acumFlow;
  54. float lastAcumFlow;
  55. boolean firstData;
  56. boolean Fireflag;

  57. //unsigned long previousMillis = 0;
  58. //unsigned long currentMillis = 0;
  59. LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

  60. /*
  61.   ISR(TIMER1_OVF_vect)
  62.   {
  63.   TCNT1 = 0X85ED;   // time 2s, 1s = 0XC2F6;
  64.   RA0flag = 1;    // - RA0flag;
  65.   }
  66. */
  67. void setup()
  68. {
  69.   /*
  70.     cli(); //Turn off global interrupt
  71.     TCCR1A = 0; //Register A is configured with PWM. Here we only use the timing function. In fact, it does not need to be configured
  72.     TCCR1B = (1 << CS12) | (1 << CS10); //Register B is used to configure the timing function. Now it is configured with 1024 frequency division
  73.     TCNT1 = 0X85ED; //The initial value of the counter,time 2s, 1s = 0XC2F6; TCNT1= 0XFFFF - 1 / (1024 *(1/16000000))= 0xFFFF –0x3D09=0XC2F6
  74.     TIMSK1 = (1 << TOIE1); //Overflow interrupt enable
  75.     sei(); //Turn on global interrupt
  76.   */
  77.   pinMode(HotSwitch, OUTPUT);
  78.   pinMode(LED13, OUTPUT);

  79.   lcd.begin(16, 2);
  80.   lcd.print("Flowrate = ");
  81.   lcd.setCursor(0, 1);
  82.   lcd.print("litre/second");

  83.   //Serial.begin(9600);
  84.   //delay(1000);
  85.   flowmeter.begin(PULSE_PIN, REFRESH_INTERVAL, PULSES_SEC_2_LITERS_MINUTE, PULSES_2_LITERS);
  86.   //Serial.println("time(s), average flowrate(l/min), max rate, min rate, volume(liters)");
  87.   //Serial.println("Realtime flowrate(litre/second)");

  88.   firstData = false;
  89.   Fireflag = false;
  90.   flowRate = 0;
  91.   maxRate = 0;
  92.   minRate = 0;
  93.   acumFlow = 0;
  94.   digitalWrite(LED13, LOW);
  95.   //tone(PulseGen, 5000);
  96. }

  97. void loop()
  98. {
  99.   //sei();
  100.   if (flowmeter.available())
  101.   {
  102.     flowRate = flowmeter.read();
  103.     //Serial.println(flowRate);
  104.     //lcd.setCursor(0, 1);       //Setup LCD display
  105.     //lcd.print(flowRate); //Display flowRate value
  106.     /*
  107.       if (!firstData) {
  108.       if (maxRate < flowRate) maxRate = flowRate;
  109.       if (minRate > flowRate) minRate = flowRate;
  110.       }
  111.       else {
  112.       maxRate = flowRate;
  113.       minRate = flowRate;
  114.       firstData = false;
  115.       }
  116.     */
  117.     if (!Fireflag)  //Wait for flow enable
  118.     {
  119.       if (flowRate > 2.00)
  120.       {
  121.         digitalWrite(HotSwitch, HIGH);
  122.         Fireflag = true;
  123.         lcd.setCursor(0, 1);       //Setup LCD display
  124.         lcd.print(flowRate); //Display flowRate value
  125.       }
  126.       //if (flowmeter.available())
  127.       //{
  128.       //flowRate = flowmeter.read();
  129.       //}
  130.     }
  131.   }
  132.   if (Fireflag)     //Wait for flow disable
  133.   {
  134.     /*
  135.       currentMillis = millis();
  136.       if (currentMillis - previousMillis >= WRITE_INTERVAL) {
  137.       if (RA0flag)
  138.       {
  139.       previousMillis = currentMillis;
  140.       RA0flag = 0;
  141.       acumFlow = flowmeter.readAcum();
  142.       //flowRate = (acumFlow - lastAcumFlow) * 60 * 1000 / WRITE_INTERVAL; //average flowrate
  143.       lastAcumFlow = acumFlow;
  144.       firstData = true;
  145.     */
  146.     //Serial.print(currentMillis / 1000);
  147.     //Serial.print(",");
  148.     /*
  149.       Serial.print(flowRate);
  150.       Serial.print(",");
  151.       Serial.print(maxRate);
  152.       Serial.print(",");
  153.       Serial.print(minRate);
  154.       Serial.print(",");
  155.       Serial.println(acumFlow);
  156.     */
  157.     if (flowRate <= 0.00)
  158.     {
  159.       digitalWrite(HotSwitch, LOW);
  160.       Fireflag = false;
  161.     }
  162.     /*
  163.       if (acumFlow > 9000000.00)   //9E+6, Floating-point numbers can be as large as 3.4028235E+38 and as low as -3.4028235E+38.
  164.       {
  165.       flowmeter.resetAcum();
  166.       }
  167.     */
  168.     //}
  169.   }
  170. }
复制代码

所有资料51hei提供下载:
flowmeter_v20201223.zip (4.75 KB, 下载次数: 36)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:334781 发表于 2021-12-22 11:08 | 只看该作者
楼主,这个例程有没有51单片机的,Arduino代码看不懂,谢谢1
回复

使用道具 举报

板凳
ID:591229 发表于 2021-12-23 16:04 | 只看该作者
从72行,才开始程序。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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