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显示、蓝牙数据传输等更复杂的应用。

4 条评论

  • @ 2025-6-7 19:20:01

    这段代码使用超声波传感器(如HC-SR04)测量距离并通过串口输出。以下是添加注释后的完整代码:

    // 定义超声波传感器引脚
    const int trigPin = A4;  // 触发引脚,用于发送超声波信号
    const int echoPin = A5;  // 回声引脚,用于接收反射的超声波信号
    
    double dis;  // 存储测量到的距离值
    
    // 函数:测量距离
    float checkdistance() {
      // 触发超声波发送
      digitalWrite(trigPin, LOW);    // 先将触发引脚拉低,确保状态稳定
      delayMicroseconds(2);          // 保持2微秒
      digitalWrite(trigPin, HIGH);   // 发送10微秒的高电平触发脉冲
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);    // 触发脉冲结束
      
      // 测量回声时间并计算距离
      // pulseIn()函数返回高电平持续时间(微秒),即超声波往返时间
      // 距离计算公式:距离(厘米) = 时间(微秒) / 58.00
      // (声速约340m/s,转换为厘米/微秒:34000/1000000 = 0.034cm/μs
      //  往返距离 = 0.034 * 时间 → 单程距离 = 0.034 * 时间 / 2 ≈ 时间 / 58)
      float distance = pulseIn(echoPin, HIGH) / 58.00;
      delay(10);  // 短暂延时,避免传感器读数冲突
      return distance;  // 返回测量的距离值(厘米)
    }
    
    void setup() {
      // 初始化变量和硬件
      dis = 0;                 // 初始化距离变量
      pinMode(trigPin, OUTPUT);  // 设置触发引脚为输出模式
      pinMode(echoPin, INPUT);   // 设置回声引脚为输入模式
      Serial.begin(9600);        // 初始化串口通信,波特率9600
    }
    
    void loop() {
      // 主循环:重复测量并输出距离
      dis = checkdistance();    // 调用函数测量当前距离
      Serial.println(dis);      // 通过串口输出距离值(单位:厘米)
      // 循环会自动重复执行,持续测量并更新距离
      delay(200);
    }
    

    工作原理说明:

    1. 传感器工作流程

      • Arduino向trigPin发送10微秒的高电平脉冲,触发超声波传感器发射超声波。
      • 传感器发射超声波后,echoPin会变为高电平,直到接收到反射的超声波信号。
      • pulseIn()函数测量echoPin高电平持续的时间,即超声波往返的时间。
    2. 距离计算

      • 声速约为340米/秒,换算为厘米/微秒约为0.034cm/μs。
      • 超声波往返距离 = 声速 × 时间 → 单程距离 = 声速 × 时间 / 2。
      • 简化公式:距离(cm) = 时间(μs) / 58。
    3. 串口输出

      • 测量结果通过串口以9600bps的速率输出,可以通过Arduino IDE的串口监视器查看实时距离值。

    注意事项:

    • 该代码假设传感器测量范围在2cm-400cm之间,超出范围可能返回0或不稳定值。
    • 测量精度受环境影响(如温度、障碍物表面材质等)。
    • 如需更精确的测量,可以添加温度补偿或多次测量取平均值。
    • @ 2025-6-7 19:18:56
      const int trigPin = A4;
      const int echoPin = A5;
      double dis;
      float checkdistance() {
        digitalWrite(trigPin, LOW);
        delayMicroseconds(2);
        digitalWrite(trigPin, HIGH);
        delayMicroseconds(10);
        digitalWrite(trigPin, LOW);
        float distance = pulseIn(echoPin, HIGH) / 58.00;
        delay(10);
        return distance;
      }
      void setup() {
        // put your setup code here, to run once:
        dis = 0;
        pinMode(trigPin, OUTPUT);
        pinMode(echoPin, INPUT);
        Serial.begin(9600);
      }
      
      void loop() {
        // put your main code here, to run repeatedly:
        dis = checkdistance();
        delay(200);
        Serial.println(dis);
      }
      
      • @ 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