Arduino项目式编程教学第四章——超声波测距

文章目录
一、超声波测距原理
二、HCSR04超声波传感器的使用
三、LCD1602液晶显示屏的使用
四、完成超声波测距

硬件清单

超声波测距硬件清单

一、超声波测距原理

超声波测距原理
我们所使用的超声波传感器型号为HCSR04,可观察到他有两个“眼睛”状的部件,两个部件的作用一样,均可发射接收超声波,并且按照上述原理图进行工作。
首先传感器发射超声波,并计时,当超声波接触到障碍物会被反射,当传感器接收到反射波,计时结束,然后利用距离、速度、时间公示进行计算,得到传感器到障碍物间的距离。
其具体工作原理简单了解即可,并不影响后述对超声波传感器的使用。
超声波传感器模块
因此HCSR04超声波传感器的四个引脚的作用就比较明显了,除了VCC接正极、GND接负极外,还有两个引脚“Trig”及“Echo”,其中“Trig”用于控制发射超声波,“Echo”用于接收反射波,所以“Trig”所接引脚应为输出,“Echo”所接引脚应为输入,因此在后续接线时可以把两个引脚分别接到两个数字端口,在端口初始化时分别设置输入和输出即可。

二、HCSR04超声波传感器的使用

接下来将HCSR04超声波传感器与Arduino进行连接,除了VCC及GND分别接正负极外,这里“Trig”与数字端口D5连接,“Echo”与数字端口D4连接,如下图所示:
Arduino与超声波传感器的连接

并且确定安装的库文件是否一致,不同的开发者贡献的库文件不同,调用方法的名称也就不同,因此如果与本文按装的库文件不同的话,大概率会报错,建议安装与下图一致的库文件。
在这里插入图片描述

将超声波传感器与Arduino板连接之后,继续完成以下程序:

//此程序功能为将SR04超声波传感器测的的距离数值,通过串口进行输出

#include<HCSR04.h>  //导入超声波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液晶显示屏的使用

LCD1602液晶显示屏
在这里插入图片描述
首先观察LCD1602显示屏的正反面(其中反面为实物图),当前LCD显示屏的驱动板(即黑色的电路板)上共6个引脚,左侧两个相邻的引脚直接连接即可,连接后便打开了背光;右侧的引脚“GND接负极”“VCC接正极”已经比较熟悉了,对于“SDA”及“SCL”引脚,我们先对此进行详细介绍。

1.Arduino上的I2C通信协议

IIC通信协议原理
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
每种不同的硬件都有不同的I2C地址,因此对于I2C通信的工作原理我们可以理解为:SCL(时钟线)用于规定当前时刻是否要传输数据,就如同红绿信号灯的作用,防止数据传输混乱;SDA(数据线)用于在给定时间内给不同地址的硬件传输数据,并且双向传输。当前我们仅需了解不同硬件的I2C地址即可轻松使用I2C通信。

2.使用LCD1602液晶显示屏显示“Hello World!”字符

在这里插入图片描述
在Arduino拓展板的复位键旁边设有专门的I2C引脚,可直接对应连接,当然也可以“SDA - A4”“SCL - A5”的线序连接。
连接好之后观察屏幕,在未写入程序之前,LCD显示屏的第一行应该是可以显示16个小方块的,如果未显示,则使用十字螺丝刀来拧动显示屏背板蓝色的旋钮,直到小方块清晰可见。这也就是为什么LCD1602显示屏标有“1602”——此显示屏可显示16列2行字符(英文)。
本章使用的LCD显示屏为I2C通信,因此使用的库文件也需要对应,可看下图使用的库文件:
在这里插入图片描述

接下来完成下列程序:

//此程序功能为使用LCD1602输出“Hello World!”字符

#include <Wire.h>  //导入I2C通信库
#include <LiquidCrystal_I2C.h>  //导入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 <Wire.h>”为导入I2C通信库。
2.“#include <LiquidCrystal_I2C.h>”为导入本程序使用的基于I2C通信协议的LCD显示屏库。
3.“LiquidCrystal_I2C lcd(0x27,16,2)”为实例化了一个名为“lcd”的对象,并规定了LCD的I2C地址“0x27”,以及显示屏显示的列行数。
其他的代码作用均已在程序中进行了注释解释,则不再赘述。

四、完成超声波测距

使用arduino实现的超声波测距
按照上图将“SR04超声波传感器”及“LCD1602显示屏”与Arduino板进行连接;“Trig”与数字端口D5连接,“Echo”与数字端口D4连接,LCD显示屏的引脚连接到IIC区域;然后完成以下程序:

//此程序功能为将超声波传感器测得的数值使用LCD进行显示
//并且在2cm-450cm内正常显示,超出范围则输出错误提示

#include<HCSR04.h>  //导入超声波SR04库
#include<Wire.h>  //导入I2C通信库
#include<LiquidCrystal_I2C.h>  //导入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平台来实现的,后续还会带来更多硬件的使用方法及组合成完整功能的教学。

  • 27
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洪博hopes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值