Arduino超声波传感器(HC-SR04)入门教程

超声波传感器是一种常用的距离检测设备,通过发射超声波并接收回波来计算目标物体的距离。本教程将带你学习如何使用Arduino控制HC-SR04超声波传感器,实现简单的距离测量。

1. 所需材料

  • Arduino开发板(如UNO)
  • HC-SR04超声波传感器模块
  • 面包板与跳线
  • LED(可选,用于距离指示)

2. HC-SR04传感器介绍

HC-SR04是一款低成本、高精度的超声波测距模块,测量范围为2cm-400cm,精度可达3mm。

引脚说明

  • VCC:接5V电源
  • GND:接地
  • Trig:触发引脚(接收Arduino的信号)
  • Echo:回响引脚(向Arduino返回信号)

3. 电路连接

Arduino       HC-SR04
+5V   ───────── VCC
GND  ───────── GND
D2   ───────── Trig
D3   ───────── Echo

注意

  • 确保所有连接牢固,避免松动
  • 电源需稳定,波动可能导致测量误差

4. 基础代码实现

下面是一个简单的程序,用于读取超声波传感器的距离并通过串口输出:

// 超声波传感器基础代码
const int trigPin = 2;  // 触发引脚
const int echoPin = 3;  // 回响引脚

void setup() {
  Serial.begin(9600);    // 初始化串口通信
  pinMode(trigPin, OUTPUT); // 设置触发引脚为输出模式
  pinMode(echoPin, INPUT);  // 设置回响引脚为输入模式
}

void loop() {
  long duration, distance;
  
  // 发送触发信号(10微秒高电平)
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  // 读取回响信号持续时间(微秒)
  duration = pulseIn(echoPin, HIGH);
  
  // 计算距离(厘米)
  // 声速 = 340m/s = 0.034cm/μs
  // 距离 = 时间 * 声速 / 2(往返)
  distance = duration * 0.034 / 2;
  
  // 输出结果到串口监视器
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");
  
  delay(500);  // 延时500毫秒,避免数据更新过快
}

5. 代码解释

  1. 引脚定义

    • trigPin:连接传感器的触发引脚(发送信号)
    • echoPin:连接传感器的回响引脚(接收信号)
  2. setup() 函数

    • 初始化串口通信,用于输出测量结果
    • 设置引脚模式
  3. loop() 函数

    • 触发测量:通过发送10微秒的高电平脉冲触发传感器
    • 读取时间:使用pulseIn()函数测量回响信号的持续时间
    • 计算距离:将时间转换为距离(厘米)
    • 输出结果:通过串口监视器显示测量结果

6. 距离指示LED示例

下面的代码增加了LED指示功能,根据距离远近点亮不同颜色的LED:

const int trigPin = 2;
const int echoPin = 3;
const int redLED = 9;    // 近距离红灯
const int yellowLED = 10; // 中距离黄灯
const int greenLED = 11;  // 远距离绿灯

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

void loop() {
  long duration, distance;
  
  // 触发测量
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  // 读取回响时间
  duration = pulseIn(echoPin, HIGH);
  
  // 计算距离
  distance = duration * 0.034 / 2;
  
  // 根据距离控制LED
  if (distance < 10) {       // 近距离(<10cm)
    digitalWrite(redLED, HIGH);
    digitalWrite(yellowLED, LOW);
    digitalWrite(greenLED, LOW);
  } else if (distance < 30) { // 中距离(10-30cm)
    digitalWrite(redLED, LOW);
    digitalWrite(yellowLED, HIGH);
    digitalWrite(greenLED, LOW);
  } else {                   // 远距离(>30cm)
    digitalWrite(redLED, LOW);
    digitalWrite(yellowLED, LOW);
    digitalWrite(greenLED, HIGH);
  }
  
  // 输出结果
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");
  
  delay(200);
}

7. 常见问题及解决方法

  1. 测量结果不稳定

    • 检查电源是否稳定(建议使用外部电源)
    • 避免传感器附近有强电磁干扰
    • 添加软件滤波(如多次测量取平均值)
  2. 测量距离不准确

    • 确认计算公式正确(声速在不同环境下会有差异)
    • 避免测量过近或过远的物体(超出传感器范围)
    • 确保被测物体表面平整且垂直于传感器
  3. 传感器无响应

    • 检查引脚连接是否正确
    • 确认传感器供电正常(5V)
    • 尝试更换Arduino引脚或重启开发板

