一、模块介绍
HC-SR04 为四线制超声波测距模块,默认工作在GPIO 脉冲触发模式,无需串口、I2C 通信,仅通过普通高低电平完成测距。
- VCC:电源正极,接 Arduino 5V(必须5V,3.3V测距异常)
- GND:公共地线,与 Arduino GND 共地
- TRIG(Trigger):
触发信号输入引脚,英文含义:触发、启动,由单片机输出脉冲控制模块启动测距 - ECHO(Echo):
回响信号输出引脚,英文含义:回声、回音,模块反馈声波往返时长给单片机
二、原理
- 初始化清零:TRIG 先拉低2μs,清除引脚残留杂波,保证触发信号干净
- 触发启动:TRIG 输出 10μs 高电平脉冲(模块最低触发标准),模块立即发射8组40KHz超声波
- 回响计时:发射声波的同时,ECHO 引脚自动置高;等待声波碰到障碍物反射、模块接收回声后,ECHO 自动置低
- 计算距离:ECHO 高电平持续时间 = 超声波 往返总时长,通过声速公式换算出实际距离
官方要求:两次测距间隔必须大于60ms,防止残留声波干扰读数。
公式
1、物理原始公式(代码使用)
distance = duration * 0.034 / 2;
公式推导:
- 空气中声速:340 m/s = 0.034 cm/μs
- duration:声波往返总时间(微秒)
- duration × 0.034:声波往返总路程
2、只保留模块到障碍物的单程真实距离2、模块手册简化公式(等价效果)
- 厘米:距离(cm) = 微秒时长 ÷ 58
- 英寸:距离(inch) = 微秒时长 ÷ 148
两个公式完全等价,÷58 是 0.034/2 的近似化简结果,日常测距无肉眼误差。
三、代码
// 定义引脚 const int trigPin = 9; const int echoPin = 10; // 存储测距数据 long duration; int distance; void setup() { // 串口初始化,波特率9600 Serial.begin(9600); // 设置引脚模式 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { // 1. 清空TRIG引脚 digitalWrite(trigPin, LOW); delayMicroseconds(2);//先把TRIG 拉低 2 微秒 //HC-SR04 模块规则:必须给 TRIG 提供10 微秒以上高电平,模块才会发射 8 组 40KHz 超声波。 // 2. 发送10us高电平触发超声波发射 digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // 3. 读取ECHO返回高电平持续时间(声波往返时间) duration = pulseIn(echoPin, HIGH); // 4. 换算距离:声速340m/s,换算cm公式 distance = duration * 0.034 / 2; // 串口打印数据 Serial.print("当前距离:"); Serial.print(distance); Serial.println(" cm"); // 每500ms测一次 delay(500); }五、核心知识点总结
- 工作模式:纯GPIO脉冲模式,无通信协议,最基础、最稳定的入门模式
- 核心逻辑:TRIG发指令,ECHO返时间,公式算距离
- 硬性标准:触发脉冲必须≥10μs,测距间隔必须≥60ms
- 量程限制:2cm~400cm,超出范围读数失效