Arduino与Proteus仿真实例-超声波检测水位变化及控制仿真

超声波检测水位变化及控制

在这个基于 Arduino 的自动水位指示器和控制器项目仿真中,我们将使用超声波传感器测量水位。 超声波测距的基本原理是基于回声。 当声波在环境中传播时,它们在撞击任何障碍物后会以回声的形式返回原点。 所以我们只需要计算它的两个声音的传播时间,即出射时间和撞击任何障碍物后返回原点的时间。 经过一些计算,我们可以得到一个结果,那就是距离。 这个概念用于我们的水位控制器项目中,当水箱中的水位变低时,发出警报声音,水泵自动打开,直到水位回到预设位置。本次仿真实例将使用到HC-SRF04超声波传感器、继电器,LCD1602。

关于LCD1602的驱动,请参考前面文章:

关于HC-SRF04超声波传感器驱动,请参考前面文章:

关于继电器驱动,请参考:

1、仿真电路原理图

在这里插入图片描述

在仿真电路中:

  • LCD1602由PCF8574 I/O扩展器驱动,接口为I2C
  • 蜂鸣器由NPN三极管驱动,连接12引脚
  • 超声波传感器的TR和ECHO引脚分别与10、11引脚连接
  • 继电器控制端由引脚8控制,高电平有效,并通过PNP管放大驱动。

2、仿真代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <Wire.h>
#include <LiquidCrystal\_I2C.h>

#define trigger 10
#define echo 11
#define motor 8
#define buzzer 12

LiquidCrystal_I2C lcd(0x27,16,2); // PCF8574的通讯地址为0x27

float time=0,distance=0;
int temp=0;

void setup(){
Serial.begin(9600);
pinMode(trigger,OUTPUT);
pinMode(echo,INPUT);
pinMode(motor, OUTPUT);
digitalWrite(motor, LOW);
pinMode(buzzer, OUTPUT);

lcd.init();
lcd.backlight();
lcd.print(" Water Level ");
lcd.setCursor(0,1);
lcd.print(" Indicator ");
}

void loop(){
// 检测水位
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(100);
if(distance<12 && temp==0){
digitalWrite(motor, LOW);
// digitalWrite(buzzer, LOW);
noTone(buzzer);
lcd.clear();
lcd.print("Water Tank Full ");
lcd.setCursor(0,1);
lcd.print("Motor Turned OFF");
delay(2000);
temp=1;
}else if(distance<12 && temp==1){
digitalWrite(motor, LOW);
//digitalWrite(buzzer, LOW);
noTone(buzzer);
lcd.clear();
lcd.print("Water Tank Full ");
lcd.setCursor(0,1);
lcd.print("Motor Turned OFF");
}else if(distance>30){
//digitalWrite(buzzer, HIGH);
tone(buzzer,500);
digitalWrite(motor, HIGH);
lcd.clear();
lcd.print("LOW Water Level");
lcd.setCursor(0,1);
lcd.print("Motor Turned ON");
temp=0;
}
delay(1000);
}

3、仿真结果

在这里插入图片描述

文章来源: https://iotsmart.blog.csdn.net/article/details/127842853