news 2026/4/18 2:05:11

手把手教你用Arduino Uno作品实现超声波测距应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手教你用Arduino Uno作品实现超声波测距应用

用Arduino玩转超声波测距:从零搭建一个智能避障系统

你有没有想过,机器人是怎么“看见”障碍物并自动绕开的?其实它不一定靠摄像头,很多时候是靠一种叫超声波传感器的小装置——就像蝙蝠在黑暗中靠回声定位一样。

今天我们就来动手做一个“能感知距离”的小系统:使用一块最常见的Arduino Uno和一个便宜好用的HC-SR04 超声波模块,实现非接触式测距。整个过程不需要焊接、不依赖复杂工具,连编程都是从零开始讲解,适合所有刚入门电子设计的朋友。

更重要的是,这个项目不只是“亮个灯”那么简单,它是真正可以用于智能小车避障、自动门控制甚至液位监测的基础能力。学会它,你就迈出了通往智能硬件世界的第一步。


为什么选 HC-SR04?这颗“电子眼”到底强在哪?

在众多测距方案中,红外、激光、ToF(飞行时间)各有千秋,但如果你是个初学者,或者想快速验证想法,HC-SR04 是最值得推荐的选择之一

它的核心优势一句话就能说清:

五块钱的成本,换来接近一米的有效探测距离和毫米级精度。

我们来看看它的关键参数:

特性数值/说明
工作电压5V(与 Arduino 完美匹配)
测量范围2cm – 400cm(官方标称)
精度可达 ±3mm
触发信号需要 10μs 高电平脉冲
回波输出高电平持续时间 = 声波往返时间
响应间隔至少 60ms 才能下一次测量

别被这些数字吓到,我们一步步拆解它的工作原理,你会发现它比想象中简单得多。

它是怎么“看”东西的?

你可以把它想象成一个微型声呐系统:

  1. 你说:“嘿!” —— 这相当于给 Trig 引脚发一个 10 微秒的高电平;
  2. 模块听到后,立刻向空气中发射一串 40kHz 的超声波(人耳听不见);
  3. 声音撞到墙或手就反弹回来;
  4. 模块“耳朵”(接收器)收到回音时,Echo 引脚变成高电平;
  5. 高电平维持的时间,就是声音来回一趟所花的时间。

有了时间,再乘以声速,除以二(因为是往返),就能算出你离墙有多远。

👉 公式来了:
$$
\text{距离} = \frac{\text{声速} \times \text{时间}}{2}
$$

声速大约是340 米/秒 = 0.034 厘米/微秒
比如 Echo 输出了 5800 微秒的高电平:
$$
(5800 × 0.034) / 2 ≈ 98.6 \text{ cm}
$$

是不是有点像物理课上的计算题?只不过现在是你让机器自动完成这一切。


为什么用 Arduino Uno?因为它让复杂变简单

要说嵌入式开发板里谁最受欢迎,那必须是Arduino Uno。不是因为它最强,而是因为它最“懂新手”。

这块基于 ATmega328P 的开发板,虽然性能不算顶尖,但它有几个杀手锏:

  • 开发环境极简:下载 IDE → 写代码 → 点“上传”,搞定。
  • 引脚标注清晰:数字口、模拟口、电源都写得明明白白。
  • 社区资源海量:遇到问题 Google 一下,基本都有答案。
  • 支持 USB 直接供电和调试,插上电脑就能跑。

更重要的是,它原生支持pulseIn()函数——专门用来精确测量脉冲宽度,正好拿来读取 Echo 信号的时间长度,省去了手动计时的麻烦。

下面是它的核心配置一览:

参数
主控芯片ATmega328P
工作频率16 MHz
数字 I/O 引脚14 个(其中 6 个支持 PWM)
模拟输入引脚6 个
Flash 存储32KB
SRAM2KB
EEPROM1KB
通信接口UART、SPI、I²C 全支持

对于我们这个项目来说,只需要两个数字引脚:一个输出触发信号,一个读取回波时间。剩下的资源还能扩展蜂鸣器、LED 或显示屏。


动手写代码:教你写出第一个测距程序

接下来是最关键的部分——编程。别担心,哪怕你是第一次写 Arduino 代码,我也带你一行行看懂。

接线准备

先确认硬件连接(很简单):

HC-SR04 引脚接到 Arduino Uno 的
VCC5V
GNDGND
Trig数字引脚 9
Echo数字引脚 10

无需电阻或额外电路,直接插面包板就行。

核心代码来了

