风筝
发表于: 2018-9-5 11:48:08 | 显示全部楼层

大约71%的地表都被水覆盖,但遗憾的是只有2.5%的水是可以饮用。随着人口增加、污染严重以及气候变化,预计到2025年我们将遇到长期的水资源短缺。一方面,各国和各州之间就共享河水已经发生了轻微的争议,另一方面,由于我们的疏忽,人类浪费了大量的饮用水。


刚开始时可能问题不大,但如果你的水龙头每秒滴一滴水,你只需要花费大约五个小时就可以浪费一加仑水,这对普通人来说是足够的水来生存两个天。那么可以做些什么来阻止这种情况呢?一如既往,答案就在于技术的进步。如果我们用自动打开和关闭的智能水龙头替换所有手动水龙头,我们不仅可以节约用水,还可以拥有更健康的生活方式,因为我们不需要用脏手操作水龙头。因此,在这个项目中,我们将使用Arduino开发板和电磁阀制作一个自动饮水机,当杯子放在它附近时,它可以自动放满水。听起来很酷吧!那么让我们建立一个......

Automatic-Water-Dispenser-using-Arduino.jpg


所需的材料

●    电磁阀

●    Arduino Uno开发板

●    HCSR04 - 超声波传感器

●    MOSFET场效应管IRF540

●    1k和10k电阻

●    面包板

●    连接导线


工作原理

自动饮水机背后的概念非常简单。我们将使用HCSR04超声波传感器检查饮水机前是否有物体,如玻璃杯。电磁阀将用于控制水流,当通电时水将流出,当断电时水将停止。因此我们将编写一个Arduino程序,它始终检查是否有物体放置在水龙头附近,如果是,则电磁阀将打开并等待物体被移除,一旦物体被移除,电磁阀将自动关闭,从而关闭供水。


电路原理图

基于Arduino的饮水机的完整电路图如下所示

Circuit-Diagram-for-Automatic-Water-Dispenser-using-Arduino.png


本项目使用的电磁阀是12V阀门,最大额定电流为1.2A,额定电流为700mA。也就是说,当阀门打开时,它会消耗大约700mA的电流来保持阀门开启。我们知道Arduino开发板是一个以5V工作的开发板,因此我们需要一个开关驱动电路,让电磁阀开启和关闭它。


该项目中使用的开关器件是IRF540N N沟道MOSFET。它有3个引脚,分别是栅极、源极和漏极。如电路图所示,电磁阀的正极端子由Arduino的Vin引脚供电。因为我们将使用12V适配器为Arduino供电,因此Vin引脚将输出12V,可用于控制电磁阀。电磁阀的负极端子通过MOSFET的源极和漏极引脚连接到地。因此,只有在MOSFET导通时才会为电磁阀供电。


MOSFET的栅极引脚用于打开或关闭它。如果栅极引脚接地,它将保持关闭状态,如果施加栅极电压,它将导通。为了在没有电压施加到栅极引脚时保持MOSFET关断,栅极引脚通过10k电阻接地。 Arduino引脚12用于打开或关闭MOSFET,因此D12引脚通过1K电阻连接到栅极引脚。该1K电阻用于限流目的。


超声波传感器由Arduino的+ 5V和接地引脚供电。 Echo和Trigger引脚分别连接到引脚8和引脚9。然后我们可以对Arduino进行编程,使用超声波传感器测量距离,并在检测到物体时打开MOSFET。整个电路很简单,因此可以很容易地在面包板上构建。在建立连接后,看起来像下面这样的东西。

Circuit-Hardware-for-Automatic-Water-Dispenser-using-Arduino.jpg


编程Arduino开发板

对于这个项目,我们必须编写一个程序,该程序使用HCSR-04超声波传感器来测量物体前方的距离。当距离小于10cm时,我们必须打开MOSFET,否则我们必须关闭MOSFET。我们还将使用连接到引脚13的板载LED并将其与MOSFET一起切换,以便我们可以确保MOSFET是处于开启还是关闭状态。接下来,我将其分解为小的有意义的片段来解释该程序。


该程序以宏定义开始。我们有超声波传感器的触发和回声引脚,MOSFET栅极引脚和LED作为我们Arduino的I / O。所以我们已经定义了它们将连接到哪个引脚。在我们的硬件中,我们将Echo和Trigger引脚分别连接到第8和第9个数字引脚。然后MOSFET引脚连接到引脚12,默认情况下板载LED连接到引脚13。我们使用以下代码定义引脚

  1. #define trigger 9
  2. #define echo 8
  3. #define LED 13
  4. #define MOSFET 12
复制代码

