文章目录
一、超声波测距原理
二、HCSR04超声波传感器的使用
三、LCD1602液晶显示屏的使用
四、完成超声波测距
我们所使用的超声波传感器型号为HCSR04,可观察到他有两个“眼睛”状的部件,两个部件的作用一样,均可发射和接收超声波,并且按照上述原理图进行工作。
首先传感器发射超声波,并计时,当超声波接触到障碍物会被反射,当传感器接收到反射波,计时结束,然后利用距离、速度、时间公示进行计算,得到传感器到障碍物间的距离。
其具体工作原理简单了解即可,并不影响后述对超声波传感器的使用。
因此HCSR04超声波传感器的四个引脚的作用就比较明显了,除了VCC接正极、GND接负极外,还有两个引脚“Trig”及“Echo”,其中“Trig”用于控制发射超声波,“Echo”用于接收反射波,所以“Trig”所接引脚应为输出,“Echo”所接引脚应为输入,因此在后续接线时可以把两个引脚分别接到两个数字端口,在端口初始化时分别设置输入和输出即可。
接下来将HCSR04超声波传感器与Arduino进行连接,除了VCC及GND分别接正负极外,这里“Trig”与数字端口D5连接,“Echo”与数字端口D4连接,如下图所示:
并且确定安装的库文件是否一致,不同的开发者贡献的库文件不同,调用方法的名称也就不同,因此如果与本文按装的库文件不同的话,大概率会报错,建议安装与下图一致的库文件。
将超声波传感器与Arduino板连接之后,继续完成以下程序:
//此程序功能为将SR04超声波传感器测的的距离数值,通过串口进行输出
#include //导入超声波SR04库
HCSR04 ultrasonic(5,4); //声明一个对象,其名为ultrasonic(自定义的名称)
//4号为“Echo”,5号为“Trig”
void setup()
{
pinMode(4, INPUT); //设置“Echo”接入的引脚为输入
pinMode(5, OUTPUT); //设置“Trig”接入的引脚为输出
Serial.begin(9600); //串口监视器初始化
}
int distance; //定义一个名为“distance”的变量,用于存放检测的距离数值
void loop()
{
distance = ultrasonic.dist(); //调用了超声波库里的“dist()”方法,获得检测距离数值
Serial.print(distance); //输出distance数值,且不换行
Serial.println(" cm"); //紧接着输出单位,且换行
}
将程序上传之前先对以上程序的部分代码块进行解释:
1.“HCSR04 ultrasonic(4, 5)”我们称之为对象的实例化,即HCSR04为超声波库的名称,在其后自定义一个名称“ultrasonic”(即超声波的英文,可自定义任意名称),并且不同的实例化过程有不同的参数要输入,比如HCSR04后需要加入“Trig”和“Echo”所接引脚的端口号,从而在后述程序中,如果要调用HCSR04库内的方法的话,仅需使用“ultrasonic.方法名()”,即可。
2.“distance = ultrasonic.dist()”这一代码块是调用了超声波传感器中获取距离的方法“dist()”,与前面int定义的distance截然不同,int定义的变量可取任意名称,仅为变量名,但“Distance()”为超声波传感器固定的方法。
接下来将上述程序上传至Arduino板,并且打开串口监视器,观测所测的数值是否准确。
另外HCSR04型号的超声波传感器的测量范围官方声称为2cm ~ 450cm,因此超出这个范围的数值会不准确。
首先观察LCD1602显示屏的正反面(其中反面为实物图),当前LCD显示屏的驱动板(即黑色的电路板)上共6个引脚,左侧两个相邻的引脚直接连接即可,连接后便打开了背光;右侧的引脚“GND接负极”“VCC接正极”已经比较熟悉了,对于“SDA”及“SCL”引脚,我们先对此进行详细介绍。
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
每种不同的硬件都有不同的I2C地址,因此对于I2C通信的工作原理我们可以理解为:SCL(时钟线)用于规定当前时刻是否要传输数据,就如同红绿信号灯的作用,防止数据传输混乱;SDA(数据线)用于在给定时间内给不同地址的硬件传输数据,并且双向传输。当前我们仅需了解不同硬件的I2C地址即可轻松使用I2C通信。
在Arduino拓展板的复位键旁边设有专门的I2C引脚,可直接对应连接,当然也可以“SDA - A4”“SCL - A5”的线序连接。
连接好之后观察屏幕,在未写入程序之前,LCD显示屏的第一行应该是可以显示16个小方块的,如果未显示,则使用十字螺丝刀来拧动显示屏背板蓝色的旋钮,直到小方块清晰可见。这也就是为什么LCD1602显示屏标有“1602”——此显示屏可显示16列2行字符(英文)。
本章使用的LCD显示屏为I2C通信,因此使用的库文件也需要对应,可看下图使用的库文件:
接下来完成下列程序:
//此程序功能为使用LCD1602输出“Hello World!”字符
#include //导入I2C通信库
#include //导入LCD显示屏库
LiquidCrystal_I2C lcd(0x27,16,2); //实例化一个名为“lcd”的对象,并且内部有三个参数
//分别为(I2C通信地址,显示列数,显示行数)
void setup()
{
lcd.init(); //显示屏初始化
lcd.backlight(); //开启显示屏背光
lcd.setCursor(0,0); //设置显示光标位置(列,行)
lcd.print("Hello, world!"); //显示字符
lcd.setCursor(0,1); //在第一列,第二行开始显示
lcd.print("Successful!"); //显示字符
}
void loop()
{
}
将以上程序上传,并观察是否显示了两行字符,分别是“Hello, world!”及“Successful!”;接下来对部分代码块进行解释:
1.“#include
2.“#include
3.“LiquidCrystal_I2C lcd(0x27,16,2)”为实例化了一个名为“lcd”的对象,并规定了LCD的I2C地址“0x27”,以及显示屏显示的列行数。
其他的代码作用均已在程序中进行了注释解释,则不再赘述。
按照上图将“SR04超声波传感器”及“LCD1602显示屏”与Arduino板进行连接;“Trig”与数字端口D5连接,“Echo”与数字端口D4连接,LCD显示屏的引脚连接到IIC区域;然后完成以下程序:
//此程序功能为将超声波传感器测得的数值使用LCD进行显示
//并且在2cm-450cm内正常显示,超出范围则输出错误提示
#include //导入超声波SR04库
#include //导入I2C通信库
#include //导入LCD显示屏库
LiquidCrystal_I2C lcd(0x27,16,2); //声明使用LCD库的对象
HCSR04 ultrasonic(5,4); //声明一个对象,其名为ultrasonic(自定义的名称)
//4号为“Echo”,5号为“Trig”
void setup()
{
lcd.init(); //显示屏初始化
lcd.backlight(); //开启LCD显示屏背光
pinMode(4,INPUT); //Echo引脚
pinMode(5,OUTPUT); //Trig引脚
}
int distance; //定义一个变量用于存储超声波测量的数值
void loop()
{
distance = ultrasonic.dist(); //将超声波测得的数值赋值给变量
if(distance >= 2 && distance <= 450) //判断测得数值是否在测量范围内
{
lcd.setCursor(0,0); //设置LCD显示光标位置
lcd.print(distance); //使用LCD显示屏显示distance的数值
lcd.print(" cm"); //显示单位“cm”
delay(200); //延时200毫秒
lcd.clear(); //LCD显示屏清屏,用于显示下一个数值
}
else //如果超出范围
{
lcd.print("Wrong!"); //输出“Wrong!”
delay(200);
lcd.clear();
}
}
上述程序是对超声波传感器及LCD显示屏的综合应用,并且使用了“if判断”,其代码块的作用均已标柱到代码区域,不再详细解释。
将上述代码进行上传,并测试是否可实现超声波测距功能。
本章使用SR04超声波传感器结合LCD液晶显示屏来实现了超声波测距的功能;并且对于超声波传感器及显示屏都需要调用相应的库文件进行控制,这里需要注意的是一定要使用正确的库文件,因为各类硬件的库文件均来自于不同的开发者,不同的开发者贡献的库会存在库文件名称及方法名不同的情况,当然理论上不同的库文件都能实现对硬件的控制,所以最好使用与本文相同的库文件。完成本章的超声波测距功能之后,不妨联想汽车的倒车雷达原理,其功能也是可以通过Arduino平台来实现的,后续还会带来更多硬件的使用方法及组合成完整功能的教学。