// 定义引脚编号 const int trigPin = 9; const int echoPin = 10; // 声速(单位:厘米/微秒) #define SOUND_SPEED 0.034 void setup() { // 设置引脚模式 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); // 启动串口通信,波特率设为 9600 Serial.begin(9600); } void loop() { long duration; // 存储回波持续时间(微秒) float distance; // 存储计算后的距离(厘米) // 第一步:确保 Trig 是低电平,准备发送脉冲 digitalWrite(trigPin, LOW); delayMicroseconds(2); // 第二步:发送 10μs 高电平触发信号 digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // 第三步:等待 Echo 变高,并测量其持续时间 duration = pulseIn(echoPin, HIGH); // 第四步:根据时间计算距离 distance = (duration * SOUND_SPEED) / 2; // 第五步:通过串口打印结果 Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); // 每次测量至少间隔 60ms,避免干扰 delay(60); }

逐行解析,搞懂每一句的作用

  • pinMode(trigPin, OUTPUT):告诉 Arduino 这个引脚是用来“发命令”的。
  • digitalWrite(trigPin, HIGH)+delayMicroseconds(10):精准发出 10 微秒的高电平,唤醒 HC-SR04。
  • pulseIn(echoPin, HIGH):这是关键函数!它会返回 Echo 引脚保持高电平的时间(单位:微秒),精度可达几微秒。
  • 距离公式(duration * 0.034) / 2:把时间转成实际距离。
  • Serial.print():把结果显示在电脑的“串口监视器”里,方便你看数据。
  • 最后的delay(60):必须加!否则模块来不及反应,容易出错。

烧录完成后,打开 Arduino IDE 的“串口监视器”(Ctrl+Shift+M),你会看到类似这样的输出:

Distance: 32.4 cm Distance: 32.6 cm Distance: 31.9 cm ...

只要把手放在传感器前移动,数值就会跟着变化,是不是很神奇?


实战优化技巧:让你的测距更稳定可靠

刚上电时可能发现数据跳动很大,这不是代码错了,而是现实世界的“噪声”在捣乱。下面这几个技巧,能大幅提升系统的实用性。

✅ 技巧一:加入中值滤波,过滤异常值

有时候会突然冒出一个“1000cm”或者“0cm”的错误读数,可能是多路径反射或信号丢失导致的。解决办法是:连续采样几次,取中间那个最靠谱的值

