这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » [物联网系列][Aduino]Arduino智能灌溉系统(一)读取水流量传感器

共3条 1/1 1 跳转至

[物联网系列][Aduino]Arduino智能灌溉系统(一)读取水流量传感器

助工
2025-05-17 22:35:46     打赏

简介

记得去年咱们论坛举办了一个DIY液体流量检测仪的活动. 当时报名了但是没有被选上. 正好碰上最近家里的那一盆植物整天吊着半条命(不浇水的缘故). 因此我就想能不能买个液体流量YF-401 来读取水流量的大小. 然后控制继电器从而控制水泵实现智能浇水呢. 于是我便着手开始设计这个智能灌溉(浇花)系统. 由于之前并没有接触过这个传感器, 不是很清楚这个传感器的原理. 因此单独把这个传感器的驱动抽离出来进行单独介绍.


总体系统的 Block diagram 如下所示


    image.png

软件流程图

image.png


解释说明

当前的智能灌溉系统设计,至少需要能够通过各种传感器读取环境数据,从而获取环境输入。这些输入由树莓派或Arduino处理,并驱动不同的外设以产生输出。在系统设计阶段,考虑到功能性和完整性,大多数所选传感器均支持I2C通信协议,并通过QWIIC线缆连接,显著简化了布线复杂度,提升了建模效率。该系统的主要功能分为三个方面:首先是植物动态补光功能,主要依赖于LTR329光照强度传感器和由N-MOSFET驱动的LED面板。系统设置了目标光照阈值,当环境光照低于该阈值时,传感器读取的光强(lux)传入PID算法,计算出PWM占空比以增加光照;占空比调节N-MOS导通程度以控制LED亮度;若环境光超过阈值,PID算法则减少占空比,实现动态光照调节。其次是自动水泵控制功能,系统通过土壤湿度传感器判断湿度是否低于设定值,若低于则启动水泵进行灌溉。为解决过度灌溉问题,系统在水泵与灌溉出口之间增加了水流传感器,Arduino通过中断方式记录水流传感器单位时间内的脉冲数,实现对控制水泵继电器的精确调节,从而精准控制灌溉水量。最后是显示与数据管理功能,系统通过显示屏实时呈现环境数据和水流速率,便于用户观察系统状态。此外,系统还采用运行虚拟树莓派操作系统的边缘计算设备,通过串口与Arduino Uno R4通信。Arduino将运行时数据打包为JSON格式发送至树莓派,树莓派对数据进行解析、分析与汇总,并将关键信息存入数据库。通过后端服务,系统构建了基于网页的可视化平台,使用户能够远程监控与控制整个灌溉系统。


YF-S401介绍

YF-S401 是一种常用的小型水流量传感器,常被用于智能水表、灌溉系统、饮水机、咖啡机等需要检测水流速或水流量的场景.YF-S401 内部集成了一个叶轮(转轮)和一个霍尔效应传感器。当水流通过传感器时,推动叶轮转动,叶轮每旋转一圈会触发霍尔传感器产生一个电脉冲信号。通过计算单位时间内的脉冲数,即可得到水流速度或累积流量。(来源于互联网)

image.png

YF-401数据手册

YF_S401_datasheet.pdf

根据数据手册提供的示例代码得知, 其水流量的计算主要是其黄色线所产生的中断信号进行计算得来的. 

image.png

因此我们便得到了下述的Arduino代码.

volatile int flowCount = 0;
unsigned long lastTime = 0;
float flowRate = 0.0;

void flowISR() {
  flowCount++;
}

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP); // 信号线接 D2
  attachInterrupt(digitalPinToInterrupt(2), flowISR, RISING); // 上升沿触发中断
}

void loop() {
  unsigned long currentTime = millis();
  if (currentTime - lastTime >= 1000) { // 每秒计算一次流速
    detachInterrupt(digitalPinToInterrupt(2));

    // YFS401 的常见比例是:7.5 脉冲/升/秒(不同型号可能不同)
    flowRate = (flowCount / 7.5); // 单位:L/min
    Serial.print("Flow Rate: ");
    Serial.print(flowRate);
    Serial.println(" L/min");

    flowCount = 0;
    lastTime = currentTime;

    attachInterrupt(digitalPinToInterrupt(2), flowISR, RISING);
  }
}

这样的话通过Arduino PIN的中断便可以实际读取到当前的水流量大小. 但是需要注意的一点是, 由于各个传感器的制作工艺不同,所以对于对于计算水流量公式中的

flowRate = (flowCount / 7.5);

最好还是自己根据实际输出的情况进行测量计算一下(比如说使用量筒等进行测量,然后对实际的参数进行校准).

image.png


视频效果:

YF-S401.mp4.zip




关键词: Arduino     水流量传感器     DIY    

专家
2025-05-18 11:44:34     打赏
2楼

学习一下


专家
2025-05-18 11:44:56     打赏
3楼

学习一下


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]