Arduino Uno与HC-SR04超声波传感器:从基础测距到稳定应用实战

发布时间:2026/8/19 6:47:49

Arduino Uno与HC-SR04超声波传感器:从基础测距到稳定应用实战
1. 项目概述用超声波传感器和Arduino Uno测距如果你手头有一块Arduino Uno想给它装上“眼睛”让它感知周围物体的距离那么超声波传感器几乎是你的不二之选。这个组合堪称电子创客和嵌入式初学者的“黄金搭档”成本低廉、原理直观、应用广泛。从简单的避障小车、自动门感应到液位监测、停车辅助系统其核心逻辑都是通过测量超声波从发射到接收的时间差来计算出前方障碍物的距离。我玩过很多传感器但超声波传感器尤其是HC-SR04这个经典型号的稳定性和易用性让它成为了我项目工具箱里的常客。这个项目看起来简单就是让Arduino Uno控制超声波传感器发射声波再接收回波然后做个简单的计算。但真想把它用稳、用准里面有不少细节值得琢磨。比如为什么有时候读数会乱跳怎么让测量更稳定除了简单的距离显示还能玩出什么花样接下来我就结合自己多次实操的经验从硬件连接到代码编写再到数据处理和项目扩展为你拆解这个经典组合的每一个环节让你不仅能复现更能理解背后的门道做出更可靠的应用。2. 核心硬件解析与选型考量2.1 超声波传感器HC-SR04深度拆解我们最常用的HC-SR04模块其核心是两颗压电陶瓷超声波换能器一颗负责发射Trigger一颗负责接收Echo。它的工作电压是5V与Arduino Uno的IO电平完美匹配这也是它如此流行的原因之一。模块上有四个引脚VCC接5V电源。GND接地。Trig触发控制信号输入。你需要给这个引脚一个至少10微秒的高电平脉冲模块内部振荡器就会驱动发射头发出一串8个40kHz的超声波脉冲。Echo回响信号输出。当模块检测到返回的声波后这个引脚会输出一个高电平脉冲脉冲的宽度与超声波从发射到返回所经过的时间成正比。这里有个关键点Echo引脚输出的高电平是5V的。对于Arduino Uno来说其数字输入引脚可以安全地读取5V信号所以我们可以直接连接。但如果你使用的是像ESP8266或ESP32这类工作电压为3.3V的微控制器直接连接可能会损坏芯片此时就需要通过电阻分压或电平转换模块来处理。2.2 Arduino Uno作为控制核心的优势为什么是Arduino Uno对于这个项目它的优势非常明显供电方便板载的5V和3.3V稳压输出可以直接为传感器供电无需额外的电源电路。引脚兼容数字IO口输出5V输入可耐受5V与HC-SR04无缝对接。编程简易丰富的库支持和简单的pulseIn()函数让时间测量变得异常简单。生态完善无论是连接LCD显示屏实时显示距离还是通过舵机控制传感器转动扫描都有海量的示例和扩展板支持。当然如果你追求更小的体积可以考虑Nano如果需要无线功能可以换用ESP8266。但对于学习和验证基础原理Uno的稳定性和易用性无可替代。2.3 硬件连接图与实操要点连接非常简单HC-SR04.VCC-Arduino 5VHC-SR04.GND-Arduino GNDHC-SR04.Trig-Arduino 数字引脚 9示例可任选HC-SR04.Echo-Arduino 数字引脚 10示例可任选注意在连接时尽量使用面包板杜邦线并确保连接牢固。接触不良是导致数据跳动或完全无读数的常见原因。如果条件允许给Arduino单独供电如通过电源适配器而不是仅靠USB供电当连接较多外设时能提供更稳定的电压。3. 基础代码实现与原理剖析3.1 核心测距原理解读超声波测距基于一个简单的物理公式距离 速度 × 时间 / 2。速度声波在空气中的传播速度常温20°C下约为343米/秒或34300厘米/秒。但速度会随温度、湿度变化这是影响精度的一个因素。时间从超声波发射到被接收器检测到回波所经过的时间。因为声波走了来回两倍的距离所以最后要除以2。距离最终我们想要得到的到障碍物的直线距离。在代码中我们通过pulseIn(pin, HIGH)函数来测量Echo引脚高电平的持续时间这个时间就是超声波传播的“时间”。3.2 逐行代码解析与优化下面是一个最基础、最经典的示例代码我将逐段分析并指出可以优化的地方// 定义引脚 const int trigPin 9; const int echoPin 10; void setup() { Serial.begin(9600); // 初始化串口用于在电脑上显示结果 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); digitalWrite(trigPin, LOW); // 初始确保Trig为低电平 delayMicroseconds(2); // 短暂稳定 } void loop() { // 1. 发射超声波脉冲 digitalWrite(trigPin, HIGH); delayMicroseconds(10); // 维持高电平10微秒触发发射 digitalWrite(trigPin, LOW); // 2. 检测回波脉冲宽度 long duration pulseIn(echoPin, HIGH); // 单位微秒 // 3. 计算距离单位厘米 // 声速 343 m/s 0.0343 cm/微秒 来回距离所以除以2 float distance_cm duration * 0.0343 / 2; // 4. 输出结果 Serial.print(Distance: ); Serial.print(distance_cm); Serial.println( cm); delay(100); // 每次测量间隔100毫秒 }代码要点与优化空间pulseIn的陷阱pulseIn()函数默认会等待一段时间默认为1秒来检测脉冲。如果在这个时间内没有检测到高电平例如前方没有障碍物或距离太远函数会返回0。这会导致距离计算为0可能被误认为是极近的物体。我们可以通过设置超时参数来改善pulseIn(echoPin, HIGH, 30000)这里设置超时为30000微秒30毫秒对应大约5米的检测距离因为声音传播5米来回需要约29毫秒。超过这个时间没收到回波函数返回0我们可以将其判断为“无物体”或“超出量程”。浮点数运算float distance_cm duration * 0.0343 / 2;这里使用了浮点数运算。对于8位的AVR单片机Arduino Uno的核心浮点运算速度较慢。如果对实时性要求高可以改为整数运算。例如因为0.0343/2 0.01715近似为17/1000 0.017那么公式可以近似为distance_cm duration * 17 / 1000;。虽然略有误差但速度更快。测量间隔delay(100)确保了每秒测量约10次。对于大多数应用足够了。但要注意HC-SR04模块两次测量之间需要至少60ms的间隔以确保上次测量的声波完全消散避免干扰。delay(100)满足这个要求。3.3 增加滤波与稳定性处理原始代码读出的数据往往会有跳动。我们可以通过软件滤波来平滑数据。这里介绍两种简单有效的方法1. 中值滤波连续采样奇数次比如5次去掉一个最大值和一个最小值然后对剩下的值取平均。这能有效消除偶然的尖峰干扰。float getFilteredDistance() { const int numReadings 5; float readings[numReadings]; for (int i 0; i numReadings; i) { // ... 触发并测量一次距离存入readings[i] delay(30); // 每次单次测量后稍作延迟 } // 简单的排序找中值这里简化为取中间值 // 实际应实现排序算法这里仅为示意 // 假设我们取第三次测量值作为中值对于5次采样排序后第三位即为中值 // 更严谨的做法是排序后取中间值 return readings[2]; // 简化处理 }2. 移动平均滤波维护一个固定长度的队列每次新测量值进入队列最旧的值出队然后计算队列中所有值的平均值。const int windowSize 10; float distanceWindow[windowSize]; int windowIndex 0; float distanceSum 0; float movingAverageFilter(float newDistance) { distanceSum - distanceWindow[windowIndex]; // 减去即将被覆盖的旧值 distanceWindow[windowIndex] newDistance; // 存入新值 distanceSum newDistance; // 加上新值 windowIndex (windowIndex 1) % windowSize; // 移动索引 return distanceSum / windowSize; // 返回平均值 }在loop()中我们先用基础方法测出一个原始距离rawDist然后调用filteredDist movingAverageFilter(rawDist);使用滤波后的值进行后续判断和输出稳定性会大幅提升。4. 高级应用与项目拓展4.1 多方位测距与扫描系统单个传感器只能测量一个方向的距离。我们可以结合舵机Servo让传感器旋转起来实现扇形区域的扫描。你需要一个舵机如SG90和相应的库。基本思路是在setup()中初始化舵机。在loop()中让舵机从0度逐步转到180度。在每个角度位置执行一次超声波测距。记录或发送每个角度对应的距离值。这样你就获得了一组“角度-距离”数据可以绘制简单的雷达图或者用于更复杂的避障算法比如寻找最宽的通路。4.2 阈值触发与联动控制单纯的测距显示意义有限通常我们需要用它来触发某些动作。例如制作一个自动感应灯当测量距离小于50厘米时表示有人靠近点亮LED灯。当距离大于50厘米并持续3秒钟时表示人已离开熄灭LED灯。这里引入了“状态维持”的概念。你需要一个变量来记录灯的状态并且用一个计时器来判断“持续离开”的时间。bool lightOn false; unsigned long leaveStartTime 0; const int triggerDistance 50; // 触发距离单位厘米 const unsigned long leaveDelay 3000; // 离开延迟单位毫秒 void loop() { float dist getFilteredDistance(); // 使用滤波后的距离 if (dist 0 dist triggerDistance) { // 有人靠近 digitalWrite(ledPin, HIGH); lightOn true; leaveStartTime 0; // 重置离开计时 } else if (lightOn) { // 灯亮着但当前无人 if (leaveStartTime 0) { leaveStartTime millis(); // 开始记录离开时间 } else if (millis() - leaveStartTime leaveDelay) { // 持续离开时间超过设定值 digitalWrite(ledPin, LOW); lightOn false; } } delay(100); }4.3 通过串口绘制实时距离曲线利用Arduino IDE自带的串口绘图器Serial Plotter我们可以可视化距离变化。只需将滤波后的距离数据通过Serial.println(filteredDist);发送即可。绘图器会自动将其绘制成曲线非常直观对于调试传感器响应、观察物体移动轨迹非常有帮助。5. 常见问题排查与调试心得在实际操作中你肯定会遇到各种问题。下面是我总结的一些典型情况及其解决方法问题现象可能原因排查步骤与解决方案读数始终为01. 接线错误或接触不良。2. 电源功率不足。3. 物体超出量程或表面不反射声波如海绵、布料。4. 代码中Trig触发脉冲宽度不足。1. 反复检查VCC、GND、Trig、Echo四根线是否接对、接牢。2. 尝试用外部电源如9V电池通过Arduino的Vin口为整个系统供电。3. 换一个硬质、平整的物体如木板、墙壁在近距离20cm内测试。4. 确保digitalWrite(trigPin, HIGH);和delayMicroseconds(10);之间没有插入其他延时或代码。读数乱跳不稳定1. 测量环境有干扰如多个超声波传感器同时工作、强气流。2. 被测物体表面不平或角度不佳。3. 电源噪声。4. 未进行软件滤波。1. 确保一次只有一个超声波模块在工作。远离风扇、空调出风口。2. 尽量让传感器正对平整的物体表面。3. 在Arduino的5V和GND之间并联一个100uF的电解电容以平滑电源。4.务必实施前文介绍的移动平均或中值滤波算法这是解决跳数的关键。测量距离明显不准1. 声速常数不准确受温度影响。2. 传感器模块个体差异或质量不佳。1. 引入温度传感器如DS18B20、DHT11根据实时温度修正声速。公式V 331.3 0.606 * T其中T为摄氏温度。2. 用一个卷尺实际测量一段距离如100.0cm与传感器读数对比计算出一个校正系数在代码中乘以这个系数。最远测量距离只有2-3米1. 供电电压不足。2. 被测物体吸声严重。3.pulseIn超时设置太短。1. 确保供电电压稳定在5V。使用万用表测量HC-SR04的VCC和GND之间的电压。2. 这是物理限制对于柔软、多孔的物体有效测距会缩短。3. 检查pulseIn的超时参数确保其大于声波往返最大距离所需时间约每米5800微秒。舵机转动时传感器读数异常舵机电机启动和制动时会产生较大的电源噪声和电压跌落干扰传感器工作。1. 为舵机单独供电与Arduino和传感器的电源完全隔离共地即可。2. 在舵机电源两端并联一个大电容如470uF或更大。3. 在舵机转动和超声波测量之间增加延迟避免同时工作。几条宝贵的实操心得上电顺序先给Arduino上电稳定后再连接传感器。热插拔传感器容易因电流冲击导致损坏。避免遮挡传感器表面的收发探头不要被手指、标签或其他物体遮挡保持清洁。测量盲区HC-SR04在近距离通常2-3厘米以内存在盲区无法准确测量。如果你的应用涉及很近的物体需要选择盲区更小的型号或者通过算法和机械结构规避。角度影响超声波波束有一定角度HC-SR04约15度。物体表面如果不是正对传感器反射信号会减弱可能导致测距变短或无法测距。对于复杂场景可以考虑使用多个传感器从不同角度探测。环境适应性极端温度、湿度、气压都会影响声速。对于高精度要求必须进行温湿度补偿。对于普通室内创客项目使用固定的0.0343系数通常足够。从简单的距离数字显示到融合了滤波算法、状态机逻辑的智能感应装置再到结合舵机的扫描系统Arduino Uno与超声波传感器的组合为我们打开了一扇感知物理世界的大门。它的价值不在于复杂而在于其极高的可靠性和无限的扩展性让你能快速将想法验证为原型。我自己的第一个自动避障小车、第一个智能储物箱提示器都是从这个小小的模块开始的。当你掌握了稳定读取数据、有效处理干扰的方法后你会发现很多有趣的物联网和交互项目其实都离不开这“一发一收”的基本原理。

