超声波测距
大约 3 分钟ESP32Arduino
本节课来学习使用 Arduino 控制超声波传感器。
实验原理
超声波是一种频率高于 20000Hz 的声波,功率密度为 p≥0.3W/cm,它的的方向性好,反射能力强,易于获得较集中的声能。超声波用于许多不同的领域,比如检测物体和测量距离,清洗设备,消毒杀菌等等。
超声波传感器使用声纳来确定与物体的距离。我们使用的超声波模块由 2 个超声波探头组成:
T
:表示Transmitter(发射)
,负责发送超声波信号;R
:表示Receiver(接收)
,负责接收回响信号;
注意
如果在使用过程中,对其中任意一个探头进行遮挡,都会使超声波无法正常测量距离。
底部有四个引脚:
VCC
:5V 供电引脚;GND
:接地;TRIG
:控制信号输入;ECHO
:回响信号输出;
以上时序图表示超声波模块的基本工作原理:
- 采用 IO 口 TRIG 触发测距,给一个 10us 的高电平信号;
- 模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
- 有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2
回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式如下:
距离 = 高电平时间 * 声速(340m/s)/2
硬件电路设计
物料清单(BOM 表):
材料名称 | 数量 |
---|---|
0.96 寸 OLED 屏幕 | 1 |
杜邦线(跳线) | 若干 |
面包板 | 1 |
超声波模块 | 1 |
软件程序设计
该程序的功能是通过超声波模块测算距离并显示在 OLED 屏幕上,代码如下:
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// 定义超声波模块引脚
#define TRIG 13
#define ECHO 14
// OLED 显示屏尺寸
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// 软件SPI总线
#define OLED_MOSI 19
#define OLED_CLK 18
#define OLED_DC 2
#define OLED_CS 4
#define OLED_RESET 15
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
void setup()
{
// 初始化超声波模块引脚
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
// 初始化 OLED
oled.begin();
// 设置字体大小
oled.setTextSize(2);
// 设置文本颜色
oled.setTextColor(SSD1306_WHITE);
// 显示内容
oled.display();
}
void loop()
{
// 清除trigPin
digitalWrite(TRIG, LOW);
delay(2);
// 将trigPin设置为HIGH状态10微秒
digitalWrite(TRIG, HIGH);
delay(10);
digitalWrite(TRIG, LOW);
// 读取echoPin,返回声波传播时间(微秒)
float time = pulseIn(ECHO, HIGH);
// 计算距离
float distance = time * 0.034 / 2;
// 清空屏幕
oled.clearDisplay();
// 设置光标位置
oled.setCursor(0, 15);
// 显示文字
oled.print("Distance: ");
oled.print(distance);
oled.print("cm");
// 刷新屏幕
oled.display();
delay(100); // 延迟一段时间后更新显示
}