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
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!