相关新闻

2026年广电奔马卡深度评测:5年长期套餐的性价比与避坑指南

2026年广电奔马卡深度评测:5年长期套餐的性价比与避坑指南

2026/8/19 6:47:49

1. 这篇文章真正要解决的问题如果你最近在找一张靠谱的手机流量卡,大概率已经看花了眼。各种“神卡”、“神车”的宣传铺天盖地,什么“19元200G”、“29元无限量”,点进去才发现要么是短期优惠,要么是定向流量,要么就是…

Arduino Uno与HC-SR04超声波传感器:从原理到避障应用的完整指南

Arduino Uno与HC-SR04超声波传感器:从原理到避障应用的完整指南

2026/8/19 6:47:49

1. 项目概述:用Arduino Uno玩转超声波传感器如果你手头正好有一块Arduino Uno和一个超声波传感器,却不知道如何让它们“开口说话”,测量距离,那这篇文章就是为你准备的。超声波传感器,特别是常见的HC-SR04模块&#xf…

基于MAPPO的异构机器人协同任务与路径规划实战指南

基于MAPPO的异构机器人协同任务与路径规划实战指南

2026/8/19 6:47:49

1. 项目概述:当一群“性格迥异”的机器人需要协同作战想象一下这样一个场景:在一个大型的自动化仓库里,有负责快速穿梭搬运的移动机器人(AGV),有能精准抓取货箱的机械臂,还有能爬升到货架高处的…