8. 扩展应用

超声波传感器可用于多种项目,例如:

  • 智能垃圾桶(自动开盖)
  • 机器人避障系统
  • 液位检测装置
  • 自动门控制系统

总结

通过本教程,你学会了:

  1. HC-SR04超声波传感器的基本工作原理
  2. Arduino与传感器的电路连接
  3. 使用pulseIn()函数测量时间
  4. 距离计算的基本公式
  5. 如何添加LED指示功能

这是一个基础的入门教程,你可以根据自己的需求扩展功能,如添加LCD显示、蓝牙数据传输等更复杂的应用。

2 条评论

  • @ 2025-6-2 18:23:03

    这段代码使用超声波传感器(如HC-SR04)来测量距离,并通过串口监视器输出测量结果。下面是添加了详细注释的代码:

    // 全局变量:存储测量到的距离值
    double dis;
    
    /* 超声波测距函数
     * 功能:使用超声波传感器测量前方障碍物的距离
     * 返回值:测量到的距离(单位:厘米)
     */
    float checkdistance_2_3() {
      // 触发超声波传感器:发送低电平脉冲2微秒
      digitalWrite(2, LOW);
      delayMicroseconds(2);
      
      // 发送10微秒的高电平触发脉冲
      digitalWrite(2, HIGH);
      delayMicroseconds(10);
      
      // 结束触发,恢复低电平
      digitalWrite(2, LOW);
      
      // 读取回声时间(高电平持续时间),并将其转换为距离(厘米)
      // 公式:距离(cm) = 声波飞行时间(μs) / 58
      float distance = pulseIn(3, HIGH) / 58.00;
      
      // 延时10毫秒,避免频繁测量造成干扰
      delay(10);
      
      return distance;
    }
    
    /* 初始化函数
     * 功能:配置引脚模式和初始化串口通信
     */
    void setup() {
      // 初始化距离变量
      dis = 0;
      
      // 配置引脚2为输出(触发信号)
      pinMode(2, OUTPUT);
      // 配置引脚3为输入(接收回声)
      pinMode(3, INPUT);
      
      // 初始化串口通信,波特率9600bps
      Serial.begin(9600);
    }
    
    /* 主循环函数
     * 功能:循环执行距离测量并输出结果
     */
    void loop() {
      // 调用测距函数获取当前距离
      dis = checkdistance_2_3();
      
      // 通过串口输出测量结果
      Serial.println(dis);
      
      // 循环执行(默认无延时,持续测量)
    }
    

    代码说明:

    1. 硬件连接

      • 超声波传感器的Trig引脚连接到Arduino的数字引脚2
      • 超声波传感器的Echo引脚连接到Arduino的数字引脚3
    2. 工作原理

      • 通过向Trig引脚发送触发脉冲启动测量
      • 传感器发送超声波并在Echo引脚输出高电平
      • 使用pulseIn()函数测量高电平持续时间(即声波往返时间)
      • 根据声波在空气中的传播速度(约340m/s)计算距离
    3. 距离计算公式

      • 声波飞行时间(μs) / 2 = 单程时间
      • 单程时间 × 声速(340m/s) = 距离
      • 简化后:距离(cm) = 声波飞行时间(μs) / 58
    4. 注意事项

      • 测量范围通常为2cm至400cm
      • 测量精度受环境影响(如温度、障碍物表面材质等)
      • 频繁测量时建议添加适当延时,避免干扰

    如果需要调整测量频率或增加其他功能(如距离阈值判断),可以在loop()函数中进行扩展。

    • @ 2025-6-2 13:48:23

      double dis;
      
      float checkdistance_2_3() {
        digitalWrite(2, LOW);
        delayMicroseconds(2);
        digitalWrite(2, HIGH);
        delayMicroseconds(10);
        digitalWrite(2, LOW);
        float distance = pulseIn(3, HIGH) / 58.00;
        delay(10);
        return distance;
      }
      
      void setup(){
        dis = 0;
        pinMode(2, OUTPUT);
        pinMode(3, INPUT);
        Serial.begin(9600);
      }
      
      void loop(){
        dis = checkdistance_2_3();
        Serial.println(dis);
      
      }
      
      • 1