float getStableDistance() { float samples[5]; // 存储5次采样 for (int i = 0; i < 5; i++) { // 发送触发并读取单次距离 digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long dur = pulseIn(echoPin, HIGH); samples[i] = (dur * SOUND_SPEED) / 2; delay(20); // 小延迟,避免频繁触发 } // 对数组排序 for (int i = 0; i < 4; i++) { for (int j = i + 1; j < 5; j++) { if (samples[i] > samples[j]) { float temp = samples[i]; samples[i] = samples[j]; samples[j] = temp; } } } return samples[2]; // 返回第3个(中位数) }

把这个函数替换原来的单次读取,你会发现数据显示平稳多了。

✅ 技巧二:设置报警阈值,做个小警报器

加个 LED 或蜂鸣器,当物体靠近到一定距离就提醒你!

const int alarmPin = 13; // 使用板载LED void loop() { float distance = getStableDistance(); Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); if (distance < 20 && distance >= 2) { // 在2~20cm之间触发 digitalWrite(alarmPin, HIGH); } else { digitalWrite(alarmPin, LOW); } delay(60); }

这样就可以做一个“防撞提示灯”,装在小车上特别实用。

✅ 技巧三:接个屏幕,脱离电脑也能看

不想每次都连电脑?接一个LCD1602OLED 屏幕,本地显示距离。

例如用 I²C OLED 显示屏,只需增加几行代码:

#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // 在 setup() 中初始化屏幕 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); // 在 loop() 结尾添加显示逻辑 display.setCursor(0, 0); display.print("Dist: "); display.print(distance); display.println(" cm"); display.display();

瞬间就有了“专业设备”的感觉。


常见问题排查指南(踩过的坑我都替你试过了)

别以为接上线就能万事大吉,以下是新手最容易遇到的问题和解决方案:

现象原因分析解决方法
串口一直输出 0 或负数未正确接线或电源不稳检查 VCC/GND 是否接牢,建议单独供电
数据剧烈波动外界干扰或多路反射加中值滤波,避免正对光滑斜面
总是超时(返回0)表面吸音太强(如海绵)换硬质目标测试,如书本或墙壁
串口无任何输出波特率不对或驱动未安装确认 Serial.begin(9600),检查 COM 口选择
多次测量后卡死忘记加 delay 或中断冲突确保每次循环有足够延时(≥60ms)

📌特别提醒:不要把多个传感器靠得太近,它们的超声波会互相干扰,造成误判。


这个技能能用在哪里?给你五个脑洞应用场景

你以为这只是个玩具?其实它可以变得非常实用:

  1. 智能垃圾桶
    手靠近桶盖自动打开,全靠检测距离变化。

  2. 倒车雷达雏形
    安装在车尾,距离过近就蜂鸣报警,成本不到百元。

  3. 机器人避障系统
    小车前进时实时扫描前方,遇到障碍自动转向。

  4. 仓库物品高度检测
    安装在货架上方,监控货物堆积情况,防止溢出。

  5. 居家安防入侵检测
    放在走廊或门口,有人进入特定区域即触发警报。

更进一步,你可以加上 ESP8266 WiFi 模块,把数据传到手机;或者用多个传感器组成阵列,判断物体方向,实现简单的空间感知。


写在最后:每一个高手,都是从这种“小项目”起步的

很多人觉得嵌入式开发很难,要懂电路、会编程、还得调各种协议。但真相是:所有复杂的系统,都是由一个个简单模块搭起来的

今天你学会了怎么让 Arduino “听见”世界,明天你就可以让它“看见”、“思考”甚至“决策”。

HC-SR04 + Arduino 的组合看似基础,但它教会你的东西远不止测距本身:

  • 如何阅读传感器手册
  • 如何理解时序图和电气特性
  • 如何将物理量转化为可处理的数据
  • 如何通过软件提升硬件稳定性

这些才是工程师真正的核心能力。

所以,别犹豫了,找一块 Arduino,买一个超声波模块,亲手搭一遍。当你第一次看到屏幕上跳出准确的距离值时,那种“我做到了”的成就感,会让你爱上硬件创造的乐趣。

如果你在实现过程中遇到了其他挑战,欢迎在评论区分享讨论。我们一起把想法变成现实。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 5:13:44

LangFlow与关键词提取结合:精准定位内容主题

LangFlow与关键词提取结合&#xff1a;精准定位内容主题 在信息爆炸的时代&#xff0c;每天产生的文本数据量呈指数级增长。从社交媒体评论到企业文档&#xff0c;从新闻报道到科研论文&#xff0c;如何快速理解海量文本的核心主题&#xff0c;成为许多组织面临的关键挑战。传统…

作者头像 李华
网站建设 2026/4/17 13:49:49

LED显示屏安装抗震结构措施:全面讲解安全规范

LED显示屏抗震安装实战指南&#xff1a;从结构设计到施工避坑你有没有想过&#xff0c;城市楼宇外墙上那块巨大的LED屏幕&#xff0c;在地震来临时会不会掉下来&#xff1f;这不是危言耸听。近年来&#xff0c;多地曾发生因强风或地震导致户外广告牌、显示屏松动甚至坠落的事件…

作者头像 李华
网站建设 2026/4/16 13:47:04

抖音无水印视频下载终极指南:一键保存高清短视频

还在为抖音视频上的水印烦恼吗&#xff1f;想要永久收藏那些精彩的短视频内容吗&#xff1f;douyin_downloader抖音无水印下载工具为您提供专业级解决方案&#xff0c;让您轻松下载高清无水印视频&#xff0c;无论是个人收藏还是内容创作都能得心应手。 【免费下载链接】douyin…

作者头像 李华
网站建设 2026/4/15 3:41:43

快手今天晚上怎么了?

快手今晚集中出现大量黄色直播&#xff0c;核心原因是黑产团伙发起的技术突袭攻击&#xff0c;并非平台正常内容生态问题。具体来看&#xff0c;黑产团伙通过三种关键手段批量推送涉黄内容&#xff0c;导致违规直播短时间内刷屏&#xff1a;1. 批量操控账号&#xff1a;利用“接…

作者头像 李华
网站建设 2026/4/17 21:55:28

设计模式学习(5) 23-2 简单工厂、工厂方法 23-4 抽象工厂

0. 个人感悟 工厂模式是经典的创建型模式&#xff0c;工作中也经常用到&#xff0c;值得一学核心思想是将对象的创建和自身业务隔离开&#xff0c;从而达到复用、解耦的效果随着业务的逐渐扩展(产品创建逻辑膨胀、不同产品组合工作等)&#xff0c;工厂抽象程度不断加深&#x…

作者头像 李华
网站建设 2026/4/15 10:56:27

LangFlow中的二维码生成器:快速创建可扫描内容

LangFlow中的二维码生成器&#xff1a;快速创建可扫描内容 在智能系统日益渗透日常场景的今天&#xff0c;如何让大语言模型&#xff08;LLM&#xff09;的输出不再局限于对话框里的文字&#xff0c;而是真正“走出去”&#xff0c;与物理世界产生互动&#xff1f;一个简单的二…

作者头像 李华