尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

超声波感应灯制作全攻略:Mixly图形化编程与Arduino实战

发布时间:2026/9/29 1:25:24

资讯中心
01
ARTICLE

超声波感应灯制作全攻略:Mixly图形化编程与Arduino实战

超声波感应灯制作全攻略:Mixly图形化编程与Arduino实战
自己装过几次感应灯之后我算是把超声波测距这套玩意儿玩明白了。走廊里走过就亮、走远就灭说复杂也复杂说简单也简单——本质上就是两个事先量出人和灯之间的距离再拿这个距离去决定LED灯亮还是不亮。而这个逻辑用Mixly米思齐来写基本是图形化编程里最典型、最适合练手的入门项目。这篇就把整套东西掰开揉碎讲清楚超声波测距的原理、Mixly环境怎么搭、硬件怎么接、积木怎么拖、还有我实际调试中踩过的那些坑尤其是好多人都遇到的开发板端口识别不到的问题。不管你之前是零基础还是已经用Arduino写过几行代码只要手里有东西跟着走一遍就能复现。1. 项目原理超声波到底是怎么看见距离的1.1 从回声到电信号超声波测距的原理说起来非常朴素就是回声定位。蝙蝠在黑夜里飞行靠的就是这一招嘴里发出超声波声波撞到物体反弹回来耳朵接收回声根据发出和接收之间的时间差来判断障碍物多远。HC-SR04这个模块干的事一模一样只是把嘴和耳朵换成了两个圆柱形的换能器。一个负责发射一个负责接收中间那四个引脚就是它的通信接口。具体工作时序是这样的主控板给TRIG引脚一个至少10微秒的高电平脉冲模块内部会自动发出8个频率40kHz的超声波脉冲与此同时ECHO引脚会输出高电平。这个高电平不是随便给的它的持续时间刚好等于超声波从发射到返回的全程时间。主控只要量出ECHO高电平持续了多长就能算出距离。声波在空气中的传播速度大约是340米每秒也就是0.034厘米每微秒。声波走一个来回距离要除以2。换算公式就是距离厘米 ECHO高电平时间微秒 × 0.034 ÷ 2简化以后工程上常用距离厘米 ≈ 时间微秒 ÷ 58比如实测ECHO高电平持续了2000微秒那距离就是 2000 ÷ 58 ≈ 34.5厘米。这个58的系数是把声速和往返都折算进去了用起来非常省事。1.2 为什么选超声波而不是红外要做感应灯其实可以选的红外传感器HC-SR501人体红外、超声波模块HC-SR04甚至微波雷达模块都有。我做过对比这几种方案各有脾气传感器类型测距/感应方式优点缺点超声波HC-SR04发射40kHz声波测回声时间能测具体距离、不受环境光干扰、便宜耐用怕软质吸音材料、不能测太远实际靠谱范围3cm~3m人体红外HC-SR501探测人体红外热辐射只感应活物、功耗低只能输出有人/没人不能测远近夏天容易误触发微波雷达多普勒效应检测微弱运动穿透力强、感应灵敏成本高隔着墙也能触发不适合室内在这个项目里我选超声波的核心原因很直接它能输出距离是多少厘米这样一个连续数值而不是简单的有人/没人。有了这个数值我就可以设定任意阈值比如距离小于30厘米就亮灯大于35厘米就灭灯而且还能做进阶的多级亮灯逻辑。这种可控性是红外模块给不了的。1.3 LED灯的开关逻辑LED这边就更简单了就是个开关。Arduino的数字引脚可以输出高电平5V或者低电平0V把LED的正极接在数字引脚上负极接地引脚输出高电平灯就亮输出低电平灯就灭。整套控制逻辑用一句话说就是超声波量出距离 → 距离值跟阈值比较 → 小于阈值点亮LED大于阈值熄灭LED。这个逻辑看起来简单但后面调的时候会发现如果只设一个固定阈值灯会在临界点附近疯狂闪烁。这个问题的解决方案我在第5节单独讲是第一阶段的重点优化点。2. Mixly环境搭建大部分新手卡在第一步2.1 为什么选图形化编程Mixly米思齐是北京师范大学团队开发的图形化编程工具它的特殊之处在于你拖拽积木块它在背后自动生成标准的Arduino C/C代码然后帮你编译上传到开发板。也就是说你拖出来的每一个积木都能在代码区看到对应的C语言。这对初学者特别友好——不用先啃完一堆语法就能跑起来一个真实的硬件项目而且在Mixly的代码区能看到自己的积木到底变成了什么。拿本项目来说用到的主要积木分布在几个分类里输入/输出类设置引脚模式的积木、数字输出积木传感器类超声波测距积木新版本Mixly通常直接有控制类如果/否则判断积木、延时积木变量类变量的定义与赋值积木搭出来的东西本质就是我想在第4节展示的那段C代码。很多人担心用图形化编程会不会学不到东西我自己体验下来图形化帮你省去的是记语法的时间但逻辑思维一点没省而且在Mixly里随时能对照看代码反而是个学C语言的好路径。2.2 一个最容易卡住的问题CH340端口识别不到这个坑我必须单独拿出来说因为十个新人里至少有五个会死在这里。现象是USB线插上开发板电脑毫无反应Mixly右下角的端口列表是空的或者只有一个COM1这个是主板的串口不是开发板。绝大多数Arduino Uno兼容板用的是CH340这颗USB转串口芯片而不是原装的ATmega16U2芯片。用CH340是出于成本和供货考虑这颗芯片本身没有问题但它不像原装芯片那样被操作系统内置驱动支持需要手动装一遍驱动。电脑如果不认识CH340自然就不会给你虚拟出COM口。排查顺序我自己验证过基本是下面这个链路换一根USB线。这是最容易被忽略的很多MicroUSB线只支持充电根本不能传数据插上去当然没反应。换一根确定能传数据的线再试一次。打开设备管理器在Windows上右键点击此电脑→管理→设备管理器看端口(COM和LPT)下面有没有USB-SERIAL CH340之类的条目。如果没有看其他设备里有没有一个带黄色感叹号的未知设备。如果有90%就是驱动问题。去正规渠道下载CH340驱动可以用芯片厂商沁恒的官方驱动或者开发板卖家提供的驱动包安装时注意把杀毒软件临时关掉装完重启电脑。驱动装好之后重新插拔USB设备管理器里出现USB-SERIAL CH340COMxx是一个数字。这时候再去Mixly里选端口就能看到了。还有一个经验同一个USB口这次插是COM3下次插可能变成COM4这是正常的。上传代码的时候一定要重新确认Mixly里选的端口和系统当前分配的端口一致。2.3 初始化设置与上传流程硬件驱动解决之后打开Mixly做两件事在右上角主板类型里选择Arduino/Genuino Uno如果你用的是其他板子就选对应的型号。在端口下拉列表里选择刚识别到的COM口。然后随便拖一个积木进去点上传按钮第一次上传的时候Mixly会自动编译把图形化积木翻译成C代码再烧录进开发板。整个过程可能要等十几秒甚至半分多钟看到底部提示上传成功就说明环境完全通了。环境通畅的标志性动作就是在Mixly里面拖一个LED灯闪烁的积木传上去如果板载LED一般标着L开始一闪一闪你的整个链路就全通了。别急着上超声波先确认这一层后面才能安心做项目。3. 硬件接线引脚怎么选为什么这么接3.1 材料清单做这个项目需要的材料很少非常适合入门Arduino Uno开发板一块HC-SR04超声波模块一个LED灯一个颜色随意红色绿色都行220Ω或330Ω电阻一个面包板一块公对公杜邦线若干USB数据线一根3.2 超声波模块接线HC-SR04模块上四个引脚分别是VCC、TRIG、ECHO、GND。接线非常直接模块引脚接到哪里说明VCCArduino 5V超声波模块需要5V供电GNDArduino GND共地是必须的所有信号都要有共同参考点TRIGArduino D8数字口8用来发送触发脉冲ECHOArduino D9数字口9用来接收回波信号引脚为什么选D8和D9其实这两个数字口也不是唯一选择D2到D13都可以用。之所以建议挑中间靠后的数字引脚是因为后面如果做扩展比如加一个舵机舵机的信号线通常接在D9或D10这些支持PWM的引脚上把超声波占用在D8/D9做扩展时还能错开。另外我们不用模拟口A0~A5因为超声波需要的是精确的时间测量不应该跟模拟口的功能混在一起用标准的数字输入引脚最稳妥。这里有个图上不明显的细节必须提醒插面包板的时候HC-SR04的四个引脚之间间距是标准的2.54mm可以直接插在面包板上但要注意每一排的五个孔是连通的插的时候四个引脚要分别落在不同的列上千万不要两个引脚塞到同一列否则直接短路。这是新手玩面包板最常见的失误。3.3 LED模块与限流电阻的计算LED的正极接Arduino的D3引脚这个引脚支持PWM后面做呼吸灯扩展时能直接用负极串一个电阻再接地。电路上是这样的Arduino D3 → 电阻 → LED正极 → LED负极 → GND为什么一定要串电阻LED本质上是一个二极管导通后两端电压基本恒定红色LED约1.8~2.0V如果直接接5V电流会达到几十甚至上百毫安远超LED安全工作范围轻则发烫重则烧毁。串上电阻的目的就是限流。电阻值怎么算用欧姆定律。Arduino数字引脚输出高电平是5VLED导通压降按2V算剩下3V加在电阻上。想让工作电流在10~15mA这个安全范围R 3V ÷ 0.015A 200Ω。所以220Ω或者330Ω都合适没必要特别精确几十欧姆的误差对亮度影响不大。接线时注意LED的引脚长脚是正极接电阻那一侧短脚是负极接地。如果接反了灯也会亮但亮度会明显偏暗有些LED反向能承受的电压很低最直观的做法还是记住长正短负。4. Mixly积木搭建从空白到点亮LED的全过程4.1 积木的整体结构打开Mixly新建一个项目逻辑上分三大块初始化块、主循环块、变量。我用到的积木组合如下这个结构也是所有传感器控制类项目的通用骨架初始化部分setup块上电时运行一次设置引脚D8为OUTPUT模式TRIG引脚需要向外输出电压脉冲设置引脚D9为INPUT模式ECHO引脚需要读取外部信号设置引脚D3为OUTPUT模式控制LED初始化串口波特率9600用于把距离值发送到电脑调试主循环部分loop块不断重复运行给TRIG引脚一个低电平延时2微秒再高电平延时10微秒再低电平——这是模块要求的触发脉冲时序读取ECHO引脚的高电平持续时间微秒存到变量里用公式换算成厘米更新到distance变量判断distance小于30厘米是就D3输出高电平否则D3输出低电平延时100毫秒避免循环跑得太快导致测量值不稳定4.2 由超声波积木生成的代码长什么样Mixly在后台生成的C代码大致如下你可以随时点开Mixly的代码区对照const int trigPin 8; const int echoPin 9; const int ledPin 3; void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long duration pulseIn(echoPin, HIGH); float distance duration * 0.034 / 2; Serial.print(Distance: ); Serial.print(distance); Serial.println(cm); if (distance 30) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } delay(100); }这段代码里最核心的是pulseIn(echoPin, HIGH)它是Arduino内置函数专门用来测量引脚上高电平持续的时间单位是微秒。后面两行就是前面说的声速换算。整个程序的思路就是测一次距离→判断一次→控制一次LED→休息100毫秒→再测一次循环往复。4.3 串口监视器调试时最重要的眼睛代码里加了Serial.print输出距离值就是为了让你在电脑上看到超声波模块眼中的世界。点Mixly右上角的串口监视器按钮选择9600波特率就能看到不断刷新的距离数字。这一步特别重要。我强烈建议你第一次测试时先不要接LED控制纯看距离值变化。把手放在模块前面远近移动看串口监视器里的数字是不是跟着变。这个习惯能帮你把问题快速定位如果距离值都不对后面LED的控制逻辑再正确也是白搭。调试完逻辑后再把LED控制部分加回去整个项目就跑通了。这时候走廊感应灯的基本版本已经功能完整但实际用起来会发现不少小毛病接下来就是最考验经验的部分。5. 实测翻车现场距离乱跳和LED闪烁的排查这个项目不难但我做的时候依然翻过好几次车而且很多问题在实物上特别容易出现。把最常见的几个现象、原因和解决办法整理成一张表碰到可以对照查现象可能原因处理方式串口监视器距离值乱跳毫无规律杜邦线接触不良模块供电不足手挡在探头前面重新插紧杜邦线确认VCC是从5V取电而不是3.3V把手拿开测试距离值一直是0或者固定不变TRIG和ECHO接反ECHO引脚接触不良检查接线顺序TRIG接D8ECHO接D9重新插拔LED在阈值临界点快速闪烁阈值只有一个值距离在阈值附近徘徊引入滞回逻辑小于25cm点亮大于35cm才熄灭灯亮的响应有明显延迟循环里的延时太长超声波本身刷新率有限把延时降到50~100ms以内不要用delay(500)设备管理器看不到COM口CH340驱动问题USB线只充电不传数据按第2.2节的排查链路走一遍5.1 阈值临界抖动问题这个必须单独讲因为它是感应灯做出来之后最影响实际体验的点。假如你设的阈值是30厘米那当人手距离恰好停在30厘米附近时超声波每次测到的值在29.x和30.x之间跳来跳去LED就会一亮一灭地闪个不停。你到楼道里实际走一圈人的身体表面不是平整的衣服也会轻微晃动这个抖动几乎不可避免。工程上解决这个问题常用滞回比较。简单说把亮和灭的阈值设成两个不同的值距离小于25厘米点亮LED距离大于35厘米熄灭LED中间25~35厘米保持当前状态不变这样即使测量值有小的波动只要波动幅度不超过10厘米的区间灯就不会来回切换。实现方式就是用一个或两个如果积木嵌套在条件判断里把两个阈值区分开。这个思路在工业控制里叫滞回控制别看只是几个积木的事它让这个项目的稳定性提升了不止一个档次。5.2 为什么超声波测距不适合1cm以内的场景如果你把东西贴到超声波模块上会发现测出来的距离值反而不准了。原因是声波发射和接收之间有一个物理上的最小盲区HC-SR04的盲区通常在2~3厘米左右在这个范围内发射波束和回波会重叠模块无法分辨。所以如果用超声波做近距离精密测量2~3厘米以下就不可靠了。感应灯场景倒是无所谓人体尺度至少都是几十厘米起步完全在有效测量范围内。另外一点要注意的是探测角度。HC-SR04的探测波束大约是15度左右的锥形正前方对准了测量最准。安装时探头的朝向一定要对准人走过来的方向如果是倾斜安装测出来的距离会比实际直线距离偏大一点点不过对小项目来说影响可以忽略。5.3 两个超声波模块会互相干扰做进阶项目时如果你同时用了两个超声波模块而且它们的发射头正好对着彼此你会发现距离值各种乱飞。这是因为一模块发出的40kHz声波被另一个模块的接收头收到了它以为那是自己的回声。解决办法一是错开触发时间不要让两个模块同一时刻测量二是物理上把两个模块隔开。这个问题在本项目里还遇不到但如果你后面做避障小车前左前右各一个探头就需要考虑这个点了。6. 从会亮到好玩进阶扩展与底层移植思路基础版做完之后这项目就成了一个很好的平台往上加功能一加一个准而且每一步都有清晰的逻辑关系。6.1 多级距离控制LED亮度之前只能控制LED亮灭是因为数字输出只有高和低两个状态。想实现走近更亮、走远变暗的渐变效果把LED接到D3这种支持PWM的引脚上就能办到。PWM不是真的输出电压高低变化而是通过快速切换通断让LED产生不同亮度的视觉感受代码里体现为0~255的值。实现思路是把测得的距离映射到0~255的PWM值比如距离0~50厘米对应亮度255~0越近越亮超过50厘米就熄灭。Mixly里可以用算术积木把距离值做一个线性映射拖起来也算简单。做完之后这个灯就有了真正的感应质感。6.2 让超声波控制舵机感应垃圾桶雏形LED换成舵机逻辑基本一模一样的思路只是执行器变了舵机根据距离值转动不同角度。最常见的例子是感应垃圾桶——手靠近到一定距离时舵机转过去把盖子打开手离开几秒后舵机关上。接线时舵机的橙黄色信号线接到支持PWM的引脚比如D9红色线接5V棕色线接GND它的控制本质是把距离判断换成了角度赋值其余结构和本项目完全一致。6.3 加一个人体红外传感器组成双保险超声波的一个弱点是没法区分什么是人。纸箱飘过来它也测距离窗帘被风吹动也测距离都可能导致灯误亮。改进的办法是用人体红外传感器PIR先判断有没有人再通过超声波判断距离有多近两个条件都满足才亮灯。逻辑上变成且的关系误触发率能大幅降低。这个扩展可以让项目从玩具变成真正能放到家里的产品级方案。6.4 同样的逻辑换到单片机上怎么做有朋友问过玩熟了Mixly之后想接触更底层的开发或者手里有STM32、89C51的开发板那这套逻辑还能不能用。答案是核心思路完全一样只是实现方式从图形化积木变成了寄存器操作或标准库函数LED点亮是所有单片机最简单经典的GPIO输出实验89C51用P1 0x00这类语句就可以控制STM32的超声波测距则是经典的输入捕获应用用定时器捕获ECHO引脚高电平时间再按同一个公式换算距离逻辑判断层面的阈值比较在任何语言里都是if语句。从Mixly项目切到单片机不变的是对硬件时序的理解和对测量→判断→执行这个框架的把握。变的是写代码的姿势而已。我个人实际做下来的体会是这类传感器小项目真正的门槛往往不在把代码跑通而在把数据测准、让执行稳定。用Mixly的最大价值是能让你把注意力从语法上解放出来集中精力去解决距离跳变、临界抖动、阈值划分这些更本质的问题。等你把这些概念都吃透了再回头看那段自动生成的C代码会发现每一行都顺理成章完全不需要死记硬背。最后再分享一个小技巧安装超声波模块的时候别让它悬空戳着最好用热熔胶把它固定在外壳或者支架上正面两个圆形换能器保持清洁、不要有遮挡。很多人做完了灯一直乱亮乱灭检查半天代码没问题最后发现是模块放歪了或者被标签贴纸挡了一半。硬件固定结实了软件才能安心调。这个项目做完之后你手里其实就有了一套非常通用的传感器控制模板换个传感器、换个执行器思路都是通的。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。