人工智能 情感陪伴与智能助手产品开发实践:失败尝试的证据、止损与调整

人工智能 情感陪伴与智能助手产品开发实践:失败尝试的证据、止损与调整

2026/8/19 7:27:50

人工智能 情感陪伴与智能助手产品开发实践:失败尝试的证据、止损与调整 在基于 AI 技术的智能助手与情感陪伴产品研发中,产品团队与技术研发团队之间经常会出现一种微妙的张力。产品经理提出“希望回复更有同理心、更像一个温暖的朋友”,而研…

嵌入式软件调试实战:从printf到ETM,高效定位内存与实时性难题

嵌入式软件调试实战:从printf到ETM,高效定位内存与实时性难题

2026/8/19 7:27:50

1. 嵌入式软件调试:从新手到老手的实战心法调试,对于嵌入式开发者而言,既是日常工作,也是一门艺术。它不像编写新功能那样充满创造的快感,更像是一场与未知Bug的耐心博弈。无论是面对一块刚刚上电、毫无反应的电路板&a…

openpilot如何让普通车辆秒变智能驾驶?开源驾驶辅助系统完全上手指南

openpilot如何让普通车辆秒变智能驾驶?开源驾驶辅助系统完全上手指南

2026/8/19 7:27:50

openpilot如何让普通车辆秒变智能驾驶?开源驾驶辅助系统完全上手指南 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.com/…

