原文地址:https://circuitdigest.com/microcontroller-projects/water-level-indicator-project-using-arduino
使用Arduino的自动水位指示器和控制器
经过**萨达姆** 2015年11月4日72
在这个基于Arduino的自动水位指示器和控制器项目中, 我们将使用超声波传感器来测量水位。超声波测距的基本原理基于ECHO。当声波在环境中传输时,撞击任何障碍物后它们会作为ECHO返回原点。因此,我们只需要计算两种声音的传播时间即可,即撞击任何障碍物后的出站时间和返回原点的时间。经过一番计算,我们可以得到一个结果,即距离。这个概念用在我们的水控制器项目中,当水箱中的水位变低时,水泵将自动打开。您也可以检查这个简单的水位指示器电路 以获得该项目的简单版本。
组件
- Arduino Uno
- 超声波传感器模块
- 16x2液晶屏
- 继电器6伏
- ULN2003
- 7806
- 聚四氟乙烯(PVT)
- 铜线
- 9伏电池或12伏适配器
- 连接线
超声波传感器模块
超声波传感器HC-SR04用于测量2cm-400cm范围内的距离,精度为3mm。传感器模块由超声波发射器,接收器和控制电路组成。
超声波传感器模块可处理声音回声的自然现象。发送大约10us的脉冲以触发模块。之后,模块会自动发送8个周期为40 KHz的超声波信号,并检查其回声。障碍物撞击后的信号返回并被接收器捕获。因此,障碍物到传感器的距离可以简单地通过以下公式计算得出:
距离=(时间x速度)/ 2。
在这里,我们将速度和时间的乘积除以2是因为时间是到达障碍物并返回的总时间。因此,到达障碍物的时间仅为总时间的一半。
自动水位控制器的工作
这个项目的工作非常简单,我们使用了超声波传感器模块,该模块在水箱中发送声波并检测回声,即ECHO。首先,我们需要使用Arduino触发超声传感器模块以传输信号,然后等待接收ECHO。Arduino读取触发和收到ECHO之间的时间。我们知道声音的速度约为340 m / s。因此我们可以使用给定的公式计算距离:
距离=(行驶时间/ 2)*声音速度
那里的音速约为每秒340m。
通过使用这种方法,我们可以获得从传感器到水面的距离。之后,我们需要计算水位。
现在我们需要计算水箱的总长度。我们知道水箱的长度,那么我们可以通过从水箱的总长度中减去超声波产生的距离来计算水位。然后我们将获得水位距离。现在我们可以将水位转换为水的百分比,并可以在LCD上显示。下面的方框图显示了完整的水位指示器项目的工作。
电路图和说明
如下所示的水位控制器电路 所示,超声波传感器模块的“触发”和“回声”引脚直接连接到arduino的引脚10和11。在4位模式下,将16x2 LCD与arduino连接。控制引脚RS,RW和En直接连接到arduino引脚7,GND和6。数据引脚D4-D7连接到arduino的5、4、3和2,蜂鸣器连接到引脚12。6伏继电器是还通过ULN2003连接到arduino的引脚8,以打开或关闭水泵。电压调节器7805还用于向继电器和其余电路提供5伏特。
在该电路中,超声波传感器模块放置在水桶(水箱)的顶部以进行演示。该传感器模块将读取传感器模块与水面之间的距离,并在LCD屏幕上显示距离,并显示消息“水箱中的水位为:”。这意味着我们在这里显示的是水的距离或体积的空白位置,而不是水位。由于此功能,我们可以在任何水箱中使用该系统。当空的水位达到约30 cm的距离时,Arduino将通过驱动继电器打开水泵。现在液晶显示屏将显示“ LOW Water Level”(低水位)“ Motor turn on”(马达已打开),并且继电器状态LED将开始发光
现在,如果空白处距离arduino约12厘米,继电器将关闭,并且LCD显示屏将显示“水箱已满”“ Motor Turned OFF”。蜂鸣器也会蜂鸣一段时间,并且继电器状态LED指示灯将熄灭。
程式设计
为了为水位控制器编程Arduino ,首先我们定义将在项目中使用的所有引脚,用于连接外部设备(如继电器,LCD,蜂鸣器等)。
#define trigger 10
#define echo 11
#define motor 8
#define buzzer 12
然后,我们初始化项目中使用的所有设备。
lcd.begin(16,2);
pinMode(trigger,OUTPUT);
pinMode(echo,INPUT);
pinMode(motor, OUTPUT);
pinMode(buzzer, OUTPUT);
lcd.print(" Water Level ");
lcd.setCursor(0,1);
lcd.print(" Indicator ");
delay(2000);
现在初始化超声波传感器模块,并通过使用pulseIn(pin)读取超声波或声音的发送和接收时间。然后执行计算,并使用适当的功能在16x2 LCD上显示结果。
digitalWrite(trigger,HIGH);
delayMicroseconds(10);
digitalWrite(trigger,LOW);
delayMicroseconds(2);
time=pulseIn(echo,HIGH);
distance=time*340/20000;
lcd.clear();
lcd.print("Water Space In ");
lcd.setCursor(0,1);
lcd.print("Tank is: ");
lcd.print(distance);
lcd.print("Cm");
之后,我们检查水箱是否已满或水位是否不足,并采取相应的措施。
if(distance<12 && temp==0)
{
digitalWrite(motor, LOW);
digitalWrite(buzzer, HIGH);
lcd.clear();
lcd.print("Water Tank Full ");
lcd.setCursor(0,1);
lcd.print("Motor Turned OFF");
delay(2000);
digitalWrite(buzzer, LOW);
delay(3000);
temp=1;
}
else if(distance<12 && temp==1)
{
digitalWrite(motor, LOW);
lcd.clear();
lcd.print("Water Tank Full ");
lcd.setCursor(0,1);
lcd.print("Motor Turned OFF");
delay(5000);
}
Code
#include <LiquidCrystal.h>
#define trigger 10
#define echo 11
#define motor 8
#define buzzer 12
LiquidCrystal lcd(7,6,5,4,3,2);
float time=0,distance=0;
int temp=0;
void setup()
{
lcd.begin(16,2);
pinMode(trigger,OUTPUT);
pinMode(echo,INPUT);
pinMode(motor, OUTPUT);
pinMode(buzzer, OUTPUT);
lcd.print(" Water Level ");
lcd.setCursor(0,1);
lcd.print(" Indicator ");
delay(2000);
}
void loop()
{
lcd.clear();
digitalWrite(trigger,LOW);
delayMicroseconds(2);
digitalWrite(trigger,HIGH);
delayMicroseconds(10);
digitalWrite(trigger,LOW);
delayMicroseconds(2);
time=pulseIn(echo,HIGH);
distance=time*340/20000;
lcd.clear();
lcd.print("Water Space In ");
lcd.setCursor(0,1);
lcd.print("Tank is: ");
lcd.print(distance);
lcd.print("Cm");
delay(2000);
if(distance<12 && temp==0)
{
digitalWrite(motor, LOW);
digitalWrite(buzzer, HIGH);
lcd.clear();
lcd.print("Water Tank Full ");
lcd.setCursor(0,1);
lcd.print("Motor Turned OFF");
delay(2000);
digitalWrite(buzzer, LOW);
delay(3000);
temp=1;
}
else if(distance<12 && temp==1)
{
digitalWrite(motor, LOW);
lcd.clear();
lcd.print("Water Tank Full ");
lcd.setCursor(0,1);
lcd.print("Motor Turned OFF");
delay(5000);
}
else if(distance>30)
{
digitalWrite(motor, HIGH);
lcd.clear();
lcd.print("LOW Water Level");
lcd.setCursor(0,1);
lcd.print("Motor Turned ON");
delay(5000);
temp=0;
}
}