在setup函数中,我们声明哪些引脚是输入的,哪些是输出的。在我们的硬件中,只有超声波传感器的Echo引脚是输入引脚,其余都是输出引脚。因此我们使用Arduino的pinMode函数来指定如下所示

  1. pinMode(trigger,OUTPUT);
  2. pinMode(echo,INPUT);
  3. pinMode(LED,OUTPUT);
  4. pinMode(MOSFET,OUTPUT);
复制代码

在主loop函数内部,我们调用了名为measure_distance()的函数。此功能使用超声波传感器测量物体前方的距离,并将值更新为变量“distance”。要使用超声波传感器测量距离,必须首先将触发引脚保持低电平两微秒,然后保持高电平持续10微秒并再次保持低电平持续2微秒。这将向空气中发出超声波信号的声波,它将被前方的物体反射,回声引脚将拾取由它反射的信号。然后我们使用时间值来计算传感器前方物体的距离。计算距离的程序如下

  1. digitalWrite(trigger,LOW);
  2. delayMicroseconds(2);
  3. digitalWrite(trigger,HIGH);
  4. delayMicroseconds(10);
  5. digitalWrite(trigger,LOW);
  6. delayMicroseconds(2);
  7. time=pulseIn(echo,HIGH);
  8. distance=time*340/20000;   
复制代码

一旦计算出距离,我们就必须使用简单的if语句比较距离值,如果值小于10cm,我们会使MOSFET和LED变为高电平,在紧接着的else语句中我们将MOSFET和LED设置为低电平。程序如下所示。

  1. if(distance<10)
  2. {
  3.    digitalWrite(LED,HIGH);digitalWrite(MOSFET,HIGH);
  4. }
  5. else
  6. {
  7.    digitalWrite(LED,LOW);digitalWrite(MOSFET,LOW);
  8. }
复制代码

自动饮水机的工作过程

按照电路中所示进行连接,并将下面给出的程序上传到Arduino开发板。做一些简单的安装,将电磁阀连接到进水口,并使用12V适配器将电路连接到Arduino板的DC插孔。确保板载LED指示灯熄灭,这样可确保电磁阀也关闭。


如您所见,我已将超声波传感器直接放置在电磁阀下方,这样当玻璃杯放置在电磁阀下方时,它会直接与超声波传感器相对。超声波传感器将探测到这个物体,并且MOSFET和LED一起打开,从而使电磁阀打开,水流下来。


同样,当移除玻璃杯后,超声波传感器告诉Arduino开发板,它前面没有玻璃杯,因此Arduino关闭了阀门。如果您对此工作过程有任何疑问,请在本帖下面进行回复。

Automatic-Water-Dispenser-using-Arduino-in-action.jpg


注意:不同的电磁阀有不同的工作电压和额定电流,确保电磁阀工作在12V,最大功耗不超过1.5A。


代码

本篇文章使用的完整代码如下所示:

  1. #define trigger 9
  2. #define echo 8
  3. #define LED 13
  4. #define MOSFET 12



  5. float time=0,distance=0;

  6. void setup()
  7. {
  8. Serial.begin(9600);

  9. pinMode(trigger,OUTPUT);
  10. pinMode(echo,INPUT);
  11. pinMode(LED,OUTPUT);
  12. pinMode(MOSFET,OUTPUT);

  13. delay(2000);
  14. }

  15. void loop()
  16. {
  17. measure_distance();

  18. if(distance<10)
  19. {
  20.    digitalWrite(LED,HIGH);digitalWrite(MOSFET,HIGH);
  21. }
  22. else
  23. {
  24.    digitalWrite(LED,LOW);digitalWrite(MOSFET,LOW);
  25. }

  26. delay(500);
  27. }

  28. void measure_distance()
  29. {
  30. digitalWrite(trigger,LOW);
  31. delayMicroseconds(2);
  32. digitalWrite(trigger,HIGH);
  33. delayMicroseconds(10);
  34. digitalWrite(trigger,LOW);
  35. delayMicroseconds(2);
  36. time=pulseIn(echo,HIGH);

  37. distance=time*340/20000;
  38. }
复制代码

跳转到指定楼层
panlai
发表于: 2018-12-30 13:48:29 | 显示全部楼层

謝謝分享,我是一位新手,我希望根據你的資料做一台飲水機,文章提及的硬件,我在那裡可以買到?
回复

使用道具 举报

edayer
发表于: 2019-10-15 10:26:40 | 显示全部楼层

水什么时候截停没做其他检测,只能移开杯子关水设计不合理
回复

使用道具 举报

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

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-18 19:23 , Processed in 0.158142 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

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