超声波传感器测距学习笔记教程

一、知识储备

(一)超声波基础

  1. 超声波概念:频率高于20000赫兹的声波,人耳听不到,具有方向性好、反射能力强等特点,可用于测距、测速等场景 。
  2. 测距原理:超声波传感器发射超声波,遇到障碍物反射,通过测量发射与接收回波的时间差,结合声速(空气中约340米/秒 ),利用公式 距离 = (声速×时间差)/ 2 计算距离(除以2是因为声波往返 )。

(二)Arduino 相关函数

  1. delayMicroseconds(value):让程序暂停运行设定时间,单位微秒(1毫秒 = 1000微秒 ),用于精准控制触发信号时长。
  2. pulseIn(pin, value, timeout):读取指定引脚的脉冲(高电平或低电平 )持续时间,返回微秒值。pin 是引脚号,value 是脉冲类型(HIGHLOW ),timeout 是等待脉冲的超时时间(默认1秒 ),用于获取超声波回波高电平持续时间。

二、代码实现(Arduino 控制超声波传感器测距)

(一)完整代码

// 定义超声波传感器触发引脚(Trig),连接到 Arduino 数字引脚 2
const int trigPin = 2; 
// 定义超声波传感器回声引脚(Echo),连接到 Arduino 数字引脚 3
const int echoPin = 3; 

void setup() {
  // 初始化触发引脚为输出模式,用于发送触发信号
  pinMode(trigPin, OUTPUT); 
  // 初始化回声引脚为输入模式,用于接收反射信号
  pinMode(echoPin, INPUT); 
  // 初始化串口通信,波特率 9600,用于在串口监视器显示测量结果
  Serial.begin(9600); 
  // 串口打印提示信息,确认程序启动
  Serial.println("超声波开始工作啦!"); 
}

void loop() {
  // 1. 触发超声波模块发射超声波
  // 先将触发引脚拉低 2 微秒,确保初始状态稳定
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2); 
  // 向触发引脚发送 10 微秒高电平,触发超声波发射(模块要求的触发条件)
  digitalWrite(trigPin, HIGH); 
  delayMicroseconds(10); 
  // 触发完成,拉低触发引脚结束信号
  digitalWrite(trigPin, LOW); 

  // 2. 接收反射信号并计算距离
  // 测量回声引脚高电平持续时间(即超声波往返时间),单位微秒
  long duration = pulseIn(echoPin, HIGH); 
  // 根据公式计算距离,340 米/秒 = 0.034 厘米/微秒,往返距离除以 2,简化为除以 58.0(0.034/2 的倒数约 58 )
  double distance = duration / 58.0; 

  // 3. 串口输出测量结果
  Serial.print("前方障碍物的距离:"); // 打印提示文字
  Serial.print(distance); // 打印距离数值
  Serial.println("cm"); // 打印距离单位

  // 延迟 20 毫秒后再次测量,避免频繁测量导致结果不稳定
  delay(20); 
}

(二)代码逐行注释解析

  1. 引脚定义
// 定义超声波传感器触发引脚(Trig),连接到 Arduino 数字引脚 2
const int trigPin = 2; 
// 定义超声波传感器回声引脚(Echo),连接到 Arduino 数字引脚 3
const int echoPin = 3; 
  • 明确超声波传感器两个关键引脚 trigPin(触发 )和 echoPin(回声 )在 Arduino 上的连接引脚,const 修饰表明引脚号程序运行中不变。
  1. setup() 函数
void setup() {
  // 初始化触发引脚为输出模式,让其能输出电信号触发超声波发射
  pinMode(trigPin, OUTPUT); 
  // 初始化回声引脚为输入模式,用于接收反射波的信号
  pinMode(echoPin, INPUT); 
  // 初始化串口通信,设置波特率 9600,后续通过串口打印测距结果
  Serial.begin(9600); 
  // 串口打印提示,方便在串口监视器确认程序启动状态
  Serial.println("超声波开始工作啦!"); 
}
  • 完成引脚模式初始化(输出/输入 )和串口初始化,还给出程序启动提示。
  1. loop() 函数
    • 触发超声波发射
// 先拉低触发引脚 2 微秒,让初始电平稳定,避免干扰
digitalWrite(trigPin, LOW); 
delayMicroseconds(2); 
// 输出 10 微秒高电平,触发超声波模块发射超声波(符合模块触发时序要求)
digitalWrite(trigPin, HIGH); 
delayMicroseconds(10); 
// 触发完成,拉低引脚,结束触发信号
digitalWrite(trigPin, LOW); 
- 通过控制 `trigPin` 电平变化,严格按照超声波模块触发时序,先稳初始电平,再发触发高电平,最后结束触发。
- **计算距离**:
// 测量回声引脚高电平持续时间,也就是超声波从发射到返回的总时间(微秒)
long duration = pulseIn(echoPin, HIGH); 
// 利用公式简化计算距离,(340m/s 换算为 0.034cm/μs,往返距离除以 2,即 0.034/2 = 0.017 ,1/0.017≈58 ,所以除以 58.0 得到厘米距离 )
double distance = duration / 58.0; 
- 用 `pulseIn` 获取超声波往返时间,再通过简化公式快速算出距离(单位厘米 )。
- **串口输出与延时**:
Serial.print("前方障碍物的距离:"); // 打印提示文本
Serial.print(distance); // 打印测距数值
Serial.println("cm"); // 打印距离单位
// 延迟 20 毫秒,让测量间隔合理,避免结果波动大
delay(20); 
- 串口打印清晰展示测距结果,`delay(20)` 控制测量频率,保障结果稳定。 

三、实际操作与扩展

(一)硬件连接

将超声波传感器的 VCC 接 Arduino 5V ,GND 接 Arduino GND ,Trig 接代码中定义的触发引脚(如数字引脚 2 ),Echo 接回声引脚(如数字引脚 3 )。

(二)功能扩展

  1. 数据滤波:多次测量取平均值,减少测距波动,比如连续测 5 次,去掉最大最小值后求平均。
  2. 阈值报警:设定距离阈值,当小于阈值(如距离障碍物过近 ),让 Arduino 控制蜂鸣器报警或指示灯闪烁。
  3. 结合显示屏:连接 OLED 显示屏,实时在屏幕显示测距数值,让结果展示更直观。

通过学习上述内容,就能掌握 Arduino 配合超声波传感器实现测距的核心逻辑与实操方法,后续可基于此拓展更多有趣的智能项目,比如自动避障小车、智能垃圾桶测距开盖等 。

0 条评论

目前还没有评论...