生活化智能应用怎样形成可持续的使用习惯

生活化智能应用怎样形成可持续的使用习惯

2026/8/19 7:27:50

生活化智能应用怎样形成可持续的使用习惯 晨光划破薄雾照在原木书桌上,热拿铁蒸腾着微弱的气息,脚边毛茸茸的灰色贵宾犬正舒服地哼唧翻身。屏幕上新上线的“情绪日记与习惯提醒”服务已经运行了一整周。很多人以为,把一个基于大语言模型的陪伴…

AO3镜像站从哪里来、怎么挑、坏了怎么办?一篇讲透深夜追更的隐形通道

AO3镜像站从哪里来、怎么挑、坏了怎么办?一篇讲透深夜追更的隐形通道

2026/8/19 7:27:50

AO3镜像站从哪里来、怎么挑、坏了怎么办?一篇讲透深夜追更的隐形通道 【免费下载链接】AO3-Mirror-Site 项目地址: https://gitcode.com/gh_mirrors/ao/AO3-Mirror-Site 凌晨一点,你第无数次点开那篇追了半年的连载,进度条转了三圈&a…

Node-RED与LattePanda边缘计算实战:从物联网玩具到工业级自动化

Node-RED与LattePanda边缘计算实战:从物联网玩具到工业级自动化

2026/8/19 7:17:50

1. 从“玩具”到“生产力”:为什么是Node-RED与LattePanda的组合? 如果你对物联网、智能家居或者自动化流程感兴趣,那么Node-RED这个名字你大概率不会陌生。它是一个基于浏览器的可视化编程工具,用“连线”的方式把各种功能模块&a…

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

2026/8/19 3:36:59

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/18 1:03:22

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/17 8:40:51

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

SQL 调优 [ 2 ]

SQL 调优 [ 2 ]

2026/8/19 0:07:32

type列详解EXPLAIN输出的type列描述了表是如何连接的,性能从最好到最差的排序如下:systemconsteq_refreffulltextref_or_nullindex_mergeunique_subqueryindex_subqueryrangeindexALL接下来我们对 type列 做详细讲解。我们都知道,想要评估一条…

正式评优怎么选投票工具?人人微投票审计级防刷能力实测

正式评优怎么选投票工具?人人微投票审计级防刷能力实测

2026/8/19 0:07:32

在线上投票工具遍地开花的今天,选择一个合适的平台,本质上是在做一道关于场景与需求的匹配题。人人微投票是一个很典型的案例——它的产品逻辑、技术架构和商业模式,都围绕着“正式评选”这个细分场景深度扎根,也因此形成了自己鲜…

15 天 3 连发:DeepSeek 的「机枪」节奏,到底在下什么棋?

15 天 3 连发:DeepSeek 的「机枪」节奏,到底在下什么棋?

2026/8/19 0:07:32

15 天 3 连发:DeepSeek 的「机枪」节奏,到底在下什么棋?回看 2026 年 8 月这半个月,DeepSeek 的动作密度堪称疯狂:月初端出便宜快速的 V4-Flash,8 月 13 日同一天甩出 V4-Pro 正式版 开源 Harness 框架&am…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/17 12:00:53

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/15 10:10:27

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/18 12:20:24

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…