简介
记得去年咱们论坛举办了一个DIY液体流量检测仪的活动. 当时报名了但是没有被选上. 正好碰上最近家里的那一盆植物整天吊着半条命(不浇水的缘故). 因此我就想能不能买个液体流量YF-401 来读取水流量的大小. 然后控制继电器从而控制水泵实现智能浇水呢. 于是我便着手开始设计这个智能灌溉(浇花)系统. 由于之前并没有接触过这个传感器, 不是很清楚这个传感器的原理. 因此单独把这个传感器的驱动抽离出来进行单独介绍.
总体系统的 Block diagram 如下所示
软件流程图
解释说明
当前的智能灌溉系统设计,至少需要能够通过各种传感器读取环境数据,从而获取环境输入。这些输入由树莓派或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 内部集成了一个叶轮(转轮)和一个霍尔效应传感器。当水流通过传感器时,推动叶轮转动,叶轮每旋转一圈会触发霍尔传感器产生一个电脉冲信号。通过计算单位时间内的脉冲数,即可得到水流速度或累积流量。(来源于互联网)
YF-401数据手册
根据数据手册提供的示例代码得知, 其水流量的计算主要是其黄色线所产生的中断信号进行计算得来的.
因此我们便得到了下述的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);
最好还是自己根据实际输出的情况进行测量计算一下(比如说使用量筒等进行测量,然后对实际的参数进行校准).
视频效果: