欢迎光临
我们一直在努力

Arduino进阶一|HC-SR04超声波测距超详细教程(原理+时序+自定义函数+车位指示灯项目)

大家好!今天给大家分享Arduino实训项目——HC-SR04超声波测距。

超声波传感器是机器人避障、车位检测、距离检测、智能感应设备的核心外设,也是Arduino进阶必学模块。

本文从声音物理原理、超声波特性、传感器参数、工作时序零基础讲解,手把手完成串口实时测距、测距函数封装两大课堂实验,最后完成综合实训项目——超声波RGB车位指示灯课后作业,全程零基础友好,代码可直接烧录运行!

一、声音基础物理知识(实训前置知识点)

1. 声音三要素与音调原理

声音有响度、音调、音色三大特性,其中音调由声源振动快慢决定:

  • 振动越快 → 频率越高 → 声音音调越高
  • 振动越慢 → 频率越低 → 声音音调越低

频率单位为赫兹(Hz),根据频率范围,声波分为三类:

  • 次声波:频率 < 20Hz,人耳无法识别,多由火山、地震、台风、海啸产生,易引发共振造成破坏
  • 可闻声波:20Hz ~ 20KHz,人耳可正常听到的声音
  • 超声波:频率 > 20KHz,人耳无法识别,是本次实验核心

2. 超声波核心优势与应用

超声波具备方向性好、穿透能力强、能量集中三大特点,生活中应用广泛:

  • 军事领域:潜艇声呐测距探测
  • 医疗领域:B超影像检测
  • 生活领域:超声波清洗机
  • 创客领域:超声波测距传感器(智能小车避障、车位检测)

二、HC-SR04超声波传感器参数详解

本次实训使用经典HC-SR04超声波模块,官方标准参数如下:

  • 工作电压:5V
  • 工作电流:15mA
  • 测距范围:2cm ~ 450cm(2cm以内为检测盲区,无法精准测距)
  • 探测角度:<15°
  • 检测要求:被测物体面积不小于50cm²,表面尽量平整,避免测距误差过大

三、超声波测距核心公式与时序原理

1. 测距计算公式

常温下空气中声速:v = 344m/s

超声波采用发射-反射测距,声波往返传播,因此距离需要除以2:

距离 D = 声波速度 × 传播时间 ÷ 2

实训标准换算:1cm距离的声波往返时间约为 58μs,因此简化公式:距离(cm) = 高电平持续时间(μs) / 58

2. 标准工作时序(核心重点)

  • Arduino向Trig触发引脚发送10μs高电平触发信号;
  • 模块内部自动发出8组40KHz超声波脉冲;
  • 声波遇到障碍物反射,被模块接收;
  • Echo回应引脚输出高电平,高电平持续时间等于声波往返时间;
  • 读取高电平时长,通过公式换算出实际距离。
  • 3. 核心函数说明

    • delayMicroseconds(us):微秒级延时,用于产生10μs触发脉冲,最大值不超过16383
    • pulseIn(pin, level):读取引脚指定电平的持续时间,返回微秒数值,用于获取Echo回应时间

    四、硬件接线定义

    • HC-SR04 VCC → Arduino 5V
    • HC-SR04 GND → Arduino GND
    • HC-SR04 Trig → Arduino D2(触发引脚)
    • HC-SR04 Echo → Arduino D3(回应引脚)

    五、课堂实验一:串口实时测距显示

    1. 实验需求

    驱动HC-SR04超声波模块,实时检测障碍物距离,并将数值打印在串口监视器中。

    2. 完整实验源码

    cpp
    // 课堂实验一:超声波串口实时测距
    const int trigPin = 2;
    const int echoPin = 3;

    void setup() {
      pinMode(trigPin, OUTPUT);
      pinMode(echoPin, INPUT);
      Serial.begin(9600);
    }

    void loop() {
      // 1. 发送10us触发脉冲
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);

      // 2. 读取回声高电平时间
      float time = pulseIn(echoPin, HIGH);
      // 3. 换算距离 cm
      float distance = time / 58.0;

      // 4. 串口打印数据
      Serial.print("实时距离:");
      Serial.print(distance);
      Serial.println(" cm");

      delay(200);
    }
     

    3. 实验现象

    上电后,串口监视器实时刷新距离数值,障碍物靠近数值变小、远离数值变大,2cm~450cm范围内测距精准,盲区无数据跳动。

    六、课堂实验二:超声波测距自定义函数封装

    为了代码复用、结构规范,本次实训要求将测距功能封装为带返回值的自定义函数,是Arduino函数编程的经典案例。

    1. 函数知识点回顾

    • 有返回值函数:需要返回数据结果,用于数据计算、检测采集(本次测距使用)
    • void无返回值函数:仅执行动作,无数据返回,多用于执行控制

    2. 封装后完整源码

    cpp
    // 课堂实验二:测距功能自定义函数封装
    const int trigPin = 2;
    const int echoPin = 3;

    void setup() {
      pinMode(trigPin, OUTPUT);
      pinMode(echoPin, INPUT);
      Serial.begin(9600);
    }

    // 自定义测距函数:有返回值,返回实时距离
    float getDistance()
    {
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);

      float time = pulseIn(echoPin, HIGH);
      float dis = time / 58.0;
      return dis;
    }

    void loop() {
      float dist = getDistance();
      Serial.print("函数测距结果:");
      Serial.print(dist);
      Serial.println(" cm");

      delay(200);
    }
     

    3. 代码优势

    功能与实验一完全一致,但是代码结构更清晰,测距逻辑统一封装,后续项目可直接调用,减少代码冗余,是正规项目的标准写法。

    七、课后练习:超声波智能车位指示灯

    1. 作业需求

    结合超声波模块+RGB指示灯实现车位状态检测:

    • 车位无车(距离 > 30cm):点亮绿灯,表示车位空闲
    • 车位有车(距离 ≤ 30cm):点亮红灯,表示车位占用

    2. 硬件拓展接线

    • 绿灯引脚:D4
    • 红灯引脚:D5

    3. 课后作业完整源码

    cpp
    // 课后作业:超声波车位指示灯
    const int trigPin = 2;
    const int echoPin = 3;
    const int greenPin = 4;
    const int redPin = 5;

    // 封装测距函数
    float getDistance()
    {
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);

      float time = pulseIn(echoPin, HIGH);
      float dis = time / 58.0;
      return dis;
    }

    void setup() {
      pinMode(trigPin, OUTPUT);
      pinMode(echoPin, INPUT);
      pinMode(greenPin, OUTPUT);
      pinMode(redPin, OUTPUT);
      Serial.begin(9600);
    }

    void loop() {
      float dist = getDistance();

      // 车位状态判断
      if(dist > 30)
      {
        // 无车:绿灯亮、红灯灭
        digitalWrite(greenPin, HIGH);
        digitalWrite(redPin, LOW);
        Serial.println("车位空闲");
      }
      else
      {
        // 有车:红灯亮、绿灯灭
        digitalWrite(greenPin, LOW);
        digitalWrite(redPin, HIGH);
        Serial.println("车位已占用");
      }

      delay(200);
    }
     

    八、常见问题与误差排查

    • 测距数值跳动大:被测物体不平整、面积过小,或环境有干扰,可多次测距取平均值优化;
    • 近距离数值不准:2cm以内为模块盲区,属于正常现象;
    • 无测距数据:检查Trig、Echo引脚接线是否颠倒;
    • 车位灯状态异常:核对30cm阈值判断逻辑,排查LED正负极接线。

    九、实训知识点总结

    本次超声波测距实训,完美覆盖物理知识、硬件原理、编程语法三大板块,核心收获:

  • 掌握次声波、可闻声波、超声波的频段区别与应用场景;
  • 吃透HC-SR04模块参数、测距时序、核心计算公式;
  • 熟练使用 delayMicroseconds()pulseIn() 核心函数;
  • 掌握自定义有返回值函数的封装与调用,规范代码编写习惯;
  • 实现串口测距、智能车位灯两个实战项目,掌握传感器+执行器联动逻辑。
  • 超声波测距是智能小车避障、智能门禁、液位检测、停车系统的核心基础,学好本实验,可以拓展超多智能硬件项目!

    💡 所有代码实测可用、注释详细,可直接用于课程实训报告、结课作业与新手进阶练手!欢迎评论区交流问题~

    赞(0)
    未经允许不得转载:171主机测评 » Arduino进阶一|HC-SR04超声波测距超详细教程(原理+时序+自定义函数+车位指示灯项目)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址